22// for details. All rights reserved. Use of this source code is governed by a
33// BSD-style license that can be found in the LICENSE file.
44
5- import 'dart:collection' ;
6-
75import 'package:analyzer/dart/element/element.dart' ;
8- import 'package:analyzer/dart/element/type.dart' ;
9- import 'package:analyzer/src/dart/element/element.dart' ;
106import 'package:dartdoc/src/element_type.dart' ;
117import 'package:dartdoc/src/model/extension_target.dart' ;
128import 'package:dartdoc/src/model/model.dart' ;
@@ -16,7 +12,7 @@ import 'package:quiver/iterables.dart' as quiver;
1612class Extension extends Container
1713 with TypeParameters , Categorization
1814 implements EnclosedElement {
19- DefinedElementType extendedType;
15+ ElementType extendedType;
2016
2117 Extension (
2218 ExtensionElement element, Library library, PackageGraph packageGraph)
@@ -25,46 +21,29 @@ class Extension extends Container
2521 ElementType .from (_extension.extendedType, library, packageGraph);
2622 }
2723
24+ /// Detect if this extension applies to every object.
25+ bool get alwaysApplies =>
26+ extendedType.type.isDynamic ||
27+ extendedType.type.isVoid ||
28+ extendedType.type.isObject;
29+
2830 bool couldApplyTo <T extends ExtensionTarget >(T c) =>
2931 _couldApplyTo (c.modelType);
3032
3133 /// Return true if this extension could apply to [t] .
3234 bool _couldApplyTo (DefinedElementType t) {
33- return t.instantiatedType == extendedType.instantiatedType ||
34- (t.instantiatedType.element == extendedType.instantiatedType.element &&
35- isSubtypeOf (t)) ||
36- isBoundSupertypeTo (t);
37- }
38-
39- /// The instantiated to bounds [extendedType] of this extension is a subtype of
40- /// [t] .
41- bool isSubtypeOf (DefinedElementType t) => library.typeSystem
42- .isSubtypeOf (extendedType.instantiatedType, t.instantiatedType);
43-
44- bool isBoundSupertypeTo (DefinedElementType t) =>
45- _isBoundSupertypeTo (t.instantiatedType, HashSet ());
46-
47- /// Returns true if at least one supertype (including via mixins and
48- /// interfaces) is equivalent to or a subtype of [extendedType] when
49- /// instantiated to bounds.
50- bool _isBoundSupertypeTo (DartType superType, HashSet <DartType > visited) {
51- // Only InterfaceTypes can have superTypes.
52- if (superType is ! InterfaceType ) return false ;
53- ClassElement superClass = superType? .element;
54- if (visited.contains (superType)) return false ;
55- visited.add (superType);
56- if (superClass == extendedType.type.element &&
57- (superType == extendedType.instantiatedType ||
58- library.typeSystem
59- .isSubtypeOf (superType, extendedType.instantiatedType))) {
35+ if (extendedType is UndefinedElementType ) {
36+ assert (extendedType.type.isDynamic || extendedType.type.isVoid);
6037 return true ;
6138 }
62- List <InterfaceType > supertypes = [];
63- ClassElementImpl .collectAllSupertypes (supertypes, superType, null );
64- for (InterfaceType toVisit in supertypes) {
65- if (_isBoundSupertypeTo (toVisit, visited)) return true ;
39+ {
40+ DefinedElementType extendedType = this .extendedType;
41+ return t.instantiatedType == extendedType.instantiatedType ||
42+ (t.instantiatedType.element ==
43+ extendedType.instantiatedType.element &&
44+ extendedType.isSubtypeOf (t)) ||
45+ extendedType.isBoundSupertypeTo (t);
6646 }
67- return false ;
6847 }
6948
7049 @override
0 commit comments