Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(78)

Side by Side Diff: pkg/compiler/lib/src/js_backend/no_such_method_registry.dart

Issue 2814453005: Merge CommonElements and BackendHelpers! (Closed)
Patch Set: comments and re-merge, take two Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 import '../common.dart'; 5 import '../common.dart';
6 import '../common_elements.dart' show CommonElements;
6 import '../common/names.dart' show Identifiers, Names, Selectors; 7 import '../common/names.dart' show Identifiers, Names, Selectors;
7 import '../elements/elements.dart'; 8 import '../elements/elements.dart';
8 import '../elements/entities.dart'; 9 import '../elements/entities.dart';
9 import '../types/types.dart'; 10 import '../types/types.dart';
10 import '../tree/tree.dart'; 11 import '../tree/tree.dart';
11 import 'backend_helpers.dart';
12 12
13 /** 13 /**
14 * Categorizes `noSuchMethod` implementations. 14 * Categorizes `noSuchMethod` implementations.
15 * 15 *
16 * If user code includes `noSuchMethod` implementations, type inference is 16 * If user code includes `noSuchMethod` implementations, type inference is
17 * hindered because (for instance) any selector where the type of the 17 * hindered because (for instance) any selector where the type of the
18 * receiver is not known all implementations of `noSuchMethod` must be taken 18 * receiver is not known all implementations of `noSuchMethod` must be taken
19 * into account when inferring the return type. 19 * into account when inferring the return type.
20 * 20 *
21 * The situation can be ameliorated with some heuristics for disregarding some 21 * The situation can be ameliorated with some heuristics for disregarding some
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 62
63 /// The implementations that fall into category D1 63 /// The implementations that fall into category D1
64 final Set<FunctionEntity> complexNoReturnImpls = new Set<FunctionEntity>(); 64 final Set<FunctionEntity> complexNoReturnImpls = new Set<FunctionEntity>();
65 65
66 /// The implementations that fall into category D2 66 /// The implementations that fall into category D2
67 final Set<FunctionEntity> complexReturningImpls = new Set<FunctionEntity>(); 67 final Set<FunctionEntity> complexReturningImpls = new Set<FunctionEntity>();
68 68
69 /// The implementations that have not yet been categorized. 69 /// The implementations that have not yet been categorized.
70 final Set<FunctionEntity> _uncategorizedImpls = new Set<FunctionEntity>(); 70 final Set<FunctionEntity> _uncategorizedImpls = new Set<FunctionEntity>();
71 71
72 final BackendHelpers _helpers; 72 final CommonElements _commonElements;
73 final NoSuchMethodResolver _resolver; 73 final NoSuchMethodResolver _resolver;
74 74
75 NoSuchMethodRegistry(this._helpers, this._resolver); 75 NoSuchMethodRegistry(this._commonElements, this._resolver);
76 76
77 bool get hasThrowingNoSuchMethod => throwingImpls.isNotEmpty; 77 bool get hasThrowingNoSuchMethod => throwingImpls.isNotEmpty;
78 bool get hasComplexNoSuchMethod => otherImpls.isNotEmpty; 78 bool get hasComplexNoSuchMethod => otherImpls.isNotEmpty;
79 79
80 void registerNoSuchMethod(FunctionEntity noSuchMethodElement) { 80 void registerNoSuchMethod(FunctionEntity noSuchMethodElement) {
81 _uncategorizedImpls.add(noSuchMethodElement); 81 _uncategorizedImpls.add(noSuchMethodElement);
82 } 82 }
83 83
84 void onQueueEmpty() { 84 void onQueueEmpty() {
85 _uncategorizedImpls.forEach(_categorizeImpl); 85 _uncategorizedImpls.forEach(_categorizeImpl);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
139 if (otherImpls.contains(element)) { 139 if (otherImpls.contains(element)) {
140 return NsmCategory.OTHER; 140 return NsmCategory.OTHER;
141 } 141 }
142 if (notApplicableImpls.contains(element)) { 142 if (notApplicableImpls.contains(element)) {
143 return NsmCategory.NOT_APPLICABLE; 143 return NsmCategory.NOT_APPLICABLE;
144 } 144 }
145 if (!Selectors.noSuchMethod_.signatureApplies(element)) { 145 if (!Selectors.noSuchMethod_.signatureApplies(element)) {
146 notApplicableImpls.add(element); 146 notApplicableImpls.add(element);
147 return NsmCategory.NOT_APPLICABLE; 147 return NsmCategory.NOT_APPLICABLE;
148 } 148 }
149 if (_helpers.isDefaultNoSuchMethodImplementation(element)) { 149 if (_commonElements.isDefaultNoSuchMethodImplementation(element)) {
150 defaultImpls.add(element); 150 defaultImpls.add(element);
151 return NsmCategory.DEFAULT; 151 return NsmCategory.DEFAULT;
152 } else if (_resolver.hasForwardingSyntax(element)) { 152 } else if (_resolver.hasForwardingSyntax(element)) {
153 // If the implementation is 'noSuchMethod(x) => super.noSuchMethod(x);' 153 // If the implementation is 'noSuchMethod(x) => super.noSuchMethod(x);'
154 // then it is in the same category as the super call. 154 // then it is in the same category as the super call.
155 FunctionEntity superCall = _resolver.getSuperNoSuchMethod(element); 155 FunctionEntity superCall = _resolver.getSuperNoSuchMethod(element);
156 NsmCategory category = _categorizeImpl(superCall); 156 NsmCategory category = _categorizeImpl(superCall);
157 switch (category) { 157 switch (category) {
158 case NsmCategory.DEFAULT: 158 case NsmCategory.DEFAULT:
159 defaultImpls.add(element); 159 defaultImpls.add(element);
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
281 return stmt.expression is Throw; 281 return stmt.expression is Throw;
282 } 282 }
283 } 283 }
284 return false; 284 return false;
285 } 285 }
286 286
287 MethodElement getSuperNoSuchMethod(MethodElement method) { 287 MethodElement getSuperNoSuchMethod(MethodElement method) {
288 return method.enclosingClass.lookupSuperByName(Names.noSuchMethod_); 288 return method.enclosingClass.lookupSuperByName(Names.noSuchMethod_);
289 } 289 }
290 } 290 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/js_backend/namer.dart ('k') | pkg/compiler/lib/src/js_backend/resolution_listener.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698