OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 library dart2js.resolution; | 5 library dart2js.resolution; |
6 | 6 |
7 import 'dart:collection' show Queue; | 7 import 'dart:collection' show Queue; |
8 | 8 |
9 import '../common.dart'; | 9 import '../common.dart'; |
10 import '../common/names.dart' show | 10 import '../common/names.dart' show |
11 Identifiers; | 11 Identifiers; |
12 import '../common/resolution.dart' show | 12 import '../common/resolution.dart' show |
13 Parsing, | 13 Parsing, |
14 Resolution, | 14 Resolution, |
15 ResolutionImpact; | 15 ResolutionImpact; |
16 import '../common/tasks.dart' show | 16 import '../common/tasks.dart' show |
17 CompilerTask, | 17 CompilerTask, |
18 DeferredAction; | 18 DeferredAction; |
19 import '../compiler.dart' show | 19 import '../compiler.dart' show |
20 Compiler; | 20 Compiler; |
21 import '../compile_time_constants.dart' show | 21 import '../compile_time_constants.dart' show |
22 ConstantCompiler; | 22 ConstantCompiler; |
23 import '../constants/values.dart' show | 23 import '../constants/values.dart' show |
24 ConstantValue; | 24 ConstantValue; |
25 import '../core_types.dart' show | 25 import '../core_types.dart' show |
| 26 CoreClasses, |
26 CoreTypes; | 27 CoreTypes; |
27 import '../dart_types.dart'; | 28 import '../dart_types.dart'; |
28 import '../elements/elements.dart'; | 29 import '../elements/elements.dart'; |
29 import '../elements/modelx.dart' show | 30 import '../elements/modelx.dart' show |
30 BaseClassElementX, | 31 BaseClassElementX, |
31 BaseFunctionElementX, | 32 BaseFunctionElementX, |
32 ConstructorElementX, | 33 ConstructorElementX, |
33 FieldElementX, | 34 FieldElementX, |
34 FunctionElementX, | 35 FunctionElementX, |
35 GetterElementX, | 36 GetterElementX, |
(...skipping 29 matching lines...) Expand all Loading... |
65 final ConstantCompiler constantCompiler; | 66 final ConstantCompiler constantCompiler; |
66 | 67 |
67 ResolverTask(Compiler compiler, this.constantCompiler) : super(compiler); | 68 ResolverTask(Compiler compiler, this.constantCompiler) : super(compiler); |
68 | 69 |
69 String get name => 'Resolver'; | 70 String get name => 'Resolver'; |
70 | 71 |
71 Resolution get resolution => compiler.resolution; | 72 Resolution get resolution => compiler.resolution; |
72 | 73 |
73 Parsing get parsing => compiler.parsing; | 74 Parsing get parsing => compiler.parsing; |
74 | 75 |
| 76 CoreClasses get coreClasses => compiler.coreClasses; |
| 77 |
75 CoreTypes get coreTypes => compiler.coreTypes; | 78 CoreTypes get coreTypes => compiler.coreTypes; |
76 | 79 |
77 ResolutionImpact resolve(Element element) { | 80 ResolutionImpact resolve(Element element) { |
78 return measure(() { | 81 return measure(() { |
79 if (Elements.isMalformed(element)) { | 82 if (Elements.isMalformed(element)) { |
80 // TODO(johnniwinther): Add a predicate for this. | 83 // TODO(johnniwinther): Add a predicate for this. |
81 assert(invariant(element, element is! ErroneousElement, | 84 assert(invariant(element, element is! ErroneousElement, |
82 message: "Element $element expected to have parse errors.")); | 85 message: "Element $element expected to have parse errors.")); |
83 _ensureTreeElements(element); | 86 _ensureTreeElements(element); |
84 return const ResolutionImpact(); | 87 return const ResolutionImpact(); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 seen.add(redirection); | 137 seen.add(redirection); |
135 redirection = resolver.visitor.resolveConstructorRedirection(redirection); | 138 redirection = resolver.visitor.resolveConstructorRedirection(redirection); |
136 } | 139 } |
137 } | 140 } |
138 | 141 |
139 static void processAsyncMarker(Compiler compiler, | 142 static void processAsyncMarker(Compiler compiler, |
140 BaseFunctionElementX element, | 143 BaseFunctionElementX element, |
141 ResolutionRegistry registry) { | 144 ResolutionRegistry registry) { |
142 DiagnosticReporter reporter = compiler.reporter; | 145 DiagnosticReporter reporter = compiler.reporter; |
143 Resolution resolution = compiler.resolution; | 146 Resolution resolution = compiler.resolution; |
| 147 CoreClasses coreClasses = compiler.coreClasses; |
144 FunctionExpression functionExpression = element.node; | 148 FunctionExpression functionExpression = element.node; |
145 AsyncModifier asyncModifier = functionExpression.asyncModifier; | 149 AsyncModifier asyncModifier = functionExpression.asyncModifier; |
146 if (asyncModifier != null) { | 150 if (asyncModifier != null) { |
147 | 151 |
148 if (asyncModifier.isAsynchronous) { | 152 if (asyncModifier.isAsynchronous) { |
149 element.asyncMarker = asyncModifier.isYielding | 153 element.asyncMarker = asyncModifier.isYielding |
150 ? AsyncMarker.ASYNC_STAR : AsyncMarker.ASYNC; | 154 ? AsyncMarker.ASYNC_STAR : AsyncMarker.ASYNC; |
151 } else { | 155 } else { |
152 element.asyncMarker = AsyncMarker.SYNC_STAR; | 156 element.asyncMarker = AsyncMarker.SYNC_STAR; |
153 } | 157 } |
(...skipping 19 matching lines...) Expand all Loading... |
173 element.asyncMarker.isYielding) { | 177 element.asyncMarker.isYielding) { |
174 reporter.reportErrorMessage( | 178 reporter.reportErrorMessage( |
175 asyncModifier, | 179 asyncModifier, |
176 MessageKind.YIELDING_MODIFIER_ON_ARROW_BODY, | 180 MessageKind.YIELDING_MODIFIER_ON_ARROW_BODY, |
177 {'modifier': element.asyncMarker}); | 181 {'modifier': element.asyncMarker}); |
178 } | 182 } |
179 } | 183 } |
180 registry.registerAsyncMarker(element); | 184 registry.registerAsyncMarker(element); |
181 switch (element.asyncMarker) { | 185 switch (element.asyncMarker) { |
182 case AsyncMarker.ASYNC: | 186 case AsyncMarker.ASYNC: |
183 compiler.futureClass.ensureResolved(resolution); | 187 coreClasses.futureClass.ensureResolved(resolution); |
184 break; | 188 break; |
185 case AsyncMarker.ASYNC_STAR: | 189 case AsyncMarker.ASYNC_STAR: |
186 compiler.streamClass.ensureResolved(resolution); | 190 coreClasses.streamClass.ensureResolved(resolution); |
187 break; | 191 break; |
188 case AsyncMarker.SYNC_STAR: | 192 case AsyncMarker.SYNC_STAR: |
189 compiler.iterableClass.ensureResolved(resolution); | 193 coreClasses.iterableClass.ensureResolved(resolution); |
190 break; | 194 break; |
191 } | 195 } |
192 } | 196 } |
193 } | 197 } |
194 | 198 |
195 bool _isNativeClassOrExtendsNativeClass(ClassElement classElement) { | 199 bool _isNativeClassOrExtendsNativeClass(ClassElement classElement) { |
196 assert(classElement != null); | 200 assert(classElement != null); |
197 while (classElement != null) { | 201 while (classElement != null) { |
198 if (compiler.backend.isNative(classElement)) return true; | 202 if (compiler.backend.isNative(classElement)) return true; |
199 classElement = classElement.superclass; | 203 classElement = classElement.superclass; |
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
489 reporter.withCurrentElement(cls, () => measure(() { | 493 reporter.withCurrentElement(cls, () => measure(() { |
490 if (cls.supertypeLoadState == STATE_DONE) return; | 494 if (cls.supertypeLoadState == STATE_DONE) return; |
491 if (cls.supertypeLoadState == STATE_STARTED) { | 495 if (cls.supertypeLoadState == STATE_STARTED) { |
492 reporter.reportErrorMessage( | 496 reporter.reportErrorMessage( |
493 from, | 497 from, |
494 MessageKind.CYCLIC_CLASS_HIERARCHY, | 498 MessageKind.CYCLIC_CLASS_HIERARCHY, |
495 {'className': cls.name}); | 499 {'className': cls.name}); |
496 cls.supertypeLoadState = STATE_DONE; | 500 cls.supertypeLoadState = STATE_DONE; |
497 cls.hasIncompleteHierarchy = true; | 501 cls.hasIncompleteHierarchy = true; |
498 cls.allSupertypesAndSelf = | 502 cls.allSupertypesAndSelf = |
499 compiler.objectClass.allSupertypesAndSelf.extendClass( | 503 coreClasses.objectClass.allSupertypesAndSelf.extendClass( |
500 cls.computeType(resolution)); | 504 cls.computeType(resolution)); |
501 cls.supertype = cls.allSupertypes.head; | 505 cls.supertype = cls.allSupertypes.head; |
502 assert(invariant(from, cls.supertype != null, | 506 assert(invariant(from, cls.supertype != null, |
503 message: 'Missing supertype on cyclic class $cls.')); | 507 message: 'Missing supertype on cyclic class $cls.')); |
504 cls.interfaces = const Link<DartType>(); | 508 cls.interfaces = const Link<DartType>(); |
505 return; | 509 return; |
506 } | 510 } |
507 cls.supertypeLoadState = STATE_STARTED; | 511 cls.supertypeLoadState = STATE_STARTED; |
508 reporter.withCurrentElement(cls, () { | 512 reporter.withCurrentElement(cls, () { |
509 // TODO(ahe): Cache the node in cls. | 513 // TODO(ahe): Cache the node in cls. |
(...skipping 24 matching lines...) Expand all Loading... |
534 resolveTypeDeclaration()) { | 538 resolveTypeDeclaration()) { |
535 return reporter.withCurrentElement(element, () { | 539 return reporter.withCurrentElement(element, () { |
536 return measure(() { | 540 return measure(() { |
537 TypeDeclarationElement previousResolvedTypeDeclaration = | 541 TypeDeclarationElement previousResolvedTypeDeclaration = |
538 currentlyResolvedTypeDeclaration; | 542 currentlyResolvedTypeDeclaration; |
539 currentlyResolvedTypeDeclaration = element; | 543 currentlyResolvedTypeDeclaration = element; |
540 var result = resolveTypeDeclaration(); | 544 var result = resolveTypeDeclaration(); |
541 if (previousResolvedTypeDeclaration == null) { | 545 if (previousResolvedTypeDeclaration == null) { |
542 do { | 546 do { |
543 while (!pendingClassesToBeResolved.isEmpty) { | 547 while (!pendingClassesToBeResolved.isEmpty) { |
544 pendingClassesToBeResolved.removeFirst().ensureResolved(resolution
); | 548 pendingClassesToBeResolved.removeFirst() |
| 549 .ensureResolved(resolution); |
545 } | 550 } |
546 while (!pendingClassesToBePostProcessed.isEmpty) { | 551 while (!pendingClassesToBePostProcessed.isEmpty) { |
547 _postProcessClassElement( | 552 _postProcessClassElement( |
548 pendingClassesToBePostProcessed.removeFirst()); | 553 pendingClassesToBePostProcessed.removeFirst()); |
549 } | 554 } |
550 } while (!pendingClassesToBeResolved.isEmpty); | 555 } while (!pendingClassesToBeResolved.isEmpty); |
551 assert(pendingClassesToBeResolved.isEmpty); | 556 assert(pendingClassesToBeResolved.isEmpty); |
552 assert(pendingClassesToBePostProcessed.isEmpty); | 557 assert(pendingClassesToBePostProcessed.isEmpty); |
553 } | 558 } |
554 currentlyResolvedTypeDeclaration = previousResolvedTypeDeclaration; | 559 currentlyResolvedTypeDeclaration = previousResolvedTypeDeclaration; |
(...skipping 523 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1078 TreeElements get treeElements { | 1083 TreeElements get treeElements { |
1079 assert(invariant(this, _treeElements !=null, | 1084 assert(invariant(this, _treeElements !=null, |
1080 message: "TreeElements have not been computed for $this.")); | 1085 message: "TreeElements have not been computed for $this.")); |
1081 return _treeElements; | 1086 return _treeElements; |
1082 } | 1087 } |
1083 | 1088 |
1084 void reuseElement() { | 1089 void reuseElement() { |
1085 _treeElements = null; | 1090 _treeElements = null; |
1086 } | 1091 } |
1087 } | 1092 } |
OLD | NEW |