3
3
// BSD-style license that can be found in the LICENSE file.
4
4
5
5
import 'package:analyzer/dart/element/element.dart' ;
6
+ import 'package:analyzer/dart/element/nullability_suffix.dart' ;
6
7
import 'package:analyzer/dart/element/type.dart' ;
7
8
import 'package:dartdoc/src/element_type.dart' ;
8
9
import 'package:dartdoc/src/model/comment_referable.dart' ;
9
10
import 'package:dartdoc/src/model/model.dart' ;
10
- import 'package:dartdoc/src/type_utils.dart' ;
11
11
import 'package:meta/meta.dart' ;
12
12
13
13
/// Static extension on a given type, containing methods (including getters,
@@ -16,37 +16,50 @@ class Extension extends Container {
16
16
@override
17
17
final ExtensionElement element;
18
18
19
- late final ElementType extendedType =
19
+ late final ElementType extendedElement =
20
20
getTypeFor (element.extendedType, library);
21
21
22
22
Extension (this .element, super .library, super .packageGraph);
23
23
24
- /// Detect if this extension applies to every object .
25
- bool get alwaysApplies =>
26
- extendedType.instantiatedType is DynamicType ||
27
- extendedType.instantiatedType is VoidType ||
28
- extendedType.instantiatedType.isDartCoreObject;
29
-
30
- bool couldApplyTo < T extends InheritingContainer >( T c) =>
31
- _couldApplyTo (c.modelType);
24
+ /// Whether this extension applies to every static type .
25
+ bool get alwaysApplies {
26
+ var extendedType = extendedElement.type;
27
+ if ( extendedType is TypeParameterType ) extendedType = extendedType.bound;
28
+ return extendedType is DynamicType ||
29
+ extendedType is VoidType ||
30
+ extendedType.isDartCoreObject;
31
+ }
32
32
33
- /// Whether this extension could apply to [type] .
34
- bool _couldApplyTo (DefinedElementType type) {
35
- if (extendedType.instantiatedType is DynamicType ||
36
- extendedType.instantiatedType is VoidType ) {
37
- return true ;
33
+ /// Whether this extension could apply to [container] .
34
+ ///
35
+ /// This makes some assumptions in its calculations. For example, all
36
+ /// [InheritingContainer] s represent [InterfaceElement] s, so no care is taken
37
+ /// to consider function types or record types.
38
+ bool couldApplyTo (InheritingContainer container) {
39
+ var extendedType = extendedElement.type;
40
+ if (extendedType is TypeParameterType ) {
41
+ extendedType = extendedType.bound;
38
42
}
39
- var typeInstantiated = type.instantiatedType;
40
- var extendedInstantiated = extendedType.instantiatedType;
41
- if (typeInstantiated == extendedInstantiated) {
43
+ if (extendedType is DynamicType || extendedType is VoidType ) {
42
44
return true ;
43
45
}
44
- if (typeInstantiated.documentableElement ==
45
- extendedInstantiated.documentableElement &&
46
- extendedType.isSubtypeOf (type)) {
47
- return true ;
46
+ var otherType = container.modelType.type;
47
+ if (otherType is InterfaceType ) {
48
+ otherType = library.element.typeSystem.instantiateInterfaceToBounds (
49
+ element: otherType.element,
50
+ nullabilitySuffix: NullabilitySuffix .none,
51
+ );
52
+
53
+ for (var superType in [otherType, ...otherType.allSupertypes]) {
54
+ var isSameBaseType = superType.element == extendedType.element;
55
+ if (isSameBaseType &&
56
+ library.element.typeSystem.isSubtypeOf (extendedType, superType)) {
57
+ return true ;
58
+ }
59
+ }
48
60
}
49
- return extendedType.isBoundSupertypeTo (type);
61
+
62
+ return false ;
50
63
}
51
64
52
65
@override
@@ -100,7 +113,7 @@ class Extension extends Container {
100
113
@override
101
114
Map <String , CommentReferable > get referenceChildren {
102
115
return _referenceChildren ?? = {
103
- ...extendedType .referenceChildren,
116
+ ...extendedElement .referenceChildren,
104
117
// Override extendedType entries with local items.
105
118
...super .referenceChildren,
106
119
};
0 commit comments