OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 elements.modelx; | 5 library elements.modelx; |
6 | 6 |
7 import '../common/resolution.dart' show | 7 import '../common/resolution.dart' show |
8 Resolution, | 8 Resolution, |
9 Parsing; | 9 Parsing; |
10 import '../compiler.dart' show | 10 import '../compiler.dart' show |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 final int hashCode = ++elementHashCode; | 64 final int hashCode = ++elementHashCode; |
65 List<MetadataAnnotation> metadataInternal; | 65 List<MetadataAnnotation> metadataInternal; |
66 | 66 |
67 ElementX(this.name, this.kind, this.enclosingElement) { | 67 ElementX(this.name, this.kind, this.enclosingElement) { |
68 assert(isErroneous || implementationLibrary != null); | 68 assert(isErroneous || implementationLibrary != null); |
69 } | 69 } |
70 | 70 |
71 Modifiers get modifiers => Modifiers.EMPTY; | 71 Modifiers get modifiers => Modifiers.EMPTY; |
72 | 72 |
73 Node parseNode(Parsing parsing) { | 73 Node parseNode(Parsing parsing) { |
74 parsing.listener.internalError(this, | 74 parsing.reporter.internalError(this, |
75 'parseNode not implemented on $this.'); | 75 'parseNode not implemented on $this.'); |
76 return null; | 76 return null; |
77 } | 77 } |
78 | 78 |
79 void set metadata(List<MetadataAnnotation> metadata) { | 79 void set metadata(List<MetadataAnnotation> metadata) { |
80 assert(metadataInternal == null); | 80 assert(metadataInternal == null); |
81 for (MetadataAnnotationX annotation in metadata) { | 81 for (MetadataAnnotationX annotation in metadata) { |
82 assert(annotation.annotatedElement == null); | 82 assert(annotation.annotatedElement == null); |
83 annotation.annotatedElement = this; | 83 annotation.annotatedElement = this; |
84 } | 84 } |
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
464 final WrappedMessage info; | 464 final WrappedMessage info; |
465 | 465 |
466 /// The element whose usage cause a warning. | 466 /// The element whose usage cause a warning. |
467 final Element wrappedElement; | 467 final Element wrappedElement; |
468 | 468 |
469 WarnOnUseElementX(WrappedMessage this.warning, WrappedMessage this.info, | 469 WarnOnUseElementX(WrappedMessage this.warning, WrappedMessage this.info, |
470 Element enclosingElement, Element wrappedElement) | 470 Element enclosingElement, Element wrappedElement) |
471 : this.wrappedElement = wrappedElement, | 471 : this.wrappedElement = wrappedElement, |
472 super(wrappedElement.name, ElementKind.WARN_ON_USE, enclosingElement); | 472 super(wrappedElement.name, ElementKind.WARN_ON_USE, enclosingElement); |
473 | 473 |
474 Element unwrap(DiagnosticListener listener, Spannable usageSpannable) { | 474 Element unwrap(DiagnosticReporter reporter, Spannable usageSpannable) { |
475 var unwrapped = wrappedElement; | 475 var unwrapped = wrappedElement; |
476 if (warning != null) { | 476 if (warning != null) { |
477 Spannable spannable = warning.spannable; | 477 Spannable spannable = warning.spannable; |
478 if (spannable == null) spannable = usageSpannable; | 478 if (spannable == null) spannable = usageSpannable; |
479 DiagnosticMessage warningMessage = listener.createMessage( | 479 DiagnosticMessage warningMessage = reporter.createMessage( |
480 spannable, warning.messageKind, warning.messageArguments); | 480 spannable, warning.messageKind, warning.messageArguments); |
481 List<DiagnosticMessage> infos = <DiagnosticMessage>[]; | 481 List<DiagnosticMessage> infos = <DiagnosticMessage>[]; |
482 if (info != null) { | 482 if (info != null) { |
483 Spannable spannable = info.spannable; | 483 Spannable spannable = info.spannable; |
484 if (spannable == null) spannable = usageSpannable; | 484 if (spannable == null) spannable = usageSpannable; |
485 infos.add(listener.createMessage( | 485 infos.add(reporter.createMessage( |
486 spannable, info.messageKind, info.messageArguments)); | 486 spannable, info.messageKind, info.messageArguments)); |
487 } | 487 } |
488 listener.reportWarning(warningMessage, infos); | 488 reporter.reportWarning(warningMessage, infos); |
489 } | 489 } |
490 if (unwrapped.isWarnOnUse) { | 490 if (unwrapped.isWarnOnUse) { |
491 unwrapped = unwrapped.unwrap(listener, usageSpannable); | 491 unwrapped = unwrapped.unwrap(reporter, usageSpannable); |
492 } | 492 } |
493 return unwrapped; | 493 return unwrapped; |
494 } | 494 } |
495 | 495 |
496 accept(ElementVisitor visitor, arg) { | 496 accept(ElementVisitor visitor, arg) { |
497 return visitor.visitWarnOnUseElement(this, arg); | 497 return visitor.visitWarnOnUseElement(this, arg); |
498 } | 498 } |
499 } | 499 } |
500 | 500 |
501 abstract class AmbiguousElementX extends ElementX implements AmbiguousElement { | 501 abstract class AmbiguousElementX extends ElementX implements AmbiguousElement { |
(...skipping 29 matching lines...) Expand all Loading... |
531 while (element.isAmbiguous) { | 531 while (element.isAmbiguous) { |
532 AmbiguousElement ambiguous = element; | 532 AmbiguousElement ambiguous = element; |
533 set.add(ambiguous.newElement); | 533 set.add(ambiguous.newElement); |
534 element = ambiguous.existingElement; | 534 element = ambiguous.existingElement; |
535 } | 535 } |
536 set.add(element); | 536 set.add(element); |
537 return set; | 537 return set; |
538 } | 538 } |
539 | 539 |
540 List<DiagnosticMessage> computeInfos(Element context, | 540 List<DiagnosticMessage> computeInfos(Element context, |
541 DiagnosticListener listener) { | 541 DiagnosticReporter reporter) { |
542 return const <DiagnosticMessage>[]; | 542 return const <DiagnosticMessage>[]; |
543 } | 543 } |
544 | 544 |
545 accept(ElementVisitor visitor, arg) { | 545 accept(ElementVisitor visitor, arg) { |
546 return visitor.visitAmbiguousElement(this, arg); | 546 return visitor.visitAmbiguousElement(this, arg); |
547 } | 547 } |
548 | 548 |
549 bool get isTopLevel => false; | 549 bool get isTopLevel => false; |
550 | 550 |
551 DynamicType get type => const DynamicType(); | 551 DynamicType get type => const DynamicType(); |
552 } | 552 } |
553 | 553 |
554 /// Element synthesized to diagnose an ambiguous import. | 554 /// Element synthesized to diagnose an ambiguous import. |
555 class AmbiguousImportX extends AmbiguousElementX { | 555 class AmbiguousImportX extends AmbiguousElementX { |
556 AmbiguousImportX( | 556 AmbiguousImportX( |
557 MessageKind messageKind, | 557 MessageKind messageKind, |
558 Map messageArguments, | 558 Map messageArguments, |
559 Element enclosingElement, Element existingElement, Element newElement) | 559 Element enclosingElement, Element existingElement, Element newElement) |
560 : super(messageKind, messageArguments, enclosingElement, existingElement, | 560 : super(messageKind, messageArguments, enclosingElement, existingElement, |
561 newElement); | 561 newElement); |
562 | 562 |
563 List<DiagnosticMessage> computeInfos( | 563 List<DiagnosticMessage> computeInfos( |
564 Element context, | 564 Element context, |
565 DiagnosticListener listener) { | 565 DiagnosticReporter reporter) { |
566 List<DiagnosticMessage> infos = <DiagnosticMessage>[]; | 566 List<DiagnosticMessage> infos = <DiagnosticMessage>[]; |
567 Setlet ambiguousElements = flatten(); | 567 Setlet ambiguousElements = flatten(); |
568 MessageKind code = (ambiguousElements.length == 1) | 568 MessageKind code = (ambiguousElements.length == 1) |
569 ? MessageKind.AMBIGUOUS_REEXPORT : MessageKind.AMBIGUOUS_LOCATION; | 569 ? MessageKind.AMBIGUOUS_REEXPORT : MessageKind.AMBIGUOUS_LOCATION; |
570 LibraryElementX importer = context.library; | 570 LibraryElementX importer = context.library; |
571 for (Element element in ambiguousElements) { | 571 for (Element element in ambiguousElements) { |
572 Map arguments = {'name': element.name}; | 572 Map arguments = {'name': element.name}; |
573 infos.add(listener.createMessage(element, code, arguments)); | 573 infos.add(reporter.createMessage(element, code, arguments)); |
574 listener.withCurrentElement(importer, () { | 574 reporter.withCurrentElement(importer, () { |
575 for (ImportElement import in importer.importers.getImports(element)) { | 575 for (ImportElement import in importer.importers.getImports(element)) { |
576 infos.add(listener.createMessage( | 576 infos.add(reporter.createMessage( |
577 import, MessageKind.IMPORTED_HERE, arguments)); | 577 import, MessageKind.IMPORTED_HERE, arguments)); |
578 } | 578 } |
579 }); | 579 }); |
580 } | 580 } |
581 return infos; | 581 return infos; |
582 } | 582 } |
583 } | 583 } |
584 | 584 |
585 /// Element synthesized to recover from a duplicated member of an element. | 585 /// Element synthesized to recover from a duplicated member of an element. |
586 class DuplicatedElementX extends AmbiguousElementX { | 586 class DuplicatedElementX extends AmbiguousElementX { |
(...skipping 10 matching lines...) Expand all Loading... |
597 class ScopeX { | 597 class ScopeX { |
598 final Map<String, Element> contents = new Map<String, Element>(); | 598 final Map<String, Element> contents = new Map<String, Element>(); |
599 | 599 |
600 bool get isEmpty => contents.isEmpty; | 600 bool get isEmpty => contents.isEmpty; |
601 Iterable<Element> get values => contents.values; | 601 Iterable<Element> get values => contents.values; |
602 | 602 |
603 Element lookup(String name) { | 603 Element lookup(String name) { |
604 return contents[name]; | 604 return contents[name]; |
605 } | 605 } |
606 | 606 |
607 void add(Element element, DiagnosticListener listener) { | 607 void add(Element element, DiagnosticReporter reporter) { |
608 String name = element.name; | 608 String name = element.name; |
609 if (element.isAccessor) { | 609 if (element.isAccessor) { |
610 addAccessor(element, contents[name], listener); | 610 addAccessor(element, contents[name], reporter); |
611 } else { | 611 } else { |
612 Element existing = contents.putIfAbsent(name, () => element); | 612 Element existing = contents.putIfAbsent(name, () => element); |
613 if (!identical(existing, element)) { | 613 if (!identical(existing, element)) { |
614 listener.reportError( | 614 reporter.reportError( |
615 listener.createMessage( | 615 reporter.createMessage( |
616 element, | 616 element, |
617 MessageKind.DUPLICATE_DEFINITION, | 617 MessageKind.DUPLICATE_DEFINITION, |
618 {'name': name}), | 618 {'name': name}), |
619 <DiagnosticMessage>[ | 619 <DiagnosticMessage>[ |
620 listener.createMessage( | 620 reporter.createMessage( |
621 existing, | 621 existing, |
622 MessageKind.EXISTING_DEFINITION, | 622 MessageKind.EXISTING_DEFINITION, |
623 {'name': name}), | 623 {'name': name}), |
624 ]); | 624 ]); |
625 } | 625 } |
626 } | 626 } |
627 } | 627 } |
628 | 628 |
629 /** | 629 /** |
630 * Adds a definition for an [accessor] (getter or setter) to a scope. | 630 * Adds a definition for an [accessor] (getter or setter) to a scope. |
631 * The definition binds to an abstract field that can hold both a getter | 631 * The definition binds to an abstract field that can hold both a getter |
632 * and a setter. | 632 * and a setter. |
633 * | 633 * |
634 * The abstract field is added once, for the first getter or setter, and | 634 * The abstract field is added once, for the first getter or setter, and |
635 * reused if the other one is also added. | 635 * reused if the other one is also added. |
636 * The abstract field should not be treated as a proper member of the | 636 * The abstract field should not be treated as a proper member of the |
637 * container, it's simply a way to return two results for one lookup. | 637 * container, it's simply a way to return two results for one lookup. |
638 * That is, the getter or setter does not have the abstract field as enclosing | 638 * That is, the getter or setter does not have the abstract field as enclosing |
639 * element, they are enclosed by the class or compilation unit, as is the | 639 * element, they are enclosed by the class or compilation unit, as is the |
640 * abstract field. | 640 * abstract field. |
641 */ | 641 */ |
642 void addAccessor(AccessorElementX accessor, | 642 void addAccessor(AccessorElementX accessor, |
643 Element existing, | 643 Element existing, |
644 DiagnosticListener listener) { | 644 DiagnosticReporter reporter) { |
645 void reportError(Element other) { | 645 void reportError(Element other) { |
646 listener.reportError( | 646 reporter.reportError( |
647 listener.createMessage( | 647 reporter.createMessage( |
648 accessor, | 648 accessor, |
649 MessageKind.DUPLICATE_DEFINITION, | 649 MessageKind.DUPLICATE_DEFINITION, |
650 {'name': accessor.name}), | 650 {'name': accessor.name}), |
651 <DiagnosticMessage>[ | 651 <DiagnosticMessage>[ |
652 listener.createMessage( | 652 reporter.createMessage( |
653 other, | 653 other, |
654 MessageKind.EXISTING_DEFINITION, | 654 MessageKind.EXISTING_DEFINITION, |
655 {'name': accessor.name}), | 655 {'name': accessor.name}), |
656 ]); | 656 ]); |
657 | 657 |
658 contents[accessor.name] = new DuplicatedElementX( | 658 contents[accessor.name] = new DuplicatedElementX( |
659 MessageKind.DUPLICATE_DEFINITION, {'name': accessor.name}, | 659 MessageKind.DUPLICATE_DEFINITION, {'name': accessor.name}, |
660 accessor.memberContext.enclosingElement, other, accessor); | 660 accessor.memberContext.enclosingElement, other, accessor); |
661 } | 661 } |
662 | 662 |
(...skipping 22 matching lines...) Expand all Loading... |
685 } else { | 685 } else { |
686 Element container = accessor.enclosingClassOrCompilationUnit; | 686 Element container = accessor.enclosingClassOrCompilationUnit; |
687 AbstractFieldElementX field = | 687 AbstractFieldElementX field = |
688 new AbstractFieldElementX(accessor.name, container); | 688 new AbstractFieldElementX(accessor.name, container); |
689 accessor.abstractField = field; | 689 accessor.abstractField = field; |
690 if (accessor.isGetter) { | 690 if (accessor.isGetter) { |
691 field.getter = accessor; | 691 field.getter = accessor; |
692 } else { | 692 } else { |
693 field.setter = accessor; | 693 field.setter = accessor; |
694 } | 694 } |
695 add(field, listener); | 695 add(field, reporter); |
696 } | 696 } |
697 } | 697 } |
698 } | 698 } |
699 | 699 |
700 class CompilationUnitElementX extends ElementX | 700 class CompilationUnitElementX extends ElementX |
701 with CompilationUnitElementCommon | 701 with CompilationUnitElementCommon |
702 implements CompilationUnitElement { | 702 implements CompilationUnitElement { |
703 final Script script; | 703 final Script script; |
704 PartOf partTag; | 704 PartOf partTag; |
705 Link<Element> localMembers = const Link<Element>(); | 705 Link<Element> localMembers = const Link<Element>(); |
(...skipping 19 matching lines...) Expand all Loading... |
725 if (metadataInternal == null) { | 725 if (metadataInternal == null) { |
726 metadataInternal = <MetadataAnnotation>[]; | 726 metadataInternal = <MetadataAnnotation>[]; |
727 } | 727 } |
728 metadataInternal.addAll(metadata); | 728 metadataInternal.addAll(metadata); |
729 } | 729 } |
730 | 730 |
731 void forEachLocalMember(f(Element element)) { | 731 void forEachLocalMember(f(Element element)) { |
732 localMembers.forEach(f); | 732 localMembers.forEach(f); |
733 } | 733 } |
734 | 734 |
735 void addMember(Element element, DiagnosticListener listener) { | 735 void addMember(Element element, DiagnosticReporter reporter) { |
736 // Keep a list of top level members. | 736 // Keep a list of top level members. |
737 localMembers = localMembers.prepend(element); | 737 localMembers = localMembers.prepend(element); |
738 // Provide the member to the library to build scope. | 738 // Provide the member to the library to build scope. |
739 if (enclosingElement.isPatch) { | 739 if (enclosingElement.isPatch) { |
740 implementationLibrary.addMember(element, listener); | 740 implementationLibrary.addMember(element, reporter); |
741 } else { | 741 } else { |
742 library.addMember(element, listener); | 742 library.addMember(element, reporter); |
743 } | 743 } |
744 } | 744 } |
745 | 745 |
746 void setPartOf(PartOf tag, DiagnosticListener listener) { | 746 void setPartOf(PartOf tag, DiagnosticReporter reporter) { |
747 LibraryElementX library = enclosingElement; | 747 LibraryElementX library = enclosingElement; |
748 if (library.entryCompilationUnit == this) { | 748 if (library.entryCompilationUnit == this) { |
749 partTag = tag; | 749 partTag = tag; |
750 listener.reportErrorMessage( | 750 reporter.reportErrorMessage( |
751 tag, MessageKind.IMPORT_PART_OF); | 751 tag, MessageKind.IMPORT_PART_OF); |
752 return; | 752 return; |
753 } | 753 } |
754 if (!localMembers.isEmpty) { | 754 if (!localMembers.isEmpty) { |
755 listener.reportErrorMessage( | 755 reporter.reportErrorMessage( |
756 tag, MessageKind.BEFORE_TOP_LEVEL); | 756 tag, MessageKind.BEFORE_TOP_LEVEL); |
757 return; | 757 return; |
758 } | 758 } |
759 if (partTag != null) { | 759 if (partTag != null) { |
760 listener.reportWarningMessage(tag, MessageKind.DUPLICATED_PART_OF); | 760 reporter.reportWarningMessage(tag, MessageKind.DUPLICATED_PART_OF); |
761 return; | 761 return; |
762 } | 762 } |
763 partTag = tag; | 763 partTag = tag; |
764 LibraryName libraryTag = library.libraryTag; | 764 LibraryName libraryTag = library.libraryTag; |
765 String actualName = tag.name.toString(); | 765 String actualName = tag.name.toString(); |
766 if (libraryTag != null) { | 766 if (libraryTag != null) { |
767 String expectedName = libraryTag.name.toString(); | 767 String expectedName = libraryTag.name.toString(); |
768 if (expectedName != actualName) { | 768 if (expectedName != actualName) { |
769 listener.reportWarningMessage( | 769 reporter.reportWarningMessage( |
770 tag.name, | 770 tag.name, |
771 MessageKind.LIBRARY_NAME_MISMATCH, | 771 MessageKind.LIBRARY_NAME_MISMATCH, |
772 {'libraryName': expectedName}); | 772 {'libraryName': expectedName}); |
773 } | 773 } |
774 } else { | 774 } else { |
775 listener.reportWarning( | 775 reporter.reportWarning( |
776 listener.createMessage( | 776 reporter.createMessage( |
777 library, | 777 library, |
778 MessageKind.MISSING_LIBRARY_NAME, | 778 MessageKind.MISSING_LIBRARY_NAME, |
779 {'libraryName': actualName}), | 779 {'libraryName': actualName}), |
780 <DiagnosticMessage>[ | 780 <DiagnosticMessage>[ |
781 listener.createMessage( | 781 reporter.createMessage( |
782 tag.name, | 782 tag.name, |
783 MessageKind.THIS_IS_THE_PART_OF_TAG), | 783 MessageKind.THIS_IS_THE_PART_OF_TAG), |
784 ]); | 784 ]); |
785 } | 785 } |
786 } | 786 } |
787 | 787 |
788 bool get hasMembers => !localMembers.isEmpty; | 788 bool get hasMembers => !localMembers.isEmpty; |
789 | 789 |
790 Element get analyzableElement => library; | 790 Element get analyzableElement => library; |
791 | 791 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
830 /** | 830 /** |
831 * Adds [element] to the import scope of this library. | 831 * Adds [element] to the import scope of this library. |
832 * | 832 * |
833 * If an element by the same name is already in the imported scope, an | 833 * If an element by the same name is already in the imported scope, an |
834 * [ErroneousElement] will be put in the imported scope, allowing for | 834 * [ErroneousElement] will be put in the imported scope, allowing for |
835 * detection of ambiguous uses of imported names. | 835 * detection of ambiguous uses of imported names. |
836 */ | 836 */ |
837 void addImport(Element enclosingElement, | 837 void addImport(Element enclosingElement, |
838 Element element, | 838 Element element, |
839 ImportElement import, | 839 ImportElement import, |
840 DiagnosticListener listener) { | 840 DiagnosticReporter reporter) { |
841 LibraryElementX library = enclosingElement.library; | 841 LibraryElementX library = enclosingElement.library; |
842 Importers importers = library.importers; | 842 Importers importers = library.importers; |
843 | 843 |
844 String name = element.name; | 844 String name = element.name; |
845 | 845 |
846 // The loadLibrary function always shadows existing bindings to that name. | 846 // The loadLibrary function always shadows existing bindings to that name. |
847 if (element.isDeferredLoaderGetter) { | 847 if (element.isDeferredLoaderGetter) { |
848 importScope.remove(name); | 848 importScope.remove(name); |
849 // TODO(sigurdm): Print a hint. | 849 // TODO(sigurdm): Print a hint. |
850 } | 850 } |
851 Element existing = importScope.putIfAbsent(name, () => element); | 851 Element existing = importScope.putIfAbsent(name, () => element); |
852 importers.registerImport(element, import); | 852 importers.registerImport(element, import); |
853 | 853 |
854 void registerWarnOnUseElement(ImportElement import, | 854 void registerWarnOnUseElement(ImportElement import, |
855 MessageKind messageKind, | 855 MessageKind messageKind, |
856 Element hidingElement, | 856 Element hidingElement, |
857 Element hiddenElement) { | 857 Element hiddenElement) { |
858 Uri hiddenUri = hiddenElement.library.canonicalUri; | 858 Uri hiddenUri = hiddenElement.library.canonicalUri; |
859 Uri hidingUri = hidingElement.library.canonicalUri; | 859 Uri hidingUri = hidingElement.library.canonicalUri; |
860 Element element = new WarnOnUseElementX( | 860 Element element = new WarnOnUseElementX( |
861 new WrappedMessage( | 861 new WrappedMessage( |
862 null, // Report on reference to [hidingElement]. | 862 null, // Report on reference to [hidingElement]. |
863 messageKind, | 863 messageKind, |
864 {'name': name, 'hiddenUri': hiddenUri, 'hidingUri': hidingUri}), | 864 {'name': name, 'hiddenUri': hiddenUri, 'hidingUri': hidingUri}), |
865 new WrappedMessage( | 865 new WrappedMessage( |
866 listener.spanFromSpannable(import), | 866 reporter.spanFromSpannable(import), |
867 MessageKind.IMPORTED_HERE, | 867 MessageKind.IMPORTED_HERE, |
868 {'name': name}), | 868 {'name': name}), |
869 enclosingElement, hidingElement); | 869 enclosingElement, hidingElement); |
870 importScope[name] = element; | 870 importScope[name] = element; |
871 importers.registerImport(element, import); | 871 importers.registerImport(element, import); |
872 } | 872 } |
873 | 873 |
874 if (existing != element) { | 874 if (existing != element) { |
875 ImportElement existingImport = importers.getImport(existing); | 875 ImportElement existingImport = importers.getImport(existing); |
876 if (existing.library.isPlatformLibrary && | 876 if (existing.library.isPlatformLibrary && |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1058 } | 1058 } |
1059 | 1059 |
1060 CompilationUnitElement get compilationUnit => entryCompilationUnit; | 1060 CompilationUnitElement get compilationUnit => entryCompilationUnit; |
1061 | 1061 |
1062 Element get analyzableElement => this; | 1062 Element get analyzableElement => this; |
1063 | 1063 |
1064 void addCompilationUnit(CompilationUnitElement element) { | 1064 void addCompilationUnit(CompilationUnitElement element) { |
1065 compilationUnits = compilationUnits.prepend(element); | 1065 compilationUnits = compilationUnits.prepend(element); |
1066 } | 1066 } |
1067 | 1067 |
1068 void addTag(LibraryTag tag, DiagnosticListener listener) { | 1068 void addTag(LibraryTag tag, DiagnosticReporter reporter) { |
1069 if (tagsCache != null) { | 1069 if (tagsCache != null) { |
1070 listener.internalError(tag, | 1070 reporter.internalError(tag, |
1071 "Library tags for $this have already been computed."); | 1071 "Library tags for $this have already been computed."); |
1072 } | 1072 } |
1073 tagsBuilder.addLast(tag); | 1073 tagsBuilder.addLast(tag); |
1074 } | 1074 } |
1075 | 1075 |
1076 Iterable<LibraryTag> get tags { | 1076 Iterable<LibraryTag> get tags { |
1077 if (tagsCache == null) { | 1077 if (tagsCache == null) { |
1078 tagsCache = tagsBuilder.toList(); | 1078 tagsCache = tagsBuilder.toList(); |
1079 tagsBuilder = null; | 1079 tagsBuilder = null; |
1080 } | 1080 } |
(...skipping 14 matching lines...) Expand all Loading... |
1095 | 1095 |
1096 /** | 1096 /** |
1097 * Adds [element] to the import scope of this library. | 1097 * Adds [element] to the import scope of this library. |
1098 * | 1098 * |
1099 * If an element by the same name is already in the imported scope, an | 1099 * If an element by the same name is already in the imported scope, an |
1100 * [ErroneousElement] will be put in the imported scope, allowing for | 1100 * [ErroneousElement] will be put in the imported scope, allowing for |
1101 * detection of ambiguous uses of imported names. | 1101 * detection of ambiguous uses of imported names. |
1102 */ | 1102 */ |
1103 void addImport(Element element, | 1103 void addImport(Element element, |
1104 ImportElement import, | 1104 ImportElement import, |
1105 DiagnosticListener listener) { | 1105 DiagnosticReporter reporter) { |
1106 importScope.addImport(this, element, import, listener); | 1106 importScope.addImport(this, element, import, reporter); |
1107 } | 1107 } |
1108 | 1108 |
1109 void addMember(Element element, DiagnosticListener listener) { | 1109 void addMember(Element element, DiagnosticReporter reporter) { |
1110 localMembers = localMembers.prepend(element); | 1110 localMembers = localMembers.prepend(element); |
1111 addToScope(element, listener); | 1111 addToScope(element, reporter); |
1112 } | 1112 } |
1113 | 1113 |
1114 void addToScope(Element element, DiagnosticListener listener) { | 1114 void addToScope(Element element, DiagnosticReporter reporter) { |
1115 localScope.add(element, listener); | 1115 localScope.add(element, reporter); |
1116 } | 1116 } |
1117 | 1117 |
1118 Element localLookup(String elementName) { | 1118 Element localLookup(String elementName) { |
1119 Element result = localScope.lookup(elementName); | 1119 Element result = localScope.lookup(elementName); |
1120 if (result == null && isPatch) { | 1120 if (result == null && isPatch) { |
1121 result = origin.localLookup(elementName); | 1121 result = origin.localLookup(elementName); |
1122 } | 1122 } |
1123 return result; | 1123 return result; |
1124 } | 1124 } |
1125 | 1125 |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1283 bool get isTopLevel => false; | 1283 bool get isTopLevel => false; |
1284 | 1284 |
1285 Element lookupLocalMember(String memberName) => importScope[memberName]; | 1285 Element lookupLocalMember(String memberName) => importScope[memberName]; |
1286 | 1286 |
1287 DartType computeType(Resolution resolution) => const DynamicType(); | 1287 DartType computeType(Resolution resolution) => const DynamicType(); |
1288 | 1288 |
1289 Token get position => firstPosition; | 1289 Token get position => firstPosition; |
1290 | 1290 |
1291 void addImport(Element element, | 1291 void addImport(Element element, |
1292 ImportElement import, | 1292 ImportElement import, |
1293 DiagnosticListener listener) { | 1293 DiagnosticReporter reporter) { |
1294 importScope.addImport(this, element, import, listener); | 1294 importScope.addImport(this, element, import, reporter); |
1295 } | 1295 } |
1296 | 1296 |
1297 accept(ElementVisitor visitor, arg) { | 1297 accept(ElementVisitor visitor, arg) { |
1298 return visitor.visitPrefixElement(this, arg); | 1298 return visitor.visitPrefixElement(this, arg); |
1299 } | 1299 } |
1300 | 1300 |
1301 String toString() => '$kind($name)'; | 1301 String toString() => '$kind($name)'; |
1302 } | 1302 } |
1303 | 1303 |
1304 class TypedefElementX extends ElementX | 1304 class TypedefElementX extends ElementX |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1356 TypedefType createType(List<DartType> typeArguments) { | 1356 TypedefType createType(List<DartType> typeArguments) { |
1357 return new TypedefType(this, typeArguments); | 1357 return new TypedefType(this, typeArguments); |
1358 } | 1358 } |
1359 | 1359 |
1360 Scope buildScope() { | 1360 Scope buildScope() { |
1361 return new TypeDeclarationScope(enclosingElement.buildScope(), this); | 1361 return new TypeDeclarationScope(enclosingElement.buildScope(), this); |
1362 } | 1362 } |
1363 | 1363 |
1364 void checkCyclicReference(Resolution resolution) { | 1364 void checkCyclicReference(Resolution resolution) { |
1365 if (hasBeenCheckedForCycles) return; | 1365 if (hasBeenCheckedForCycles) return; |
1366 var visitor = new TypedefCyclicVisitor(resolution.listener, this); | 1366 TypedefCyclicVisitor visitor = |
| 1367 new TypedefCyclicVisitor(resolution.reporter, this); |
1367 computeType(resolution).accept(visitor, null); | 1368 computeType(resolution).accept(visitor, null); |
1368 hasBeenCheckedForCycles = true; | 1369 hasBeenCheckedForCycles = true; |
1369 } | 1370 } |
1370 | 1371 |
1371 accept(ElementVisitor visitor, arg) { | 1372 accept(ElementVisitor visitor, arg) { |
1372 return visitor.visitTypedefElement(this, arg); | 1373 return visitor.visitTypedefElement(this, arg); |
1373 } | 1374 } |
1374 | 1375 |
1375 // A typedef cannot be patched therefore defines itself. | 1376 // A typedef cannot be patched therefore defines itself. |
1376 AstElement get definingElement => this; | 1377 AstElement get definingElement => this; |
(...skipping 900 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2277 | 2278 |
2278 bool get hasNode => constructor.hasNode; | 2279 bool get hasNode => constructor.hasNode; |
2279 | 2280 |
2280 FunctionExpression get node => constructor.node; | 2281 FunctionExpression get node => constructor.node; |
2281 | 2282 |
2282 List<MetadataAnnotation> get metadata => constructor.metadata; | 2283 List<MetadataAnnotation> get metadata => constructor.metadata; |
2283 | 2284 |
2284 bool get isInstanceMember => true; | 2285 bool get isInstanceMember => true; |
2285 | 2286 |
2286 FunctionType computeType(Resolution resolution) { | 2287 FunctionType computeType(Resolution resolution) { |
2287 resolution.listener.internalError(this, '$this.computeType.'); | 2288 DiagnosticReporter reporter = resolution.reporter; |
| 2289 reporter.internalError(this, '$this.computeType.'); |
2288 return null; | 2290 return null; |
2289 } | 2291 } |
2290 | 2292 |
2291 Token get position => constructor.position; | 2293 Token get position => constructor.position; |
2292 | 2294 |
2293 Element get outermostEnclosingMemberOrTopLevel => constructor; | 2295 Element get outermostEnclosingMemberOrTopLevel => constructor; |
2294 | 2296 |
2295 Element get analyzableElement => constructor.analyzableElement; | 2297 Element get analyzableElement => constructor.analyzableElement; |
2296 | 2298 |
2297 accept(ElementVisitor visitor, arg) { | 2299 accept(ElementVisitor visitor, arg) { |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2545 } | 2547 } |
2546 | 2548 |
2547 void ensureResolved(Resolution resolution) { | 2549 void ensureResolved(Resolution resolution) { |
2548 if (resolutionState == STATE_NOT_STARTED) { | 2550 if (resolutionState == STATE_NOT_STARTED) { |
2549 resolution.resolveClass(this); | 2551 resolution.resolveClass(this); |
2550 resolution.registerClass(this); | 2552 resolution.registerClass(this); |
2551 } | 2553 } |
2552 } | 2554 } |
2553 | 2555 |
2554 void setDefaultConstructor(FunctionElement constructor, | 2556 void setDefaultConstructor(FunctionElement constructor, |
2555 DiagnosticListener listener); | 2557 DiagnosticReporter reporter); |
2556 | 2558 |
2557 void addBackendMember(Element member) { | 2559 void addBackendMember(Element member) { |
2558 // TODO(ngeoffray): Deprecate this method. | 2560 // TODO(ngeoffray): Deprecate this method. |
2559 assert(member.isGenerativeConstructorBody); | 2561 assert(member.isGenerativeConstructorBody); |
2560 backendMembers = backendMembers.prepend(member); | 2562 backendMembers = backendMembers.prepend(member); |
2561 } | 2563 } |
2562 | 2564 |
2563 void reverseBackendMembers() { | 2565 void reverseBackendMembers() { |
2564 backendMembers = backendMembers.reverse(); | 2566 backendMembers = backendMembers.reverse(); |
2565 } | 2567 } |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2638 } | 2640 } |
2639 return localMembersCache; | 2641 return localMembersCache; |
2640 } | 2642 } |
2641 | 2643 |
2642 ClassElementX(String name, Element enclosing, int id, int initialState) | 2644 ClassElementX(String name, Element enclosing, int id, int initialState) |
2643 : super(name, enclosing, id, initialState); | 2645 : super(name, enclosing, id, initialState); |
2644 | 2646 |
2645 bool get isMixinApplication => false; | 2647 bool get isMixinApplication => false; |
2646 bool get hasLocalScopeMembers => !localScope.isEmpty; | 2648 bool get hasLocalScopeMembers => !localScope.isEmpty; |
2647 | 2649 |
2648 void addMember(Element element, DiagnosticListener listener) { | 2650 void addMember(Element element, DiagnosticReporter reporter) { |
2649 localMembersCache = null; | 2651 localMembersCache = null; |
2650 localMembersReversed = localMembersReversed.prepend(element); | 2652 localMembersReversed = localMembersReversed.prepend(element); |
2651 addToScope(element, listener); | 2653 addToScope(element, reporter); |
2652 } | 2654 } |
2653 | 2655 |
2654 void addToScope(Element element, DiagnosticListener listener) { | 2656 void addToScope(Element element, DiagnosticReporter reporter) { |
2655 if (element.isField && element.name == name) { | 2657 if (element.isField && element.name == name) { |
2656 listener.reportErrorMessage( | 2658 reporter.reportErrorMessage( |
2657 element, MessageKind.MEMBER_USES_CLASS_NAME); | 2659 element, MessageKind.MEMBER_USES_CLASS_NAME); |
2658 } | 2660 } |
2659 localScope.add(element, listener); | 2661 localScope.add(element, reporter); |
2660 } | 2662 } |
2661 | 2663 |
2662 Element localLookup(String elementName) { | 2664 Element localLookup(String elementName) { |
2663 Element result = localScope.lookup(elementName); | 2665 Element result = localScope.lookup(elementName); |
2664 if (result == null && isPatch) { | 2666 if (result == null && isPatch) { |
2665 result = origin.localLookup(elementName); | 2667 result = origin.localLookup(elementName); |
2666 } | 2668 } |
2667 return result; | 2669 return result; |
2668 } | 2670 } |
2669 | 2671 |
2670 void forEachLocalMember(void f(Element member)) { | 2672 void forEachLocalMember(void f(Element member)) { |
2671 localMembers.forEach(f); | 2673 localMembers.forEach(f); |
2672 } | 2674 } |
2673 | 2675 |
2674 bool get hasConstructor { | 2676 bool get hasConstructor { |
2675 // Search in scope to be sure we search patched constructors. | 2677 // Search in scope to be sure we search patched constructors. |
2676 for (var element in localScope.values) { | 2678 for (var element in localScope.values) { |
2677 if (element.isConstructor) return true; | 2679 if (element.isConstructor) return true; |
2678 } | 2680 } |
2679 return false; | 2681 return false; |
2680 } | 2682 } |
2681 | 2683 |
2682 void setDefaultConstructor(FunctionElement constructor, | 2684 void setDefaultConstructor(FunctionElement constructor, |
2683 DiagnosticListener listener) { | 2685 DiagnosticReporter reporter) { |
2684 // The default constructor, although synthetic, is part of a class' API. | 2686 // The default constructor, although synthetic, is part of a class' API. |
2685 addMember(constructor, listener); | 2687 addMember(constructor, reporter); |
2686 } | 2688 } |
2687 | 2689 |
2688 List<DartType> computeTypeParameters(Parsing parsing) { | 2690 List<DartType> computeTypeParameters(Parsing parsing) { |
2689 ClassNode node = parseNode(parsing); | 2691 ClassNode node = parseNode(parsing); |
2690 return createTypeVariables(node.typeParameters); | 2692 return createTypeVariables(node.typeParameters); |
2691 } | 2693 } |
2692 | 2694 |
2693 Scope buildScope() => new ClassScope(enclosingElement.buildScope(), this); | 2695 Scope buildScope() => new ClassScope(enclosingElement.buildScope(), this); |
2694 | 2696 |
2695 String toString() { | 2697 String toString() { |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2847 return mixedInElement.isInstanceMember ? mixedInElement : null; | 2849 return mixedInElement.isInstanceMember ? mixedInElement : null; |
2848 } | 2850 } |
2849 | 2851 |
2850 void forEachLocalMember(void f(Element member)) { | 2852 void forEachLocalMember(void f(Element member)) { |
2851 constructors.forEach(f); | 2853 constructors.forEach(f); |
2852 if (mixin != null) mixin.forEachLocalMember((Element mixedInElement) { | 2854 if (mixin != null) mixin.forEachLocalMember((Element mixedInElement) { |
2853 if (mixedInElement.isInstanceMember) f(mixedInElement); | 2855 if (mixedInElement.isInstanceMember) f(mixedInElement); |
2854 }); | 2856 }); |
2855 } | 2857 } |
2856 | 2858 |
2857 void addMember(Element element, DiagnosticListener listener) { | 2859 void addMember(Element element, DiagnosticReporter reporter) { |
2858 throw new UnsupportedError("Cannot add member to $this."); | 2860 throw new UnsupportedError("Cannot add member to $this."); |
2859 } | 2861 } |
2860 | 2862 |
2861 void addToScope(Element element, DiagnosticListener listener) { | 2863 void addToScope(Element element, DiagnosticReporter reporter) { |
2862 listener.internalError(this, 'Cannot add to scope of $this.'); | 2864 reporter.internalError(this, 'Cannot add to scope of $this.'); |
2863 } | 2865 } |
2864 | 2866 |
2865 void addConstructor(FunctionElement constructor) { | 2867 void addConstructor(FunctionElement constructor) { |
2866 constructors = constructors.prepend(constructor); | 2868 constructors = constructors.prepend(constructor); |
2867 } | 2869 } |
2868 | 2870 |
2869 void setDefaultConstructor(FunctionElement constructor, | 2871 void setDefaultConstructor(FunctionElement constructor, |
2870 DiagnosticListener listener) { | 2872 DiagnosticReporter reporter) { |
2871 assert(!hasConstructor); | 2873 assert(!hasConstructor); |
2872 addConstructor(constructor); | 2874 addConstructor(constructor); |
2873 } | 2875 } |
2874 | 2876 |
2875 List<DartType> computeTypeParameters(Parsing parsing) { | 2877 List<DartType> computeTypeParameters(Parsing parsing) { |
2876 NamedMixinApplication named = node.asNamedMixinApplication(); | 2878 NamedMixinApplication named = node.asNamedMixinApplication(); |
2877 if (named == null) { | 2879 if (named == null) { |
2878 throw new SpannableAssertionFailure(node, | 2880 throw new SpannableAssertionFailure(node, |
2879 "Type variables on unnamed mixin applications must be set on " | 2881 "Type variables on unnamed mixin applications must be set on " |
2880 "creation."); | 2882 "creation."); |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3103 AstElement get definingElement; | 3105 AstElement get definingElement; |
3104 | 3106 |
3105 bool get hasResolvedAst => definingElement.hasTreeElements; | 3107 bool get hasResolvedAst => definingElement.hasTreeElements; |
3106 | 3108 |
3107 ResolvedAst get resolvedAst { | 3109 ResolvedAst get resolvedAst { |
3108 return new ResolvedAst(declaration, | 3110 return new ResolvedAst(declaration, |
3109 definingElement.node, definingElement.treeElements); | 3111 definingElement.node, definingElement.treeElements); |
3110 } | 3112 } |
3111 | 3113 |
3112 } | 3114 } |
OLD | NEW |