Index: pkg/compiler/lib/src/js_emitter/full_emitter/nsm_emitter.dart |
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/nsm_emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/nsm_emitter.dart |
index d3426426ac9a3787359758018e370d39c16f1931..906eb731ffe84787c281722adef49dc4ed45ebb4 100644 |
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/nsm_emitter.dart |
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/nsm_emitter.dart |
@@ -19,22 +19,20 @@ class NsmEmitter extends CodeEmitterHelper { |
static const MAX_MINIFIED_LENGTH_FOR_DIFF_ENCODING = 4; |
void emitNoSuchMethodHandlers(AddPropertyFunction addProperty) { |
- |
ClassStubGenerator generator = |
new ClassStubGenerator(compiler, namer, backend); |
// Keep track of the JavaScript names we've already added so we |
// do not introduce duplicates (bad for code size). |
- Map<jsAst.Name, Selector> addedJsNames |
- = generator.computeSelectorsForNsmHandlers(); |
+ Map<jsAst.Name, Selector> addedJsNames = |
+ generator.computeSelectorsForNsmHandlers(); |
// Set flag used by generateMethod helper below. If we have very few |
// handlers we use addProperty for them all, rather than try to generate |
// them at runtime. |
bool haveVeryFewNoSuchMemberHandlers = |
(addedJsNames.length < VERY_FEW_NO_SUCH_METHOD_HANDLERS); |
- List<jsAst.Name> names = addedJsNames.keys.toList() |
- ..sort(); |
+ List<jsAst.Name> names = addedJsNames.keys.toList()..sort(); |
for (jsAst.Name jsName in names) { |
Selector selector = addedJsNames[jsName]; |
String reflectionName = emitter.getReflectionName(selector, jsName); |
@@ -43,9 +41,10 @@ class NsmEmitter extends CodeEmitterHelper { |
emitter.mangledFieldNames[jsName] = reflectionName; |
} |
- 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(); |
int type = selector.invocationMirrorKind; |
if (!haveVeryFewNoSuchMemberHandlers && |
isTrivialNsmHandler(type, argNames, selector, jsName) && |
@@ -56,11 +55,11 @@ class NsmEmitter extends CodeEmitterHelper { |
generator.generateStubForNoSuchMethod(jsName, selector); |
addProperty(method.name, method.code); |
if (reflectionName != null) { |
- bool accessible = |
- compiler.world.allFunctions.filter(selector, null).any( |
- (Element e) => backend.isAccessibleByReflection(e)); |
- addProperty(namer.asName('+$reflectionName'), |
- js(accessible ? '2' : '0')); |
+ bool accessible = compiler.world.allFunctions |
+ .filter(selector, null) |
+ .any((Element e) => backend.isAccessibleByReflection(e)); |
+ addProperty( |
+ namer.asName('+$reflectionName'), js(accessible ? '2' : '0')); |
} |
} |
} |
@@ -127,10 +126,10 @@ class NsmEmitter extends CodeEmitterHelper { |
// Find out how many selectors there are with the special calling |
// convention. |
- Iterable<Selector> interceptedSelectors = trivialNsmHandlers.where( |
- (Selector s) => backend.isInterceptedName(s.name)); |
- Iterable<Selector> ordinarySelectors = trivialNsmHandlers.where( |
- (Selector s) => !backend.isInterceptedName(s.name)); |
+ Iterable<Selector> interceptedSelectors = trivialNsmHandlers |
+ .where((Selector s) => backend.isInterceptedName(s.name)); |
+ Iterable<Selector> ordinarySelectors = trivialNsmHandlers |
+ .where((Selector s) => !backend.isInterceptedName(s.name)); |
// Get the short names (JS names, perhaps minified). |
Iterable<jsAst.Name> interceptedShorts = |
@@ -142,20 +141,19 @@ class NsmEmitter extends CodeEmitterHelper { |
Iterable<String> sortedLongs; |
if (useDiffEncoding) { |
assert(minify); |
- sortedShorts = new _DiffEncodedListOfNames( |
- [interceptedShorts, ordinaryShorts]); |
+ sortedShorts = |
+ new _DiffEncodedListOfNames([interceptedShorts, ordinaryShorts]); |
} else { |
Iterable<Selector> sorted = |
[interceptedSelectors, ordinarySelectors].expand((e) => (e)); |
sortedShorts = js.concatenateStrings( |
- js.joinLiterals( |
- sorted.map(namer.invocationMirrorInternalName), |
+ js.joinLiterals(sorted.map(namer.invocationMirrorInternalName), |
js.stringPart(",")), |
addQuotes: true); |
if (!minify) { |
- sortedLongs = sorted.map((selector) => |
- selector.invocationMirrorMemberName); |
+ sortedLongs = |
+ sorted.map((selector) => selector.invocationMirrorMemberName); |
} |
} |
// Startup code that loops over the method names and puts handlers on the |
@@ -164,7 +162,8 @@ class NsmEmitter extends CodeEmitterHelper { |
jsAst.Expression createInvocationMirror = backend.emitter |
.staticFunctionAccess(backend.helpers.createInvocationMirror); |
if (useDiffEncoding) { |
- statements.add(js.statement('''{ |
+ statements.add(js.statement( |
+ '''{ |
var objectClassObject = processedClasses.collected[#objectClass], |
nameSequences = #diffEncoding.split("."), |
shortNames = []; |
@@ -204,32 +203,37 @@ class NsmEmitter extends CodeEmitterHelper { |
Array.prototype.push.apply(shortNames, sequence.shift()); |
} |
} |
- }''', {'objectClass': js.quoteName(namer.className(objectClass)), |
- 'diffEncoding': sortedShorts})); |
+ }''', |
+ { |
+ 'objectClass': js.quoteName(namer.className(objectClass)), |
+ 'diffEncoding': sortedShorts |
+ })); |
} else { |
// No useDiffEncoding version. |
statements.add(js.statement( |
'var objectClassObject = processedClasses.collected[#objectClass],' |
' shortNames = #diffEncoding.split(",")', |
- {'objectClass': js.quoteName(namer.className(objectClass)), |
- 'diffEncoding': sortedShorts})); |
+ { |
+ 'objectClass': js.quoteName(namer.className(objectClass)), |
+ 'diffEncoding': sortedShorts |
+ })); |
if (!minify) { |
statements.add(js.statement('var longNames = #longs.split(",")', |
- {'longs': js.string(sortedLongs.join(','))})); |
+ {'longs': js.string(sortedLongs.join(','))})); |
} |
- statements.add(js.statement( |
- 'if (objectClassObject instanceof Array)' |
+ statements.add(js.statement('if (objectClassObject instanceof Array)' |
' objectClassObject = objectClassObject[1];')); |
} |
- dynamic isIntercepted = // jsAst.Expression or bool. |
+ dynamic isIntercepted = // jsAst.Expression or bool. |
interceptedSelectors.isEmpty |
? false |
: ordinarySelectors.isEmpty |
? true |
: js('j < #', js.number(interceptedSelectors.length)); |
- statements.add(js.statement(''' |
+ statements.add(js.statement( |
+ ''' |
// If we are loading a deferred library the object class will not be in |
// the collectedClasses so objectClassObject is undefined, and we skip |
// setting up the names. |
@@ -276,11 +280,13 @@ class NsmEmitter extends CodeEmitterHelper { |
})(#names[j], shortName, type); |
} |
} |
- }''', { |
+ }''', |
+ { |
'noSuchMethodName': namer.noSuchMethodName, |
'createInvocationMirror': createInvocationMirror, |
'names': minify ? 'shortNames' : 'longNames', |
- 'isIntercepted': isIntercepted})); |
+ 'isIntercepted': isIntercepted |
+ })); |
return statements; |
} |
@@ -291,7 +297,7 @@ class NsmEmitter extends CodeEmitterHelper { |
/// |
/// See [buildTrivialNsmHandlers]. |
class _DiffEncodedListOfNames extends jsAst.DeferredString |
- implements jsAst.AstContainer { |
+ implements jsAst.AstContainer { |
String _cachedValue; |
List<jsAst.ArrayInitializer> ast; |
@@ -300,12 +306,13 @@ class _DiffEncodedListOfNames extends jsAst.DeferredString |
_DiffEncodedListOfNames(Iterable<Iterable<jsAst.Name>> names) { |
// Store the names in ArrayInitializer nodes to make them discoverable |
// by traversals of the ast. |
- ast = names.map((Iterable i) => new jsAst.ArrayInitializer(i.toList())) |
- .toList(); |
+ ast = names |
+ .map((Iterable i) => new jsAst.ArrayInitializer(i.toList())) |
+ .toList(); |
} |
- void _computeDiffEncodingForList(Iterable<jsAst.Name> names, |
- StringBuffer diffEncoding) { |
+ void _computeDiffEncodingForList( |
+ Iterable<jsAst.Name> names, StringBuffer diffEncoding) { |
// Treat string as a number in base 88 with digits in ASCII order from # to |
// z. The short name sorting is based on length, and uses ASCII order for |
// equal length strings so this means that names are ascending. The hash |
@@ -344,10 +351,8 @@ class _DiffEncodedListOfNames extends jsAst.DeferredString |
return a.compareTo(b); |
} |
- List<String> shorts = |
- names.map((jsAst.Name name) => name.name) |
- .toList() |
- ..sort(compare); |
+ List<String> shorts = names.map((jsAst.Name name) => name.name).toList() |
+ ..sort(compare); |
int previous = 0; |
for (String short in shorts) { |