Index: pkg/compiler/lib/src/js_emitter/class_stub_generator.dart |
diff --git a/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart |
index c727d56e4923f8f297660d8f8c6a5f92befd881e..447710dca781f2ef0320f282ad342a15fc5cd94f 100644 |
--- a/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart |
+++ b/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart |
@@ -11,8 +11,8 @@ class ClassStubGenerator { |
ClassStubGenerator(this.compiler, this.namer, this.backend); |
- jsAst.Expression generateClassConstructor(ClassElement classElement, |
- Iterable<jsAst.Name> fields) { |
+ jsAst.Expression generateClassConstructor( |
+ ClassElement classElement, Iterable<jsAst.Name> fields) { |
// TODO(sra): Implement placeholders in VariableDeclaration position: |
// |
// String constructorName = namer.getNameOfClass(classElement); |
@@ -20,10 +20,11 @@ class ClassStubGenerator { |
// [ constructorName, fields, |
// fields.map( |
// (name) => js('this.# = #', [name, name]))])); |
- return js('function(#) { #; this.#();}', |
- [fields, |
- fields.map((name) => js('this.# = #', [name, name])), |
- namer.deferredAction]); |
+ return js('function(#) { #; this.#();}', [ |
+ fields, |
+ fields.map((name) => js('this.# = #', [name, name])), |
+ namer.deferredAction |
+ ]); |
} |
jsAst.Expression generateGetter(Element member, jsAst.Name fieldName) { |
@@ -38,8 +39,8 @@ class ClassStubGenerator { |
String receiver = backend.isInterceptorClass(cls) ? 'receiver' : 'this'; |
List<String> args = backend.isInterceptedMethod(member) ? ['receiver'] : []; |
// TODO(floitsch): remove 'return'? |
- return js('function(#, v) { return #.# = v; }', |
- [args, receiver, fieldName]); |
+ return js( |
+ 'function(#, v) { return #.# = v; }', [args, receiver, fieldName]); |
} |
/** |
@@ -54,8 +55,7 @@ class ClassStubGenerator { |
// If the method is intercepted, the stub gets the |
// receiver explicitely and we need to pass it to the getter call. |
bool isInterceptedMethod = backend.isInterceptedMethod(member); |
- bool isInterceptorClass = |
- backend.isInterceptorClass(member.enclosingClass); |
+ bool isInterceptorClass = backend.isInterceptorClass(member.enclosingClass); |
const String receiverArgumentName = r'$receiver'; |
@@ -75,7 +75,7 @@ class ClassStubGenerator { |
} |
Map<jsAst.Name, jsAst.Expression> generatedStubs = |
- <jsAst.Name, jsAst.Expression>{}; |
+ <jsAst.Name, jsAst.Expression>{}; |
// Two selectors may match but differ only in type. To avoid generating |
// identical stubs for each we track untyped selectors which already have |
@@ -103,9 +103,8 @@ class ClassStubGenerator { |
arguments.add(js('#', name)); |
} |
- jsAst.Fun function = js( |
- 'function(#) { return #.#(#); }', |
- [ parameters, buildGetter(), closureCallName, arguments]); |
+ jsAst.Fun function = js('function(#) { return #.#(#); }', |
+ [parameters, buildGetter(), closureCallName, arguments]); |
generatedStubs[invocationName] = function; |
} |
@@ -115,7 +114,6 @@ class ClassStubGenerator { |
} |
Map<jsAst.Name, Selector> computeSelectorsForNsmHandlers() { |
- |
Map<jsAst.Name, Selector> jsNames = <jsAst.Name, Selector>{}; |
// Do not generate no such method handlers if there is no class. |
@@ -123,8 +121,8 @@ class ClassStubGenerator { |
return jsNames; |
} |
- void addNoSuchMethodHandlers(String ignore, |
- Map<Selector, SelectorConstraints> selectors) { |
+ void addNoSuchMethodHandlers( |
+ String ignore, Map<Selector, SelectorConstraints> selectors) { |
for (Selector selector in selectors.keys) { |
SelectorConstraints maskSet = selectors[selector]; |
if (maskSet.needsNoSuchMethodHandling(selector, compiler.world)) { |
@@ -140,47 +138,47 @@ class ClassStubGenerator { |
return jsNames; |
} |
- StubMethod generateStubForNoSuchMethod(jsAst.Name name, |
- Selector selector) { |
+ StubMethod generateStubForNoSuchMethod(jsAst.Name name, Selector selector) { |
// Values match JSInvocationMirror in js-helper library. |
int type = selector.invocationMirrorKind; |
List<String> parameterNames = |
new List.generate(selector.argumentCount, (i) => '\$$i'); |
- List<jsAst.Expression> argNames = |
- selector.callStructure.getOrderedNamedArguments().map((String name) => |
- js.string(name)).toList(); |
+ List<jsAst.Expression> argNames = selector.callStructure |
+ .getOrderedNamedArguments() |
+ .map((String name) => js.string(name)) |
+ .toList(); |
jsAst.Name methodName = namer.asName(selector.invocationMirrorMemberName); |
jsAst.Name internalName = namer.invocationMirrorInternalName(selector); |
assert(backend.isInterceptedName(Identifiers.noSuchMethod_)); |
bool isIntercepted = backend.isInterceptedName(selector.name); |
- jsAst.Expression expression = |
- js('''this.#noSuchMethodName(#receiver, |
+ jsAst.Expression expression = js( |
+ '''this.#noSuchMethodName(#receiver, |
#createInvocationMirror(#methodName, |
#internalName, |
#type, |
#arguments, |
#namedArguments))''', |
- {'receiver': isIntercepted ? r'$receiver' : 'this', |
- 'noSuchMethodName': namer.noSuchMethodName, |
- 'createInvocationMirror': |
- backend.emitter.staticFunctionAccess( |
- backend.helpers.createInvocationMirror), |
- 'methodName': |
- js.quoteName(compiler.options.enableMinification |
- ? internalName : methodName), |
- 'internalName': js.quoteName(internalName), |
- 'type': js.number(type), |
- 'arguments': |
- new jsAst.ArrayInitializer(parameterNames.map(js).toList()), |
- 'namedArguments': new jsAst.ArrayInitializer(argNames)}); |
+ { |
+ 'receiver': isIntercepted ? r'$receiver' : 'this', |
+ 'noSuchMethodName': namer.noSuchMethodName, |
+ 'createInvocationMirror': backend.emitter |
+ .staticFunctionAccess(backend.helpers.createInvocationMirror), |
+ 'methodName': js.quoteName( |
+ compiler.options.enableMinification ? internalName : methodName), |
+ 'internalName': js.quoteName(internalName), |
+ 'type': js.number(type), |
+ 'arguments': |
+ new jsAst.ArrayInitializer(parameterNames.map(js).toList()), |
+ 'namedArguments': new jsAst.ArrayInitializer(argNames) |
+ }); |
jsAst.Expression function; |
if (isIntercepted) { |
- function = js(r'function($receiver, #) { return # }', |
- [parameterNames, expression]); |
+ function = js( |
+ r'function($receiver, #) { return # }', [parameterNames, expression]); |
} else { |
function = js(r'function(#) { return # }', [parameterNames, expression]); |
} |
@@ -219,8 +217,8 @@ List<jsAst.Statement> buildTearOffCode(JavaScriptBackend backend) { |
js.string(namer.globalObjectFor(closureFromTearOff)); |
} else { |
// Default values for mocked-up test libraries. |
- tearOffAccessExpression = js( |
- r'''function() { throw "Helper 'closureFromTearOff' missing." }'''); |
+ tearOffAccessExpression = |
+ js(r'''function() { throw "Helper 'closureFromTearOff' missing." }'''); |
tearOffGlobalObjectString = js.string('MissingHelperFunction'); |
tearOffGlobalObject = js( |
r'''(function() { throw "Helper 'closureFromTearOff' missing." })()'''); |
@@ -230,7 +228,8 @@ List<jsAst.Statement> buildTearOffCode(JavaScriptBackend backend) { |
if (!compiler.options.useContentSecurityPolicy) { |
jsAst.Expression tearOffAccessText = |
new jsAst.UnparsedNode(tearOffAccessExpression, compiler, false); |
- tearOffGetter = js.statement(''' |
+ tearOffGetter = js.statement( |
+ ''' |
function tearOffGetter(funcs, reflectionInfo, name, isIntercepted) { |
return isIntercepted |
? new Function("funcs", "reflectionInfo", "name", |
@@ -247,11 +246,15 @@ function tearOffGetter(funcs, reflectionInfo, name, isIntercepted) { |
"this, funcs, reflectionInfo, false, [], name);" + |
"return new c(this, funcs[0], null, name);" + |
"}")(funcs, reflectionInfo, name, #tearOffGlobalObject, null); |
-}''', {'tearOffAccessText': tearOffAccessText, |
- 'tearOffGlobalObject': tearOffGlobalObject, |
- 'tearOffGlobalObjectString': tearOffGlobalObjectString}); |
+}''', |
+ { |
+ 'tearOffAccessText': tearOffAccessText, |
+ 'tearOffGlobalObject': tearOffGlobalObject, |
+ 'tearOffGlobalObjectString': tearOffGlobalObjectString |
+ }); |
} else { |
- tearOffGetter = js.statement(''' |
+ tearOffGetter = js.statement( |
+ ''' |
function tearOffGetter(funcs, reflectionInfo, name, isIntercepted) { |
var cache = null; |
return isIntercepted |
@@ -265,10 +268,12 @@ function tearOffGetter(funcs, reflectionInfo, name, isIntercepted) { |
this, funcs, reflectionInfo, false, [], name); |
return new cache(this, funcs[0], null, name); |
}; |
- }''', [tearOffAccessExpression, tearOffAccessExpression]); |
+ }''', |
+ [tearOffAccessExpression, tearOffAccessExpression]); |
} |
- jsAst.Statement tearOff = js.statement(''' |
+ jsAst.Statement tearOff = js.statement( |
+ ''' |
function tearOff(funcs, reflectionInfo, isStatic, name, isIntercepted) { |
var cache; |
return isStatic |
@@ -278,7 +283,8 @@ function tearOffGetter(funcs, reflectionInfo, name, isIntercepted) { |
return cache; |
} |
: tearOffGetter(funcs, reflectionInfo, name, isIntercepted); |
- }''', {'tearOff': tearOffAccessExpression}); |
+ }''', |
+ {'tearOff': tearOffAccessExpression}); |
return <jsAst.Statement>[tearOffGetter, tearOff]; |
} |