| 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);
|
| }
|
| }
|
| -
|
|
|