@@ -708,121 +708,108 @@ class PackageGraph with CommentReferable, Nameable {
708708 return buffer.toString ();
709709 }
710710
711- final Map <Element , Library ?> _canonicalLibraryFor = {};
712-
713- /// Tries to find a top level library that references this element.
714- Library ? _findCanonicalLibraryFor (Element e) {
715- assert (allLibrariesAdded);
716- if (_canonicalLibraryFor.containsKey (e)) {
717- return _canonicalLibraryFor[e];
718- }
719- _canonicalLibraryFor[e] = null ;
720-
721- var searchElement = switch (e) {
722- PropertyAccessorElement () => e.variable2,
723- GenericFunctionTypeElement () => e.enclosingElement,
724- _ => e,
725- };
726- if (searchElement == null ) return null ;
727- for (var library in publicLibraries) {
728- var modelElements = library.modelElementsMap[searchElement];
729- if (modelElements != null ) {
730- if (modelElements.any ((element) => element.isCanonical)) {
731- return _canonicalLibraryFor[e] = library;
732- }
733- }
734- }
735- return _canonicalLibraryFor[e];
736- }
737-
738- /// Tries to find a canonical [ModelElement] for this [e] . If we know this
739- /// element is related to a particular class, pass a [preferredClass] to
740- /// disambiguate.
711+ /// Tries to find a canonical [ModelElement] for this [modelElement] . If we
712+ /// know this element is related to a particular class, pass a
713+ /// [preferredClass] to disambiguate.
741714 ///
742715 /// This doesn't know anything about [PackageGraph.inheritThrough] and
743716 /// probably shouldn't, so using it with [Inheritable] s without special casing
744717 /// is not advised.
745- ModelElement ? findCanonicalModelElementFor (Element ? e,
718+ ///
719+ /// This can return `null` in a few ways: if [modelElement] is `null` , or if
720+ /// it has no canonical library, or if a possible canonical model element has
721+ /// a `false` value for `isCanonical` .
722+ ModelElement ? findCanonicalModelElementFor (ModelElement ? modelElement,
746723 {Container ? preferredClass}) {
747724 assert (allLibrariesAdded);
748- if (e == null ) return null ;
725+ if (modelElement == null ) return null ;
726+ var element = modelElement.element;
749727 if (preferredClass != null ) {
750728 var canonicalClass =
751- findCanonicalModelElementFor (preferredClass.element ) as Container ? ;
729+ findCanonicalModelElementFor (preferredClass) as Container ? ;
752730 if (canonicalClass != null ) preferredClass = canonicalClass;
753731 }
754- var lib = _findCanonicalLibraryFor (e) ;
732+ var lib = modelElement.canonicalLibrary ;
755733 if (lib == null && preferredClass != null ) {
756- lib = _findCanonicalLibraryFor ( preferredClass.element) ;
734+ lib = preferredClass.canonicalLibrary ;
757735 }
758736 // For elements defined in extensions, they are canonical.
759- var enclosingElement = e .enclosingElement;
737+ var enclosingElement = element .enclosingElement;
760738 if (enclosingElement is ExtensionElement ) {
761739 lib ?? = getModelForElement (enclosingElement.library) as Library ? ;
762740 // TODO(keertip): Find a better way to exclude members of extensions
763741 // when libraries are specified using the "--include" flag.
764742 if (lib != null && lib.isDocumented) {
765- return getModelFor (e , lib);
743+ return getModelFor (element , lib);
766744 }
767745 }
768746 // TODO(jcollins-g): The data structures should be changed to eliminate
769747 // guesswork with member elements.
770- var declaration = e .declaration;
771- ModelElement ? modelElement ;
748+ var declaration = element .declaration;
749+ ModelElement ? canonicalModelElement ;
772750 if (declaration != null &&
773- (e is ClassMemberElement || e is PropertyAccessorElement )) {
774- e = declaration;
775- modelElement = _findCanonicalModelElementForAmbiguous (e, lib,
751+ (element is ClassMemberElement || element is PropertyAccessorElement )) {
752+ modelElement = getModelForElement (declaration);
753+ element = modelElement.element;
754+ canonicalModelElement = _findCanonicalModelElementForAmbiguous (
755+ modelElement, lib,
776756 preferredClass: preferredClass as InheritingContainer ? );
777757 } else {
778758 if (lib != null ) {
779- if (e is PropertyInducingElement ) {
780- var getter = e.getter != null ? getModelFor (e.getter! , lib) : null ;
781- var setter = e.setter != null ? getModelFor (e.setter! , lib) : null ;
782- modelElement = getModelForPropertyInducingElement (e, lib,
759+ if (element is PropertyInducingElement ) {
760+ var getter =
761+ element.getter != null ? getModelFor (element.getter! , lib) : null ;
762+ var setter =
763+ element.setter != null ? getModelFor (element.setter! , lib) : null ;
764+ canonicalModelElement = getModelForPropertyInducingElement (
765+ element, lib,
783766 getter: getter as Accessor ? , setter: setter as Accessor ? );
784767 } else {
785- modelElement = getModelFor (e , lib);
768+ canonicalModelElement = getModelFor (element , lib);
786769 }
787770 }
788- assert (modelElement is ! Inheritable );
789- if (modelElement != null && ! modelElement .isCanonical) {
790- modelElement = null ;
771+ assert (canonicalModelElement is ! Inheritable );
772+ if (canonicalModelElement != null && ! canonicalModelElement .isCanonical) {
773+ canonicalModelElement = null ;
791774 }
792775 }
793776 // Prefer fields and top-level variables.
794- if (e is PropertyAccessorElement && modelElement is Accessor ) {
795- modelElement = modelElement.enclosingCombo;
777+ if (element is PropertyAccessorElement &&
778+ canonicalModelElement is Accessor ) {
779+ canonicalModelElement = canonicalModelElement.enclosingCombo;
796780 }
797- return modelElement ;
781+ return canonicalModelElement ;
798782 }
799783
800- ModelElement ? _findCanonicalModelElementForAmbiguous (Element e, Library ? lib,
784+ ModelElement ? _findCanonicalModelElementForAmbiguous (
785+ ModelElement modelElement, Library ? lib,
801786 {InheritingContainer ? preferredClass}) {
787+ var element = modelElement.element;
802788 var candidates = < ModelElement > {};
803789 if (lib != null ) {
804790 var constructedWithKey = allConstructedModelElements[
805- ConstructedModelElementsKey (e , lib, null )];
791+ ConstructedModelElementsKey (element , lib, null )];
806792 if (constructedWithKey != null ) {
807793 candidates.add (constructedWithKey);
808794 }
809795 var constructedWithKeyWithClass = allConstructedModelElements[
810- ConstructedModelElementsKey (e , lib, preferredClass)];
796+ ConstructedModelElementsKey (element , lib, preferredClass)];
811797 if (constructedWithKeyWithClass != null ) {
812798 candidates.add (constructedWithKeyWithClass);
813799 }
814800 if (candidates.isEmpty) {
815801 candidates = {
816- ...? allInheritableElements[InheritableElementsKey (e , lib)]
802+ ...? allInheritableElements[InheritableElementsKey (element , lib)]
817803 ? .where ((me) => me.isCanonical),
818804 };
819805 }
820806 }
821807
822- var canonicalClass = findCanonicalModelElementFor (e.enclosingElement);
808+ var canonicalClass =
809+ findCanonicalModelElementFor (modelElement.enclosingElement);
823810 if (canonicalClass is InheritingContainer ) {
824811 candidates.addAll (canonicalClass.allCanonicalModelElements
825- .where ((m) => m.element == e ));
812+ .where ((m) => m.element == element ));
826813 }
827814
828815 var matches = {...candidates.where ((me) => me.isCanonical)};
0 commit comments