Index: pkg/compiler/lib/src/js_backend/minify_namer.dart |
diff --git a/pkg/compiler/lib/src/js_backend/minify_namer.dart b/pkg/compiler/lib/src/js_backend/minify_namer.dart |
index 0ba2e4e453e684116b0ae8d0b5e1b9482c70fee0..ff76d87ecf6b385296f3595eb4a2ca8cc1a9b492 100644 |
--- a/pkg/compiler/lib/src/js_backend/minify_namer.dart |
+++ b/pkg/compiler/lib/src/js_backend/minify_namer.dart |
@@ -7,8 +7,11 @@ part of js_backend; |
/** |
* Assigns JavaScript identifiers to Dart variables, class-names and members. |
*/ |
-class MinifyNamer extends Namer with _MinifiedFieldNamer, |
- _MinifyConstructorBodyNamer, _MinifiedOneShotInterceptorNamer { |
+class MinifyNamer extends Namer |
+ with |
+ _MinifiedFieldNamer, |
+ _MinifyConstructorBodyNamer, |
+ _MinifiedOneShotInterceptorNamer { |
MinifyNamer(Compiler compiler) : super(compiler) { |
reserveBackendNames(); |
fieldRegistry = new _FieldNamingRegistry(this); |
@@ -24,8 +27,8 @@ class MinifyNamer extends Namer with _MinifiedFieldNamer, |
final String setterPrefix = 's'; |
final String callPrefix = ''; // this will create function names $<n> |
- final ALPHABET_CHARACTERS = 52; // a-zA-Z. |
- final ALPHANUMERIC_CHARACTERS = 62; // a-zA-Z0-9. |
+ final ALPHABET_CHARACTERS = 52; // a-zA-Z. |
+ final ALPHANUMERIC_CHARACTERS = 62; // a-zA-Z0-9. |
/// You can pass an invalid identifier to this and unlike its non-minifying |
/// counterpart it will never return the proposedName as the new fresh name. |
@@ -33,10 +36,8 @@ class MinifyNamer extends Namer with _MinifiedFieldNamer, |
/// [sanitizeForNatives] and [sanitizeForAnnotations] are ignored because the |
/// minified names will always avoid clashing with annotated names or natives. |
@override |
- String _generateFreshStringForName(String proposedName, |
- NamingScope scope, |
- {bool sanitizeForNatives: false, |
- bool sanitizeForAnnotations: false}) { |
+ String _generateFreshStringForName(String proposedName, NamingScope scope, |
+ {bool sanitizeForNatives: false, bool sanitizeForAnnotations: false}) { |
String freshName; |
String suggestion = scope.suggestName(proposedName); |
if (suggestion != null && scope.isUnused(suggestion)) { |
@@ -53,28 +54,29 @@ class MinifyNamer extends Namer with _MinifiedFieldNamer, |
// OK to use them as fields, as we only access fields directly if we know |
// the receiver type. |
static const List<String> _reservedNativeProperties = const <String>[ |
- 'a', 'b', 'c', 'd', 'e', 'f', 'r', 'x', 'y', 'z', 'Q', |
- // 2-letter: |
- 'ch', 'cx', 'cy', 'db', 'dx', 'dy', 'fr', 'fx', 'fy', 'go', 'id', 'k1', |
- 'k2', 'k3', 'k4', 'r1', 'r2', 'rx', 'ry', 'x1', 'x2', 'y1', 'y2', |
- // 3-letter: |
- 'add', 'all', 'alt', 'arc', 'CCW', 'cmp', 'dir', 'end', 'get', 'in1', |
- 'in2', 'INT', 'key', 'log', 'low', 'm11', 'm12', 'm13', 'm14', 'm21', |
- 'm22', 'm23', 'm24', 'm31', 'm32', 'm33', 'm34', 'm41', 'm42', 'm43', |
- 'm44', 'max', 'min', 'now', 'ONE', 'put', 'red', 'rel', 'rev', 'RGB', |
- 'sdp', 'set', 'src', 'tag', 'top', 'uid', 'uri', 'url', 'URL', |
- // 4-letter: |
- 'abbr', 'atob', 'Attr', 'axes', 'axis', 'back', 'BACK', 'beta', 'bias', |
- 'Blob', 'blue', 'blur', 'BLUR', 'body', 'BOOL', 'BOTH', 'btoa', 'BYTE', |
- 'cite', 'clip', 'code', 'cols', 'cues', 'data', 'DECR', 'DONE', 'face', |
- 'file', 'File', 'fill', 'find', 'font', 'form', 'gain', 'hash', 'head', |
- 'high', 'hint', 'host', 'href', 'HRTF', 'IDLE', 'INCR', 'info', 'INIT', |
- 'isId', 'item', 'KEEP', 'kind', 'knee', 'lang', 'left', 'LESS', 'line', |
- 'link', 'list', 'load', 'loop', 'mode', 'name', 'Node', 'None', 'NONE', |
- 'only', 'open', 'OPEN', 'ping', 'play', 'port', 'rect', 'Rect', 'refX', |
- 'refY', 'RGBA', 'root', 'rows', 'save', 'seed', 'seek', 'self', 'send', |
- 'show', 'SINE', 'size', 'span', 'stat', 'step', 'stop', 'tags', 'text', |
- 'Text', 'time', 'type', 'view', 'warn', 'wrap', 'ZERO']; |
+ 'a', 'b', 'c', 'd', 'e', 'f', 'r', 'x', 'y', 'z', 'Q', |
+ // 2-letter: |
+ 'ch', 'cx', 'cy', 'db', 'dx', 'dy', 'fr', 'fx', 'fy', 'go', 'id', 'k1', |
+ 'k2', 'k3', 'k4', 'r1', 'r2', 'rx', 'ry', 'x1', 'x2', 'y1', 'y2', |
+ // 3-letter: |
+ 'add', 'all', 'alt', 'arc', 'CCW', 'cmp', 'dir', 'end', 'get', 'in1', |
+ 'in2', 'INT', 'key', 'log', 'low', 'm11', 'm12', 'm13', 'm14', 'm21', |
+ 'm22', 'm23', 'm24', 'm31', 'm32', 'm33', 'm34', 'm41', 'm42', 'm43', |
+ 'm44', 'max', 'min', 'now', 'ONE', 'put', 'red', 'rel', 'rev', 'RGB', |
+ 'sdp', 'set', 'src', 'tag', 'top', 'uid', 'uri', 'url', 'URL', |
+ // 4-letter: |
+ 'abbr', 'atob', 'Attr', 'axes', 'axis', 'back', 'BACK', 'beta', 'bias', |
+ 'Blob', 'blue', 'blur', 'BLUR', 'body', 'BOOL', 'BOTH', 'btoa', 'BYTE', |
+ 'cite', 'clip', 'code', 'cols', 'cues', 'data', 'DECR', 'DONE', 'face', |
+ 'file', 'File', 'fill', 'find', 'font', 'form', 'gain', 'hash', 'head', |
+ 'high', 'hint', 'host', 'href', 'HRTF', 'IDLE', 'INCR', 'info', 'INIT', |
+ 'isId', 'item', 'KEEP', 'kind', 'knee', 'lang', 'left', 'LESS', 'line', |
+ 'link', 'list', 'load', 'loop', 'mode', 'name', 'Node', 'None', 'NONE', |
+ 'only', 'open', 'OPEN', 'ping', 'play', 'port', 'rect', 'Rect', 'refX', |
+ 'refY', 'RGBA', 'root', 'rows', 'save', 'seed', 'seek', 'self', 'send', |
+ 'show', 'SINE', 'size', 'span', 'stat', 'step', 'stop', 'tags', 'text', |
+ 'Text', 'time', 'type', 'view', 'warn', 'wrap', 'ZERO' |
+ ]; |
void reserveBackendNames() { |
for (String name in _reservedNativeProperties) { |
@@ -98,43 +100,89 @@ class MinifyNamer extends Namer with _MinifiedFieldNamer, |
// individually per program, but that would mean that the output of the |
// minifier was less stable from version to version of the program being |
// minified. |
- _populateSuggestedNames( |
- instanceScope, |
- const <String>[ |
- r'$add', r'add$1', r'$and', |
- r'$or', |
- r'current', r'$shr', r'$eq', r'$ne', |
- r'$index', r'$indexSet', |
- r'$xor', r'clone$0', |
- r'iterator', r'length', |
- r'$lt', r'$gt', r'$le', r'$ge', |
- r'moveNext$0', r'node', r'on', r'$negate', r'push', r'self', |
- r'start', r'target', r'$shl', r'value', r'width', r'style', |
- r'noSuchMethod$1', r'$mul', r'$div', r'$sub', r'$not', r'$mod', |
- r'$tdiv', r'toString$0']); |
- |
- _populateSuggestedNames( |
- globalScope, |
- const <String>[ |
- r'Object', 'wrapException', r'$eq', r'S', r'ioore', |
- r'UnsupportedError$', r'length', r'$sub', |
- r'$add', r'$gt', r'$ge', r'$lt', r'$le', r'add', |
- r'iae', |
- r'ArgumentError$', r'BoundClosure', r'Closure', r'StateError$', |
- r'getInterceptor', r'max', r'$mul', |
- r'Map', r'Key_Key', r'$div', |
- r'List_List$from', |
- r'LinkedHashMap_LinkedHashMap$_empty', |
- r'LinkedHashMap_LinkedHashMap$_literal', |
- r'min', |
- r'RangeError$value', r'JSString', r'JSNumber', |
- r'JSArray', r'createInvocationMirror', r'String', |
- r'setRuntimeTypeInfo', r'createRuntimeType' |
- ]); |
+ _populateSuggestedNames(instanceScope, const <String>[ |
+ r'$add', |
+ r'add$1', |
+ r'$and', |
+ r'$or', |
+ r'current', |
+ r'$shr', |
+ r'$eq', |
+ r'$ne', |
+ r'$index', |
+ r'$indexSet', |
+ r'$xor', |
+ r'clone$0', |
+ r'iterator', |
+ r'length', |
+ r'$lt', |
+ r'$gt', |
+ r'$le', |
+ r'$ge', |
+ r'moveNext$0', |
+ r'node', |
+ r'on', |
+ r'$negate', |
+ r'push', |
+ r'self', |
+ r'start', |
+ r'target', |
+ r'$shl', |
+ r'value', |
+ r'width', |
+ r'style', |
+ r'noSuchMethod$1', |
+ r'$mul', |
+ r'$div', |
+ r'$sub', |
+ r'$not', |
+ r'$mod', |
+ r'$tdiv', |
+ r'toString$0' |
+ ]); |
+ |
+ _populateSuggestedNames(globalScope, const <String>[ |
+ r'Object', |
+ 'wrapException', |
+ r'$eq', |
+ r'S', |
+ r'ioore', |
+ r'UnsupportedError$', |
+ r'length', |
+ r'$sub', |
+ r'$add', |
+ r'$gt', |
+ r'$ge', |
+ r'$lt', |
+ r'$le', |
+ r'add', |
+ r'iae', |
+ r'ArgumentError$', |
+ r'BoundClosure', |
+ r'Closure', |
+ r'StateError$', |
+ r'getInterceptor', |
+ r'max', |
+ r'$mul', |
+ r'Map', |
+ r'Key_Key', |
+ r'$div', |
+ r'List_List$from', |
+ r'LinkedHashMap_LinkedHashMap$_empty', |
+ r'LinkedHashMap_LinkedHashMap$_literal', |
+ r'min', |
+ r'RangeError$value', |
+ r'JSString', |
+ r'JSNumber', |
+ r'JSArray', |
+ r'createInvocationMirror', |
+ r'String', |
+ r'setRuntimeTypeInfo', |
+ r'createRuntimeType' |
+ ]); |
} |
- void _populateSuggestedNames(NamingScope scope, |
- List<String> suggestions) { |
+ void _populateSuggestedNames(NamingScope scope, List<String> suggestions) { |
int c = $a - 1; |
String letter; |
for (String name in suggestions) { |
@@ -148,7 +196,6 @@ class MinifyNamer extends Namer with _MinifiedFieldNamer, |
} |
} |
- |
// This gets a minified name based on a hash of the proposed name. This |
// is slightly less efficient than just getting the next name in a series, |
// but it means that small changes in the input program will give smallish |
@@ -156,7 +203,7 @@ class MinifyNamer extends Namer with _MinifiedFieldNamer, |
String _getUnusedName(String proposedName, NamingScope scope) { |
int hash = _calculateHash(proposedName); |
// Avoid very small hashes that won't try many names. |
- hash = hash < 1000 ? hash * 314159 : hash; // Yes, it's prime. |
+ hash = hash < 1000 ? hash * 314159 : hash; // Yes, it's prime. |
// Try other n-character names based on the hash. We try one to three |
// character identifiers. For each length we try around 10 different names |
@@ -275,16 +322,16 @@ class _ConstructorBodyNamingScope { |
_startIndex = 0, |
_constructors = cls.constructors.toList(growable: false); |
- _ConstructorBodyNamingScope.forClass(ClassElement cls, |
- _ConstructorBodyNamingScope superScope) |
+ _ConstructorBodyNamingScope.forClass( |
+ ClassElement cls, _ConstructorBodyNamingScope superScope) |
: _superScope = superScope, |
_startIndex = superScope._startIndex + superScope.numberOfConstructors, |
_constructors = cls.constructors.toList(growable: false); |
// Mixin Applications have constructors but we never generate code for them, |
// so they do not count in the inheritance chain. |
- _ConstructorBodyNamingScope.forMixinApplication(ClassElement cls, |
- _ConstructorBodyNamingScope superScope) |
+ _ConstructorBodyNamingScope.forMixinApplication( |
+ ClassElement cls, _ConstructorBodyNamingScope superScope) |
: _superScope = superScope, |
_startIndex = superScope._startIndex + superScope.numberOfConstructors, |
_constructors = const []; |
@@ -295,11 +342,11 @@ class _ConstructorBodyNamingScope { |
if (cls.superclass == null) { |
return new _ConstructorBodyNamingScope.rootScope(cls); |
} else if (cls.isMixinApplication) { |
- return new _ConstructorBodyNamingScope.forMixinApplication(cls, |
- new _ConstructorBodyNamingScope(cls.superclass, registry)); |
+ return new _ConstructorBodyNamingScope.forMixinApplication( |
+ cls, new _ConstructorBodyNamingScope(cls.superclass, registry)); |
} else { |
- return new _ConstructorBodyNamingScope.forClass(cls, |
- new _ConstructorBodyNamingScope(cls.superclass, registry)); |
+ return new _ConstructorBodyNamingScope.forClass( |
+ cls, new _ConstructorBodyNamingScope(cls.superclass, registry)); |
} |
}); |
} |
@@ -317,12 +364,11 @@ abstract class _MinifyConstructorBodyNamer implements Namer { |
@override |
jsAst.Name constructorBodyName(FunctionElement method) { |
- _ConstructorBodyNamingScope scope = |
- new _ConstructorBodyNamingScope(method.enclosingClass, |
- _constructorBodyScopes); |
+ _ConstructorBodyNamingScope scope = new _ConstructorBodyNamingScope( |
+ method.enclosingClass, _constructorBodyScopes); |
String key = scope.constructorBodyKeyFor(method); |
- return _disambiguateMemberByKey(key, |
- () => _proposeNameForConstructorBody(method)); |
+ return _disambiguateMemberByKey( |
+ key, () => _proposeNameForConstructorBody(method)); |
} |
} |
@@ -330,20 +376,18 @@ abstract class _MinifiedOneShotInterceptorNamer implements Namer { |
/// Property name used for the one-shot interceptor method for the given |
/// [selector] and return-type specialization. |
@override |
- jsAst.Name nameForGetOneShotInterceptor(Selector selector, |
- Iterable<ClassElement> classes) { |
+ jsAst.Name nameForGetOneShotInterceptor( |
+ Selector selector, Iterable<ClassElement> classes) { |
String root = selector.isOperator |
? operatorNameToIdentifier(selector.name) |
: privateName(selector.memberName); |
- String prefix = selector.isGetter |
- ? r"$get" |
- : selector.isSetter ? r"$set" : ""; |
- String callSuffix = |
- selector.isCall ? callSuffixForStructure(selector.callStructure).join() |
- : ""; |
+ String prefix = |
+ selector.isGetter ? r"$get" : selector.isSetter ? r"$set" : ""; |
+ String callSuffix = selector.isCall |
+ ? callSuffixForStructure(selector.callStructure).join() |
+ : ""; |
String suffix = suffixForGetInterceptor(classes); |
String fullName = "\$intercepted$prefix\$$root$callSuffix\$$suffix"; |
return _disambiguateInternalGlobal(fullName); |
} |
} |
- |