@@ -708,121 +708,108 @@ class PackageGraph with CommentReferable, Nameable {
708
708
return buffer.toString ();
709
709
}
710
710
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.
741
714
///
742
715
/// This doesn't know anything about [PackageGraph.inheritThrough] and
743
716
/// probably shouldn't, so using it with [Inheritable] s without special casing
744
717
/// 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,
746
723
{Container ? preferredClass}) {
747
724
assert (allLibrariesAdded);
748
- if (e == null ) return null ;
725
+ if (modelElement == null ) return null ;
726
+ var element = modelElement.element;
749
727
if (preferredClass != null ) {
750
728
var canonicalClass =
751
- findCanonicalModelElementFor (preferredClass.element ) as Container ? ;
729
+ findCanonicalModelElementFor (preferredClass) as Container ? ;
752
730
if (canonicalClass != null ) preferredClass = canonicalClass;
753
731
}
754
- var lib = _findCanonicalLibraryFor (e) ;
732
+ var lib = modelElement.canonicalLibrary ;
755
733
if (lib == null && preferredClass != null ) {
756
- lib = _findCanonicalLibraryFor ( preferredClass.element) ;
734
+ lib = preferredClass.canonicalLibrary ;
757
735
}
758
736
// For elements defined in extensions, they are canonical.
759
- var enclosingElement = e .enclosingElement;
737
+ var enclosingElement = element .enclosingElement;
760
738
if (enclosingElement is ExtensionElement ) {
761
739
lib ?? = getModelForElement (enclosingElement.library) as Library ? ;
762
740
// TODO(keertip): Find a better way to exclude members of extensions
763
741
// when libraries are specified using the "--include" flag.
764
742
if (lib != null && lib.isDocumented) {
765
- return getModelFor (e , lib);
743
+ return getModelFor (element , lib);
766
744
}
767
745
}
768
746
// TODO(jcollins-g): The data structures should be changed to eliminate
769
747
// guesswork with member elements.
770
- var declaration = e .declaration;
771
- ModelElement ? modelElement ;
748
+ var declaration = element .declaration;
749
+ ModelElement ? canonicalModelElement ;
772
750
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,
776
756
preferredClass: preferredClass as InheritingContainer ? );
777
757
} else {
778
758
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,
783
766
getter: getter as Accessor ? , setter: setter as Accessor ? );
784
767
} else {
785
- modelElement = getModelFor (e , lib);
768
+ canonicalModelElement = getModelFor (element , lib);
786
769
}
787
770
}
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 ;
791
774
}
792
775
}
793
776
// 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;
796
780
}
797
- return modelElement ;
781
+ return canonicalModelElement ;
798
782
}
799
783
800
- ModelElement ? _findCanonicalModelElementForAmbiguous (Element e, Library ? lib,
784
+ ModelElement ? _findCanonicalModelElementForAmbiguous (
785
+ ModelElement modelElement, Library ? lib,
801
786
{InheritingContainer ? preferredClass}) {
787
+ var element = modelElement.element;
802
788
var candidates = < ModelElement > {};
803
789
if (lib != null ) {
804
790
var constructedWithKey = allConstructedModelElements[
805
- ConstructedModelElementsKey (e , lib, null )];
791
+ ConstructedModelElementsKey (element , lib, null )];
806
792
if (constructedWithKey != null ) {
807
793
candidates.add (constructedWithKey);
808
794
}
809
795
var constructedWithKeyWithClass = allConstructedModelElements[
810
- ConstructedModelElementsKey (e , lib, preferredClass)];
796
+ ConstructedModelElementsKey (element , lib, preferredClass)];
811
797
if (constructedWithKeyWithClass != null ) {
812
798
candidates.add (constructedWithKeyWithClass);
813
799
}
814
800
if (candidates.isEmpty) {
815
801
candidates = {
816
- ...? allInheritableElements[InheritableElementsKey (e , lib)]
802
+ ...? allInheritableElements[InheritableElementsKey (element , lib)]
817
803
? .where ((me) => me.isCanonical),
818
804
};
819
805
}
820
806
}
821
807
822
- var canonicalClass = findCanonicalModelElementFor (e.enclosingElement);
808
+ var canonicalClass =
809
+ findCanonicalModelElementFor (modelElement.enclosingElement);
823
810
if (canonicalClass is InheritingContainer ) {
824
811
candidates.addAll (canonicalClass.allCanonicalModelElements
825
- .where ((m) => m.element == e ));
812
+ .where ((m) => m.element == element ));
826
813
}
827
814
828
815
var matches = {...candidates.where ((me) => me.isCanonical)};
0 commit comments