@@ -458,7 +458,7 @@ class CodeGenerator extends GeneralizingAstVisitor
458
458
return fromExpr;
459
459
}
460
460
461
- return js.call ('dart.as(#, #)' , [fromExpr, _emitTypeName (to)]);
461
+ return js.call ('dart.as(#, #)' , [fromExpr, _emitType (to)]);
462
462
}
463
463
464
464
@override
@@ -472,7 +472,7 @@ class CodeGenerator extends GeneralizingAstVisitor
472
472
result = js.call ('typeof # == #' , [lhs, js.string (typeofName, "'" )]);
473
473
} else {
474
474
// Always go through a runtime helper, because implicit interfaces.
475
- result = js.call ('dart.is(#, #)' , [lhs, _emitTypeName (type)]);
475
+ result = js.call ('dart.is(#, #)' , [lhs, _emitType (type)]);
476
476
}
477
477
478
478
if (node.notOperator != null ) {
@@ -495,7 +495,7 @@ class CodeGenerator extends GeneralizingAstVisitor
495
495
JS .Expression body = annotate (
496
496
js.call ('dart.typedef(#, () => #)' , [
497
497
js.string (element.name, "'" ),
498
- _emitTypeName (element.type, lowerTypedef: true )
498
+ _emitType (element.type, lowerTypedef: true )
499
499
]),
500
500
node,
501
501
element);
@@ -513,7 +513,7 @@ class CodeGenerator extends GeneralizingAstVisitor
513
513
JS .Expression visitTypeName (TypeName node) {
514
514
// TODO(jmesserly): should only happen for erroneous code.
515
515
if (node.type == null ) return js.call ('dart.dynamic' );
516
- return _emitTypeName (node.type);
516
+ return _emitType (node.type);
517
517
}
518
518
519
519
@override
@@ -741,7 +741,7 @@ class CodeGenerator extends GeneralizingAstVisitor
741
741
var values = new JS .ArrayInitializer (new List <JS .Expression >.from (
742
742
fields.map ((f) => js.call ('#.#' , [id, f.name]))));
743
743
result.add (js.statement ('#.values = dart.const(dart.list(#, #));' ,
744
- [id, values, _emitTypeName (type)]));
744
+ [id, values, _emitType (type)]));
745
745
746
746
return _statement (result);
747
747
}
@@ -759,7 +759,7 @@ class CodeGenerator extends GeneralizingAstVisitor
759
759
]);
760
760
761
761
var dynType = fillDynamicTypeArgs (element.type);
762
- var genericInst = _emitTypeName (dynType, lowerGeneric: true );
762
+ var genericInst = _emitType (dynType, lowerGeneric: true );
763
763
return js.statement (
764
764
'{ #; # = #; }' , [genericDef, _emitTopLevelName (element), genericInst]);
765
765
}
@@ -804,10 +804,10 @@ class CodeGenerator extends GeneralizingAstVisitor
804
804
supertype = fillDynamicTypeArgs (supertype.element.type);
805
805
_hasDeferredSupertype.add (element);
806
806
}
807
- heritage = _emitTypeName (supertype);
807
+ heritage = _emitType (supertype);
808
808
809
809
if (type.mixins.isNotEmpty) {
810
- var mixins = type.mixins.map (_emitTypeName ).toList ();
810
+ var mixins = type.mixins.map (_emitType ).toList ();
811
811
mixins.insert (0 , heritage);
812
812
heritage = js.call ('dart.mixin(#)' , [mixins]);
813
813
}
@@ -1051,7 +1051,8 @@ class CodeGenerator extends GeneralizingAstVisitor
1051
1051
// TODO(jmesserly): we should really just extend Array in the first place.
1052
1052
newBaseClass = js.call ('dart.global.#' , [jsPeerName]);
1053
1053
} else if (_hasDeferredSupertype.contains (classElem)) {
1054
- newBaseClass = _emitTypeName (classElem.type.superclass);
1054
+ newBaseClass = _emitType (classElem.type.superclass,
1055
+ subClass: classElem, className: className);
1055
1056
}
1056
1057
if (newBaseClass != null ) {
1057
1058
body.add (
@@ -1136,7 +1137,7 @@ class CodeGenerator extends GeneralizingAstVisitor
1136
1137
body.add (js.statement ('#[dart.implements] = () => #;' , [
1137
1138
className,
1138
1139
new JS .ArrayInitializer (new List <JS .Expression >.from (
1139
- classElem.interfaces.map (_emitTypeName )))
1140
+ classElem.interfaces.map (_emitType )))
1140
1141
]));
1141
1142
}
1142
1143
@@ -1608,7 +1609,7 @@ class CodeGenerator extends GeneralizingAstVisitor
1608
1609
var paramType = param.element.type;
1609
1610
if (! constructor && _hasUnsoundTypeParameter (paramType)) {
1610
1611
body.add (js
1611
- .statement ('dart.as(#, #);' , [jsParam, _emitTypeName (paramType)]));
1612
+ .statement ('dart.as(#, #);' , [jsParam, _emitType (paramType)]));
1612
1613
}
1613
1614
}
1614
1615
return body.isEmpty ? null : _statement (body);
@@ -1989,7 +1990,7 @@ class CodeGenerator extends GeneralizingAstVisitor
1989
1990
gen = js.call ('#.bind(this)' , gen);
1990
1991
}
1991
1992
1992
- var T = _emitTypeName (returnType);
1993
+ var T = _emitType (returnType);
1993
1994
return js.call ('dart.#(#)' , [
1994
1995
kind,
1995
1996
[gen, T ]..addAll (visitFormalParameterList (parameters, destructure: false ))
@@ -2052,7 +2053,7 @@ class CodeGenerator extends GeneralizingAstVisitor
2052
2053
2053
2054
// type literal
2054
2055
if (element is TypeDefiningElement ) {
2055
- var typeName = _emitTypeName (fillDynamicTypeArgs (element.type));
2056
+ var typeName = _emitType (fillDynamicTypeArgs (element.type));
2056
2057
2057
2058
// If the type is a type literal expression in Dart code, wrap the raw
2058
2059
// runtime type in a "Type" instance.
@@ -2081,7 +2082,7 @@ class CodeGenerator extends GeneralizingAstVisitor
2081
2082
// library prefix. We don't need those because static calls can't use
2082
2083
// the generic type.
2083
2084
if (isStatic) {
2084
- var dynType = _emitTypeName (fillDynamicTypeArgs (type));
2085
+ var dynType = _emitType (fillDynamicTypeArgs (type));
2085
2086
return new JS .PropertyAccess (dynType, member);
2086
2087
}
2087
2088
@@ -2157,7 +2158,7 @@ class CodeGenerator extends GeneralizingAstVisitor
2157
2158
for (int i = 0 ; i < types.length; ++ i) {
2158
2159
var metadata =
2159
2160
parameters != null ? _parameterMetadata (parameters[i]) : [];
2160
- var typeName = _emitTypeName (types[i]);
2161
+ var typeName = _emitType (types[i]);
2161
2162
var value = typeName;
2162
2163
// TODO(vsm): Make this optional per #268.
2163
2164
if (metadata.isNotEmpty) {
@@ -2173,7 +2174,7 @@ class CodeGenerator extends GeneralizingAstVisitor
2173
2174
var properties = < JS .Property > [];
2174
2175
types.forEach ((name, type) {
2175
2176
var key = _propertyName (name);
2176
- var value = _emitTypeName (type);
2177
+ var value = _emitType (type);
2177
2178
properties.add (new JS .Property (key, value));
2178
2179
});
2179
2180
return new JS .ObjectInitializer (properties);
@@ -2186,7 +2187,7 @@ class CodeGenerator extends GeneralizingAstVisitor
2186
2187
var parameterTypes = type.normalParameterTypes;
2187
2188
var optionalTypes = type.optionalParameterTypes;
2188
2189
var namedTypes = type.namedParameterTypes;
2189
- var rt = _emitTypeName (type.returnType);
2190
+ var rt = _emitType (type.returnType);
2190
2191
var ra = _emitTypeNames (parameterTypes, parameters);
2191
2192
2192
2193
List <JS .Expression > typeParts;
@@ -2221,8 +2222,15 @@ class CodeGenerator extends GeneralizingAstVisitor
2221
2222
/// function type. Similarly if [lowerGeneric] is set, the `List$()` form
2222
2223
/// will be used instead of `List` . These flags are used when generating
2223
2224
/// the definitions for typedefs and generic types, respectively.
2224
- JS .Expression _emitTypeName (DartType type,
2225
- {bool lowerTypedef: false , bool lowerGeneric: false }) {
2225
+ ///
2226
+ /// If [subClass] is set, then we are setting the base class for the given
2227
+ /// class and should emit the given [className] , which will already be
2228
+ /// defined.
2229
+ JS .Expression _emitType (DartType type,
2230
+ {bool lowerTypedef: false ,
2231
+ bool lowerGeneric: false ,
2232
+ ClassElement subClass,
2233
+ JS .Expression className}) {
2226
2234
// The void and dynamic types are not defined in core.
2227
2235
if (type.isVoid) {
2228
2236
return js.call ('dart.void' );
@@ -2252,11 +2260,16 @@ class CodeGenerator extends GeneralizingAstVisitor
2252
2260
return new JS .Identifier (name);
2253
2261
}
2254
2262
2263
+ if (type == subClass? .type) {
2264
+ return className;
2265
+ }
2266
+
2255
2267
if (type is ParameterizedType ) {
2256
2268
var args = type.typeArguments;
2257
2269
Iterable jsArgs = null ;
2258
2270
if (args.any ((a) => ! a.isDynamic)) {
2259
- jsArgs = args.map (_emitTypeName);
2271
+ jsArgs = args.map (
2272
+ (x) => _emitType (x, subClass: subClass, className: className));
2260
2273
} else if (lowerGeneric) {
2261
2274
jsArgs = [];
2262
2275
}
@@ -2537,7 +2550,7 @@ class CodeGenerator extends GeneralizingAstVisitor
2537
2550
f is FunctionType &&
2538
2551
f.typeFormals.isEmpty) {
2539
2552
return _recoverTypeArguments (g, f)
2540
- .map (_emitTypeName )
2553
+ .map (_emitType )
2541
2554
.toList (growable: false );
2542
2555
} else if (typeArgs != null ) {
2543
2556
// Dynamic calls may have type arguments, even though the function types
@@ -2979,7 +2992,7 @@ class CodeGenerator extends GeneralizingAstVisitor
2979
2992
2980
2993
JS .Expression _emitConstructorName (
2981
2994
ConstructorElement element, DartType type, SimpleIdentifier name) {
2982
- var typeName = _emitTypeName (type);
2995
+ var typeName = _emitType (type);
2983
2996
if (name != null || element.isFactory) {
2984
2997
var namedCtor = _constructorName (element);
2985
2998
return new JS .PropertyAccess (typeName, namedCtor);
@@ -3005,7 +3018,7 @@ class CodeGenerator extends GeneralizingAstVisitor
3005
3018
if (element == null ) {
3006
3019
// TODO(jmesserly): this only happens if we had a static error.
3007
3020
// Should we generate a throw instead?
3008
- ctor = _emitTypeName (type);
3021
+ ctor = _emitType (type);
3009
3022
if (name != null ) {
3010
3023
ctor = new JS .PropertyAccess (ctor, _propertyName (name.name));
3011
3024
}
@@ -3931,7 +3944,7 @@ class CodeGenerator extends GeneralizingAstVisitor
3931
3944
return new JS .If (
3932
3945
js.call ('dart.is(#, #)' , [
3933
3946
_visit (_catchParameter),
3934
- _emitTypeName (clause.exceptionType.type),
3947
+ _emitType (clause.exceptionType.type),
3935
3948
]),
3936
3949
then,
3937
3950
otherwise);
@@ -4021,7 +4034,7 @@ class CodeGenerator extends GeneralizingAstVisitor
4021
4034
// TODO(vsm): When we canonicalize, we need to treat private symbols
4022
4035
// correctly.
4023
4036
var name = js.string (node.components.join ('.' ), "'" );
4024
- return js.call ('#.new(#)' , [_emitTypeName (types.symbolType), name]);
4037
+ return js.call ('#.new(#)' , [_emitType (types.symbolType), name]);
4025
4038
}
4026
4039
return _emitConst (emitSymbol);
4027
4040
}
@@ -4039,7 +4052,7 @@ class CodeGenerator extends GeneralizingAstVisitor
4039
4052
if (! elementType.isDynamic) {
4040
4053
// dart.list helper internally depends on _interceptors.JSArray.
4041
4054
_loader.declareBeforeUse (_jsArray);
4042
- list = js.call ('dart.list(#, #)' , [list, _emitTypeName (elementType)]);
4055
+ list = js.call ('dart.list(#, #)' , [list, _emitType (elementType)]);
4043
4056
}
4044
4057
return list;
4045
4058
}
@@ -4075,7 +4088,7 @@ class CodeGenerator extends GeneralizingAstVisitor
4075
4088
}
4076
4089
var types = < JS .Expression > [];
4077
4090
if (typeArgs != null ) {
4078
- types.addAll (typeArgs.arguments.map ((e) => _emitTypeName (e.type)));
4091
+ types.addAll (typeArgs.arguments.map ((e) => _emitType (e.type)));
4079
4092
}
4080
4093
return js.call ('dart.map(#, #)' , [mapArguments, types]);
4081
4094
}
0 commit comments