@@ -698,115 +698,50 @@ class Class extends ModelElement
698698 }
699699
700700 List <Method > get inheritedMethods {
701- if (_inheritedMethods != null ) return _inheritedMethods;
702-
703- Map <String , ExecutableElement > cmap =
704- library.inheritanceManager.getMembersInheritedFromClasses (element);
705- Map <String , ExecutableElement > imap =
706- library.inheritanceManager.getMembersInheritedFromInterfaces (element);
707-
708- // remove methods that exist on this class
709- _methods.forEach ((method) {
710- cmap.remove (method.name);
711- imap.remove (method.name);
712- });
713-
714- _inheritedMethods = [];
715- List <ExecutableElement > values = [];
716- Set <String > uniqueNames = new Set ();
717-
718- instanceProperties.forEach ((f) {
719- if (f.setter != null ) uniqueNames.add (f.setter.element.name);
720- if (f.getter != null ) uniqueNames.add (f.getter.element.name);
721- });
722-
723- for (String key in cmap.keys) {
724- // XXX: if we care about showing a hierarchy with our inherited methods,
725- // then don't do this
726- if (uniqueNames.contains (key)) continue ;
727-
728- uniqueNames.add (key);
729- values.add (cmap[key]);
730- }
731-
732- for (String key in imap.keys) {
733- // XXX: if we care about showing a hierarchy with our inherited methods,
734- // then don't do this
735- if (uniqueNames.contains (key)) continue ;
736-
737- uniqueNames.add (key);
738- values.add (imap[key]);
739- }
740-
741- for (ExecutableElement value in values) {
742- if (value != null &&
743- value is MethodElement &&
744- ! value.isOperator &&
745- value.enclosingElement != null ) {
746- Method m;
747- m = new ModelElement .from (value, library, enclosingClass: this );
701+ if (_inheritedMethods == null ) {
702+ _inheritedMethods = new List <Method >();
703+ Set <String > methodNames = _methods.map ((m) => m.element.name).toSet ();
704+
705+ Set <ExecutableElement > inheritedMethodElements =
706+ _inheritedElements.where ((e) {
707+ return (e is MethodElement &&
708+ ! e.isOperator &&
709+ e is ! PropertyAccessorElement &&
710+ ! methodNames.contains (e.name));
711+ }).toSet ();
712+
713+ for (ExecutableElement e in inheritedMethodElements) {
714+ Method m = new ModelElement .from (e, library, enclosingClass: this );
748715 _inheritedMethods.add (m);
749716 _genPageMethods.add (m);
750717 }
718+ _inheritedMethods.sort (byName);
751719 }
752-
753- _inheritedMethods.sort (byName);
754-
755720 return _inheritedMethods;
756721 }
757722
758723 Iterable get publicInheritedMethods => filterNonPublic (inheritedMethods);
759724
760725 bool get hasPublicInheritedMethods => publicInheritedMethods.isNotEmpty;
761726
762- // TODO(jcollins-g): this is very copy-paste from inheritedMethods now that the
763- // constructor is always [ModelElement.from]. Fix this.
764727 List <Operator > get inheritedOperators {
765- if (_inheritedOperators != null ) return _inheritedOperators;
766- Map <String , ExecutableElement > cmap =
767- library.inheritanceManager.getMembersInheritedFromClasses (element);
768- Map <String , ExecutableElement > imap =
769- library.inheritanceManager.getMembersInheritedFromInterfaces (element);
770- operators.forEach ((operator ) {
771- cmap.remove (operator .element.name);
772- imap.remove (operator .element.name);
773- });
774- _inheritedOperators = [];
775- Map <String , ExecutableElement > values = {};
776-
777- bool _isInheritedOperator (ExecutableElement value) {
778- if (value != null &&
779- value is MethodElement &&
780- ! value.isPrivate &&
781- value.isOperator &&
782- value.enclosingElement != null ) {
783- return true ;
728+ if (_inheritedOperators == null ) {
729+ _inheritedOperators = [];
730+ Set <String > operatorNames = _operators.map ((o) => o.element.name).toSet ();
731+
732+ Set <ExecutableElement > inheritedOperatorElements =
733+ _inheritedElements.where ((e) {
734+ return (e is MethodElement &&
735+ e.isOperator &&
736+ ! operatorNames.contains (e.name));
737+ }).toSet ();
738+ for (ExecutableElement e in inheritedOperatorElements) {
739+ Operator o = new ModelElement .from (e, library, enclosingClass: this );
740+ _inheritedOperators.add (o);
741+ _genPageOperators.add (o);
784742 }
785- return false ;
786- }
787-
788- for (String key in imap.keys) {
789- ExecutableElement value = imap[key];
790- if (_isInheritedOperator (value)) {
791- values.putIfAbsent (value.name, () => value);
792- }
793- }
794-
795- for (String key in cmap.keys) {
796- ExecutableElement value = cmap[key];
797- if (_isInheritedOperator (value)) {
798- values.putIfAbsent (value.name, () => value);
799- }
800- }
801-
802- for (ExecutableElement value in values.values) {
803- Operator o = new ModelElement .from (value, library, enclosingClass: this );
804- _inheritedOperators.add (o);
805- _genPageOperators.add (o);
743+ _inheritedOperators.sort (byName);
806744 }
807-
808- _inheritedOperators.sort (byName);
809-
810745 return _inheritedOperators;
811746 }
812747
@@ -994,22 +929,26 @@ class Class extends ModelElement
994929
995930 ElementType get supertype => _supertype;
996931
932+ List <ExecutableElement > __inheritedElements;
933+ List <ExecutableElement > get _inheritedElements {
934+ if (__inheritedElements == null ) {
935+ __inheritedElements = [];
936+ Map <String , ExecutableElement > cmap =
937+ library.inheritanceManager.getMembersInheritedFromClasses (element);
938+ Map <String , ExecutableElement > imap =
939+ library.inheritanceManager.getMembersInheritedFromInterfaces (element);
940+ __inheritedElements.addAll (cmap.values);
941+ __inheritedElements
942+ .addAll (imap.values.where ((e) => ! cmap.containsKey (e.name)));
943+ }
944+ return __inheritedElements;
945+ }
946+
997947 List <Field > get allFields {
998948 if (_fields != null ) return _fields;
999949 _fields = [];
1000- Map <String , ExecutableElement > cmap =
1001- library.inheritanceManager.getMembersInheritedFromClasses (element);
1002- Map <String , ExecutableElement > imap =
1003- library.inheritanceManager.getMembersInheritedFromInterfaces (element);
1004-
1005- Set <PropertyAccessorElement > inheritedAccessors = new Set ();
1006- inheritedAccessors
1007- .addAll (cmap.values.where ((e) => e is PropertyAccessorElement ));
1008-
1009- // Interfaces are subordinate to members inherited from classes, so don't
1010- // add this to our accessor set if we already have something inherited from classes.
1011- inheritedAccessors.addAll (imap.values.where (
1012- (e) => e is PropertyAccessorElement && ! cmap.containsKey (e.name)));
950+ Set <PropertyAccessorElement > inheritedAccessors = new Set ()
951+ ..addAll (_inheritedElements.where ((e) => e is PropertyAccessorElement ));
1013952
1014953 // This structure keeps track of inherited accessors, allowing lookup
1015954 // by field name (stripping the '=' from setters).
@@ -5091,6 +5030,7 @@ class PackageBuilder {
50915030 PerformanceLog log = new PerformanceLog (null );
50925031 AnalysisDriverScheduler scheduler = new AnalysisDriverScheduler (log);
50935032 AnalysisOptionsImpl options = new AnalysisOptionsImpl ();
5033+ options.strongMode = true ;
50945034 options.enableSuperMixins = true ;
50955035
50965036 // TODO(jcollins-g): Make use of currently not existing API for managing
0 commit comments