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 |
(...skipping 495 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
506 } | 506 } |
507 } | 507 } |
508 | 508 |
509 /** | 509 /** |
510 * Load and resolve the supertypes of [cls]. | 510 * Load and resolve the supertypes of [cls]. |
511 * | 511 * |
512 * Warning: do not call this method directly. It should only be | 512 * Warning: do not call this method directly. It should only be |
513 * called by [resolveClass] and [ClassSupertypeResolver]. | 513 * called by [resolveClass] and [ClassSupertypeResolver]. |
514 */ | 514 */ |
515 void loadSupertypes(BaseClassElementX cls, Spannable from) { | 515 void loadSupertypes(BaseClassElementX cls, Spannable from) { |
516 reporter.withCurrentElement(cls, () => measure(() { | 516 measure(() { |
517 if (cls.supertypeLoadState == STATE_DONE) return; | 517 if (cls.supertypeLoadState == STATE_DONE) return; |
518 if (cls.supertypeLoadState == STATE_STARTED) { | 518 if (cls.supertypeLoadState == STATE_STARTED) { |
519 reporter.reportErrorMessage( | 519 reporter.reportErrorMessage( |
520 from, | 520 from, |
521 MessageKind.CYCLIC_CLASS_HIERARCHY, | 521 MessageKind.CYCLIC_CLASS_HIERARCHY, |
522 {'className': cls.name}); | 522 {'className': cls.name}); |
523 cls.supertypeLoadState = STATE_DONE; | 523 cls.supertypeLoadState = STATE_DONE; |
524 cls.hasIncompleteHierarchy = true; | 524 cls.hasIncompleteHierarchy = true; |
525 cls.allSupertypesAndSelf = | 525 cls.allSupertypesAndSelf = |
526 coreClasses.objectClass.allSupertypesAndSelf.extendClass( | 526 coreClasses.objectClass.allSupertypesAndSelf.extendClass( |
527 cls.computeType(resolution)); | 527 cls.computeType(resolution)); |
528 cls.supertype = cls.allSupertypes.head; | 528 cls.supertype = cls.allSupertypes.head; |
529 assert(invariant(from, cls.supertype != null, | 529 assert(invariant(from, cls.supertype != null, |
530 message: 'Missing supertype on cyclic class $cls.')); | 530 message: 'Missing supertype on cyclic class $cls.')); |
531 cls.interfaces = const Link<DartType>(); | 531 cls.interfaces = const Link<DartType>(); |
532 return; | 532 return; |
533 } | 533 } |
534 cls.supertypeLoadState = STATE_STARTED; | 534 cls.supertypeLoadState = STATE_STARTED; |
535 reporter.withCurrentElement(cls, () { | 535 reporter.withCurrentElement(cls, () { |
536 // TODO(ahe): Cache the node in cls. | 536 // TODO(ahe): Cache the node in cls. |
537 cls.parseNode(parsing).accept( | 537 cls.parseNode(parsing).accept( |
538 new ClassSupertypeResolver(compiler, cls)); | 538 new ClassSupertypeResolver(compiler, cls)); |
539 if (cls.supertypeLoadState != STATE_DONE) { | 539 if (cls.supertypeLoadState != STATE_DONE) { |
540 cls.supertypeLoadState = STATE_DONE; | 540 cls.supertypeLoadState = STATE_DONE; |
541 } | 541 } |
542 }); | 542 }); |
543 })); | 543 }); |
544 } | 544 } |
545 | 545 |
546 // TODO(johnniwinther): Remove this queue when resolution has been split into | 546 // TODO(johnniwinther): Remove this queue when resolution has been split into |
547 // syntax and semantic resolution. | 547 // syntax and semantic resolution. |
548 TypeDeclarationElement currentlyResolvedTypeDeclaration; | 548 TypeDeclarationElement currentlyResolvedTypeDeclaration; |
549 Queue<ClassElement> pendingClassesToBeResolved = new Queue<ClassElement>(); | 549 Queue<ClassElement> pendingClassesToBeResolved = new Queue<ClassElement>(); |
550 Queue<ClassElement> pendingClassesToBePostProcessed = | 550 Queue<ClassElement> pendingClassesToBePostProcessed = |
551 new Queue<ClassElement>(); | 551 new Queue<ClassElement>(); |
552 | 552 |
553 /// Resolve [element] using [resolveTypeDeclaration]. | 553 /// Resolve [element] using [resolveTypeDeclaration]. |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
756 } | 756 } |
757 } | 757 } |
758 }); | 758 }); |
759 } | 759 } |
760 | 760 |
761 void checkMixinSuperUses(TreeElements resolutionTree, | 761 void checkMixinSuperUses(TreeElements resolutionTree, |
762 MixinApplicationElement mixinApplication, | 762 MixinApplicationElement mixinApplication, |
763 ClassElement mixin) { | 763 ClassElement mixin) { |
764 // TODO(johnniwinther): Avoid the use of [TreeElements] here. | 764 // TODO(johnniwinther): Avoid the use of [TreeElements] here. |
765 if (resolutionTree == null) return; | 765 if (resolutionTree == null) return; |
766 Iterable<Node> superUses = resolutionTree.superUses; | 766 Iterable<SourceSpan> superUses = resolutionTree.superUses; |
767 if (superUses.isEmpty) return; | 767 if (superUses.isEmpty) return; |
768 DiagnosticMessage error = reporter.createMessage( | 768 DiagnosticMessage error = reporter.createMessage( |
769 mixinApplication, | 769 mixinApplication, |
770 MessageKind.ILLEGAL_MIXIN_WITH_SUPER, | 770 MessageKind.ILLEGAL_MIXIN_WITH_SUPER, |
771 {'className': mixin.name}); | 771 {'className': mixin.name}); |
772 // Show the user the problematic uses of 'super' in the mixin. | 772 // Show the user the problematic uses of 'super' in the mixin. |
773 List<DiagnosticMessage> infos = <DiagnosticMessage>[]; | 773 List<DiagnosticMessage> infos = <DiagnosticMessage>[]; |
774 for (Node use in superUses) { | 774 for (SourceSpan use in superUses) { |
775 infos.add(reporter.createMessage( | 775 infos.add(reporter.createMessage( |
776 use, | 776 use, |
777 MessageKind.ILLEGAL_MIXIN_SUPER_USE)); | 777 MessageKind.ILLEGAL_MIXIN_SUPER_USE)); |
778 } | 778 } |
779 reporter.reportError(error, infos); | 779 reporter.reportError(error, infos); |
780 } | 780 } |
781 | 781 |
782 void checkClassMembers(ClassElement cls) { | 782 void checkClassMembers(ClassElement cls) { |
783 assert(invariant(cls, cls.isDeclaration)); | 783 assert(invariant(cls, cls.isDeclaration)); |
784 if (cls.isObject) return; | 784 if (cls.isObject) return; |
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1039 new TypedefResolverVisitor(compiler, element, registry); | 1039 new TypedefResolverVisitor(compiler, element, registry); |
1040 visitor.visit(node); | 1040 visitor.visit(node); |
1041 element.resolutionState = STATE_DONE; | 1041 element.resolutionState = STATE_DONE; |
1042 return registry.worldImpact; | 1042 return registry.worldImpact; |
1043 }); | 1043 }); |
1044 }); | 1044 }); |
1045 }); | 1045 }); |
1046 } | 1046 } |
1047 | 1047 |
1048 void resolveMetadataAnnotation(MetadataAnnotationX annotation) { | 1048 void resolveMetadataAnnotation(MetadataAnnotationX annotation) { |
1049 reporter.withCurrentElement(annotation.annotatedElement, () => measure(() { | 1049 reporter.withCurrentElement(annotation.annotatedElement.enclosingElement, () => measure(() { |
Siggi Cherem (dart-lang)
2015/12/14 22:54:44
nit => 80 col
Johnni Winther
2015/12/15 10:28:01
Done.
| |
1050 assert(annotation.resolutionState == STATE_NOT_STARTED); | 1050 assert(annotation.resolutionState == STATE_NOT_STARTED); |
1051 annotation.resolutionState = STATE_STARTED; | 1051 annotation.resolutionState = STATE_STARTED; |
1052 | 1052 |
1053 Node node = annotation.parseNode(parsing); | 1053 Node node = annotation.parseNode(parsing); |
1054 Element annotatedElement = annotation.annotatedElement; | 1054 Element annotatedElement = annotation.annotatedElement; |
1055 AnalyzableElement context = annotatedElement.analyzableElement; | 1055 AnalyzableElement context = annotatedElement.analyzableElement; |
1056 ClassElement classElement = annotatedElement.enclosingClass; | 1056 ClassElement classElement = annotatedElement.enclosingClass; |
1057 if (classElement != null) { | 1057 if (classElement != null) { |
1058 // The annotation is resolved in the scope of [classElement]. | 1058 // The annotation is resolved in the scope of [classElement]. |
1059 classElement.ensureResolved(resolution); | 1059 classElement.ensureResolved(resolution); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1127 TreeElements get treeElements { | 1127 TreeElements get treeElements { |
1128 assert(invariant(this, _treeElements !=null, | 1128 assert(invariant(this, _treeElements !=null, |
1129 message: "TreeElements have not been computed for $this.")); | 1129 message: "TreeElements have not been computed for $this.")); |
1130 return _treeElements; | 1130 return _treeElements; |
1131 } | 1131 } |
1132 | 1132 |
1133 void reuseElement() { | 1133 void reuseElement() { |
1134 _treeElements = null; | 1134 _treeElements = null; |
1135 } | 1135 } |
1136 } | 1136 } |
OLD | NEW |