Index: pkg/compiler/lib/src/js_backend/runtime_types.dart |
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart |
index 3101e8d617b8045e74e18b75ac7a311bf68b2a7c..60ce63cb1753fbdebc849d0b7e51ee9bd5d967f3 100644 |
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart |
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart |
@@ -112,13 +112,12 @@ abstract class RuntimeTypesEncoder { |
bool isSimpleFunctionType(ResolutionFunctionType type); |
jsAst.Expression getSignatureEncoding( |
- ResolutionDartType type, jsAst.Expression this_); |
+ Emitter emitter, ResolutionDartType type, jsAst.Expression this_); |
- jsAst.Expression getSubstitutionRepresentation( |
+ jsAst.Expression getSubstitutionRepresentation(Emitter emitter, |
List<ResolutionDartType> types, OnVariableCallback onVariable); |
- jsAst.Expression getSubstitutionCode(Substitution substitution); |
- jsAst.Expression getSubstitutionCodeForVariable( |
- Substitution substitution, int index); |
+ jsAst.Expression getSubstitutionCode( |
+ Emitter emitter, Substitution substitution); |
/// Returns the JavaScript template to determine at runtime if a type object |
/// is a function type. |
@@ -132,7 +131,7 @@ abstract class RuntimeTypesEncoder { |
/// Returns a [jsAst.Expression] representing the given [type]. Type variables |
/// are replaced by the [jsAst.Expression] returned by [onVariable]. |
jsAst.Expression getTypeRepresentation( |
- ResolutionDartType type, OnVariableCallback onVariable, |
+ Emitter emitter, ResolutionDartType type, OnVariableCallback onVariable, |
[ShouldEncodeTypedefCallback shouldEncodeTypedef]); |
String getTypeRepresentationForTypeConstant(ResolutionDartType type); |
@@ -693,13 +692,11 @@ class _RuntimeTypes extends _RuntimeTypesBase |
class _RuntimeTypesEncoder implements RuntimeTypesEncoder { |
final Namer namer; |
- final CodeEmitterTask emitter; |
- final BackendHelpers helpers; |
- final TypeRepresentationGenerator representationGenerator; |
+ final BackendHelpers _helpers; |
+ final TypeRepresentationGenerator _representationGenerator; |
- _RuntimeTypesEncoder(this.namer, this.emitter, this.helpers) |
- : representationGenerator = |
- new TypeRepresentationGenerator(namer, emitter); |
+ _RuntimeTypesEncoder(this.namer, this._helpers) |
+ : _representationGenerator = new TypeRepresentationGenerator(namer); |
@override |
bool isSimpleFunctionType(ResolutionFunctionType type) { |
@@ -716,44 +713,45 @@ class _RuntimeTypesEncoder implements RuntimeTypesEncoder { |
/// is a function type. |
@override |
jsAst.Template get templateForIsFunctionType { |
- return representationGenerator.templateForIsFunctionType; |
+ return _representationGenerator.templateForIsFunctionType; |
} |
/// Returns the JavaScript template that creates at runtime a new function |
/// type object. |
@override |
jsAst.Template get templateForCreateFunctionType { |
- return representationGenerator.templateForCreateFunctionType; |
+ return _representationGenerator.templateForCreateFunctionType; |
} |
@override |
jsAst.Expression getTypeRepresentation( |
- ResolutionDartType type, OnVariableCallback onVariable, |
+ Emitter emitter, ResolutionDartType type, OnVariableCallback onVariable, |
[ShouldEncodeTypedefCallback shouldEncodeTypedef]) { |
// GENERIC_METHODS: When generic method support is complete enough to |
// include a runtime value for method type variables this must be updated. |
- return representationGenerator.getTypeRepresentation( |
+ return _representationGenerator.getTypeRepresentation(emitter, |
type.dynamifyMethodTypeVariableType, onVariable, shouldEncodeTypedef); |
} |
@override |
- jsAst.Expression getSubstitutionRepresentation( |
+ jsAst.Expression getSubstitutionRepresentation(Emitter emitter, |
List<ResolutionDartType> types, OnVariableCallback onVariable) { |
List<jsAst.Expression> elements = types |
.map((ResolutionDartType type) => |
- getTypeRepresentation(type, onVariable)) |
+ getTypeRepresentation(emitter, type, onVariable)) |
.toList(growable: false); |
return new jsAst.ArrayInitializer(elements); |
} |
- jsAst.Expression getTypeEncoding(ResolutionDartType type, |
+ jsAst.Expression getTypeEncoding(Emitter emitter, ResolutionDartType type, |
{bool alwaysGenerateFunction: false}) { |
ClassElement contextClass = Types.getClassContext(type); |
jsAst.Expression onVariable(ResolutionTypeVariableType v) { |
return new jsAst.VariableUse(v.name); |
} |
- jsAst.Expression encoding = getTypeRepresentation(type, onVariable); |
+ jsAst.Expression encoding = |
+ getTypeRepresentation(emitter, type, onVariable); |
if (contextClass == null && !alwaysGenerateFunction) { |
return encoding; |
} else { |
@@ -769,14 +767,14 @@ class _RuntimeTypesEncoder implements RuntimeTypesEncoder { |
@override |
jsAst.Expression getSignatureEncoding( |
- ResolutionDartType type, jsAst.Expression this_) { |
+ Emitter emitter, ResolutionDartType type, jsAst.Expression this_) { |
ClassElement contextClass = Types.getClassContext(type); |
jsAst.Expression encoding = |
- getTypeEncoding(type, alwaysGenerateFunction: true); |
+ getTypeEncoding(emitter, type, alwaysGenerateFunction: true); |
if (contextClass != null) { |
jsAst.Name contextName = namer.className(contextClass); |
return js('function () { return #(#, #, #); }', [ |
- emitter.staticFunctionAccess(helpers.computeSignature), |
+ emitter.staticFunctionAccess(_helpers.computeSignature), |
encoding, |
this_, |
js.quoteName(contextName) |
@@ -801,7 +799,8 @@ class _RuntimeTypesEncoder implements RuntimeTypesEncoder { |
* a list expression. |
*/ |
@override |
- jsAst.Expression getSubstitutionCode(Substitution substitution) { |
+ jsAst.Expression getSubstitutionCode( |
+ Emitter emitter, Substitution substitution) { |
jsAst.Expression declaration(ResolutionTypeVariableType variable) { |
return new jsAst.Parameter(getVariableName(variable.name)); |
} |
@@ -812,10 +811,10 @@ class _RuntimeTypesEncoder implements RuntimeTypesEncoder { |
if (substitution.arguments |
.every((ResolutionDartType type) => type.isDynamic)) { |
- return emitter.emitter.generateFunctionThatReturnsNull(); |
+ return emitter.generateFunctionThatReturnsNull(); |
} else { |
jsAst.Expression value = |
- getSubstitutionRepresentation(substitution.arguments, use); |
+ getSubstitutionRepresentation(emitter, substitution.arguments, use); |
if (substitution.isFunction) { |
Iterable<jsAst.Expression> formals = |
substitution.parameters.map(declaration); |
@@ -826,28 +825,6 @@ class _RuntimeTypesEncoder implements RuntimeTypesEncoder { |
} |
} |
- @override |
- jsAst.Expression getSubstitutionCodeForVariable( |
- Substitution substitution, int index) { |
- jsAst.Expression declaration(ResolutionTypeVariableType variable) { |
- return new jsAst.Parameter(getVariableName(variable.name)); |
- } |
- |
- jsAst.Expression use(ResolutionTypeVariableType variable) { |
- return new jsAst.VariableUse(getVariableName(variable.name)); |
- } |
- |
- if (substitution.arguments[index].isDynamic) { |
- return emitter.emitter.generateFunctionThatReturnsNull(); |
- } else { |
- jsAst.Expression value = |
- getTypeRepresentation(substitution.arguments[index], use); |
- Iterable<jsAst.Expression> formals = |
- substitution.parameters.map(declaration); |
- return js('function(#) { return # }', [formals, value]); |
- } |
- } |
- |
String getVariableName(String name) { |
return namer.safeVariableName(name); |
} |
@@ -876,17 +853,17 @@ class _RuntimeTypesEncoder implements RuntimeTypesEncoder { |
class TypeRepresentationGenerator implements DartTypeVisitor { |
final Namer namer; |
- final CodeEmitterTask emitter; |
OnVariableCallback onVariable; |
ShouldEncodeTypedefCallback shouldEncodeTypedef; |
- TypeRepresentationGenerator(this.namer, this.emitter); |
+ TypeRepresentationGenerator(this.namer); |
/** |
* Creates a type representation for [type]. [onVariable] is called to provide |
* the type representation for type variables. |
*/ |
jsAst.Expression getTypeRepresentation( |
+ Emitter emitter, |
ResolutionDartType type, |
OnVariableCallback onVariable, |
ShouldEncodeTypedefCallback encodeTypedef) { |
@@ -894,40 +871,42 @@ class TypeRepresentationGenerator implements DartTypeVisitor { |
this.shouldEncodeTypedef = (encodeTypedef != null) |
? encodeTypedef |
: (ResolutionTypedefType type) => false; |
- jsAst.Expression representation = visit(type); |
+ jsAst.Expression representation = visit(type, emitter); |
this.onVariable = null; |
this.shouldEncodeTypedef = null; |
return representation; |
} |
- jsAst.Expression getJavaScriptClassName(Element element) { |
+ jsAst.Expression getJavaScriptClassName(Element element, Emitter emitter) { |
return emitter.typeAccess(element); |
} |
@override |
- visit(ResolutionDartType type, [_]) => type.accept(this, null); |
+ visit(ResolutionDartType type, Emitter emitter) => type.accept(this, emitter); |
- visitTypeVariableType(ResolutionTypeVariableType type, _) { |
+ visitTypeVariableType(ResolutionTypeVariableType type, Emitter emitter) { |
return onVariable(type); |
} |
- visitDynamicType(ResolutionDynamicType type, _) { |
+ visitDynamicType(ResolutionDynamicType type, Emitter emitter) { |
return js('null'); |
} |
- visitInterfaceType(ResolutionInterfaceType type, _) { |
- jsAst.Expression name = getJavaScriptClassName(type.element); |
- return type.treatAsRaw ? name : visitList(type.typeArguments, head: name); |
+ visitInterfaceType(ResolutionInterfaceType type, Emitter emitter) { |
+ jsAst.Expression name = getJavaScriptClassName(type.element, emitter); |
+ return type.treatAsRaw |
+ ? name |
+ : visitList(type.typeArguments, emitter, head: name); |
} |
- jsAst.Expression visitList(List<ResolutionDartType> types, |
+ jsAst.Expression visitList(List<ResolutionDartType> types, Emitter emitter, |
{jsAst.Expression head}) { |
List<jsAst.Expression> elements = <jsAst.Expression>[]; |
if (head != null) { |
elements.add(head); |
} |
for (ResolutionDartType type in types) { |
- jsAst.Expression element = visit(type); |
+ jsAst.Expression element = visit(type, emitter); |
if (element is jsAst.LiteralNull) { |
elements.add(new jsAst.ArrayHole()); |
} else { |
@@ -952,7 +931,7 @@ class TypeRepresentationGenerator implements DartTypeVisitor { |
.expressionTemplateFor('{ ${namer.functionTypeTag}: "dynafunc" }'); |
} |
- visitFunctionType(ResolutionFunctionType type, _) { |
+ visitFunctionType(ResolutionFunctionType type, Emitter emitter) { |
List<jsAst.Property> properties = <jsAst.Property>[]; |
void addProperty(String name, jsAst.Expression value) { |
@@ -965,15 +944,16 @@ class TypeRepresentationGenerator implements DartTypeVisitor { |
if (type.returnType.isVoid) { |
addProperty(namer.functionTypeVoidReturnTag, js('true')); |
} else if (!type.returnType.treatAsDynamic) { |
- addProperty(namer.functionTypeReturnTypeTag, visit(type.returnType)); |
+ addProperty( |
+ namer.functionTypeReturnTypeTag, visit(type.returnType, emitter)); |
} |
if (!type.parameterTypes.isEmpty) { |
addProperty(namer.functionTypeRequiredParametersTag, |
- visitList(type.parameterTypes)); |
+ visitList(type.parameterTypes, emitter)); |
} |
if (!type.optionalParameterTypes.isEmpty) { |
addProperty(namer.functionTypeOptionalParametersTag, |
- visitList(type.optionalParameterTypes)); |
+ visitList(type.optionalParameterTypes, emitter)); |
} |
if (!type.namedParameterTypes.isEmpty) { |
List<jsAst.Property> namedArguments = <jsAst.Property>[]; |
@@ -982,7 +962,8 @@ class TypeRepresentationGenerator implements DartTypeVisitor { |
assert(types.length == names.length); |
for (int index = 0; index < types.length; index++) { |
jsAst.Expression name = js.string(names[index]); |
- namedArguments.add(new jsAst.Property(name, visit(types[index]))); |
+ namedArguments |
+ .add(new jsAst.Property(name, visit(types[index], emitter))); |
} |
addProperty(namer.functionTypeNamedParametersTag, |
new jsAst.ObjectInitializer(namedArguments)); |
@@ -990,32 +971,33 @@ class TypeRepresentationGenerator implements DartTypeVisitor { |
return new jsAst.ObjectInitializer(properties); |
} |
- visitMalformedType(MalformedType type, _) { |
+ visitMalformedType(MalformedType type, Emitter emitter) { |
Emily Fortuna
2017/04/12 17:57:35
just curious why we added this if we're not using
Johnni Winther
2017/04/18 07:47:00
We're using it in getJavaScriptClassName.
|
// Treat malformed types as dynamic at runtime. |
return js('null'); |
} |
- visitVoidType(ResolutionVoidType type, _) { |
+ visitVoidType(ResolutionVoidType type, Emitter emitter) { |
// TODO(ahe): Reify void type ("null" means "dynamic"). |
return js('null'); |
} |
- visitTypedefType(ResolutionTypedefType type, _) { |
+ visitTypedefType(ResolutionTypedefType type, Emitter emitter) { |
bool shouldEncode = shouldEncodeTypedef(type); |
ResolutionDartType unaliasedType = type.unaliased; |
if (shouldEncode) { |
- jsAst.ObjectInitializer initializer = unaliasedType.accept(this, null); |
+ jsAst.ObjectInitializer initializer = visit(unaliasedType, emitter); |
// We have to encode the aliased type. |
- jsAst.Expression name = getJavaScriptClassName(type.element); |
- jsAst.Expression encodedTypedef = |
- type.treatAsRaw ? name : visitList(type.typeArguments, head: name); |
+ jsAst.Expression name = getJavaScriptClassName(type.element, emitter); |
+ jsAst.Expression encodedTypedef = type.treatAsRaw |
+ ? name |
+ : visitList(type.typeArguments, emitter, head: name); |
// Add it to the function-type object. |
jsAst.LiteralString tag = js.string(namer.typedefTag); |
initializer.properties.add(new jsAst.Property(tag, encodedTypedef)); |
return initializer; |
} else { |
- return unaliasedType.accept(this, null); |
+ return visit(unaliasedType, emitter); |
} |
} |
} |