Chromium Code Reviews| 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); |
| } |
| } |
| } |