@@ -71,12 +71,17 @@ abstract class ElementType extends Privacy {
71
71
72
72
String get linkedName;
73
73
74
- String get name => type.name ?? type.element.name ;
74
+ String get name;
75
75
76
76
String get nameWithGenerics;
77
77
78
78
List <Parameter > get parameters => [];
79
79
80
+ DartType get instantiatedType;
81
+
82
+ bool isBoundSupertypeTo (ElementType t);
83
+ bool isSubtypeOf (ElementType t);
84
+
80
85
@override
81
86
String toString () => "$type " ;
82
87
@@ -95,23 +100,37 @@ class UndefinedElementType extends ElementType {
95
100
@override
96
101
bool get isPublic => true ;
97
102
103
+ @override
104
+ String get name {
105
+ if (type.isDynamic) {
106
+ if (returnedFrom != null &&
107
+ (returnedFrom is DefinedElementType &&
108
+ (returnedFrom as DefinedElementType ).element.isAsynchronous)) {
109
+ return 'Future' ;
110
+ } else {
111
+ return 'dynamic' ;
112
+ }
113
+ }
114
+ if (type.isVoid) return 'void' ;
115
+ assert (false , 'Unrecognized type for UndefinedElementType' );
116
+ return '' ;
117
+ }
118
+
98
119
@override
99
120
String get nameWithGenerics => name;
100
121
101
- /// dynamic and void are not allowed to have parameterized types .
122
+ /// Assume that undefined elements don't have useful bounds .
102
123
@override
103
- String get linkedName {
104
- if (type.isDynamic &&
105
- returnedFrom != null &&
106
- (returnedFrom is DefinedElementType &&
107
- (returnedFrom as DefinedElementType ).element.isAsynchronous)) {
108
- return 'Future' ;
109
- }
110
- return name;
111
- }
124
+ DartType get instantiatedType => type;
125
+
126
+ @override
127
+ bool isBoundSupertypeTo (ElementType t) => false ;
112
128
113
129
@override
114
- String get name => type.name ?? '' ;
130
+ bool isSubtypeOf (ElementType t) => type.isBottom && ! t.type.isBottom;
131
+
132
+ @override
133
+ String get linkedName => name;
115
134
}
116
135
117
136
/// A FunctionType that does not have an underpinning Element.
@@ -209,8 +228,7 @@ class TypeParameterElementType extends DefinedElementType {
209
228
ClassElement get _boundClassElement => type.element;
210
229
211
230
@override
212
- // TODO(jcollins-g): This is wrong; bound is not always an InterfaceType.
213
- InterfaceType get _interfaceType => (type as TypeParameterType ).bound;
231
+ DartType get _bound => (type as TypeParameterType ).bound;
214
232
}
215
233
216
234
/// An [ElementType] associated with an [Element] .
@@ -226,6 +244,9 @@ abstract class DefinedElementType extends ElementType {
226
244
return _element;
227
245
}
228
246
247
+ @override
248
+ String get name => type.element.name;
249
+
229
250
bool get isParameterType => (type is TypeParameterType );
230
251
231
252
/// This type is a public type if the underlying, canonical element is public.
@@ -274,32 +295,40 @@ abstract class DefinedElementType extends ElementType {
274
295
Class get boundClass =>
275
296
ModelElement .fromElement (_boundClassElement, packageGraph);
276
297
277
- InterfaceType get _interfaceType => type;
298
+ DartType get _bound => type;
278
299
279
- InterfaceType _instantiatedType;
300
+ DartType _instantiatedType;
280
301
281
302
/// Return this type, instantiated to bounds if it isn't already.
303
+ @override
282
304
DartType get instantiatedType {
283
305
if (_instantiatedType == null ) {
284
- if (! _interfaceType.typeArguments.every ((t) => t is InterfaceType )) {
306
+ if (_bound is InterfaceType &&
307
+ ! (_bound as InterfaceType )
308
+ .typeArguments
309
+ .every ((t) => t is InterfaceType )) {
285
310
var typeSystem = library.element.typeSystem as TypeSystemImpl ;
286
- _instantiatedType = typeSystem.instantiateToBounds (_interfaceType);
311
+ // TODO(jcollins-g): convert to ClassElement.instantiateToBounds
312
+ // dart-lang/dartdoc#2135
313
+ _instantiatedType = typeSystem.instantiateToBounds (_bound);
287
314
} else {
288
- _instantiatedType = _interfaceType ;
315
+ _instantiatedType = _bound ;
289
316
}
290
317
}
291
318
return _instantiatedType;
292
319
}
293
320
294
321
/// The instantiated to bounds type of this type is a subtype of
295
322
/// [t] .
296
- bool isSubtypeOf (DefinedElementType t) =>
323
+ @override
324
+ bool isSubtypeOf (ElementType t) =>
297
325
library.typeSystem.isSubtypeOf (instantiatedType, t.instantiatedType);
298
326
299
327
/// Returns true if at least one supertype (including via mixins and
300
328
/// interfaces) is equivalent to or a subtype of [this] when
301
329
/// instantiated to bounds.
302
- bool isBoundSupertypeTo (DefinedElementType t) =>
330
+ @override
331
+ bool isBoundSupertypeTo (ElementType t) =>
303
332
_isBoundSupertypeTo (t.instantiatedType, HashSet ());
304
333
305
334
bool _isBoundSupertypeTo (DartType superType, HashSet <DartType > visited) {
0 commit comments