| 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 b781bc0ad0eb9a8155c638cb272e0a126a786f64..0ba2e4e453e684116b0ae8d0b5e1b9482c70fee0 100644
|
| --- a/pkg/compiler/lib/src/js_backend/minify_namer.dart
|
| +++ b/pkg/compiler/lib/src/js_backend/minify_namer.dart
|
| @@ -34,19 +34,17 @@ class MinifyNamer extends Namer with _MinifiedFieldNamer,
|
| /// minified names will always avoid clashing with annotated names or natives.
|
| @override
|
| String _generateFreshStringForName(String proposedName,
|
| - Set<String> usedNames,
|
| - Map<String, String> suggestedNames,
|
| + NamingScope scope,
|
| {bool sanitizeForNatives: false,
|
| bool sanitizeForAnnotations: false}) {
|
| String freshName;
|
| - String suggestion = suggestedNames[proposedName];
|
| - if (suggestion != null && !usedNames.contains(suggestion)) {
|
| + String suggestion = scope.suggestName(proposedName);
|
| + if (suggestion != null && scope.isUnused(suggestion)) {
|
| freshName = suggestion;
|
| } else {
|
| - freshName = _getUnusedName(proposedName, usedNames,
|
| - suggestedNames.values);
|
| + freshName = _getUnusedName(proposedName, scope);
|
| }
|
| - usedNames.add(freshName);
|
| + scope.registerUse(freshName);
|
| return freshName;
|
| }
|
|
|
| @@ -85,12 +83,14 @@ class MinifyNamer extends Namer with _MinifiedFieldNamer,
|
| String disambiguatedName = name;
|
| reservePublicMemberName(name, disambiguatedName);
|
| }
|
| - usedInstanceNames.add(name);
|
| + instanceScope.registerUse(name);
|
| // Getter and setter names are autogenerated by prepending 'g' and 's' to
|
| // field names. Therefore there are some field names we don't want to
|
| // use. It is implicit in the next line that the banned prefix is
|
| // only one character.
|
| - if (_hasBannedPrefix(name)) usedInstanceNames.add(name.substring(1));
|
| + if (_hasBannedPrefix(name)) {
|
| + instanceScope.registerUse(name.substring(1));
|
| + }
|
| }
|
|
|
| // These popular names are present in most programs and deserve
|
| @@ -99,8 +99,7 @@ class MinifyNamer extends Namer with _MinifiedFieldNamer,
|
| // minifier was less stable from version to version of the program being
|
| // minified.
|
| _populateSuggestedNames(
|
| - suggestedInstanceNames,
|
| - usedInstanceNames,
|
| + instanceScope,
|
| const <String>[
|
| r'$add', r'add$1', r'$and',
|
| r'$or',
|
| @@ -115,8 +114,7 @@ class MinifyNamer extends Namer with _MinifiedFieldNamer,
|
| r'$tdiv', r'toString$0']);
|
|
|
| _populateSuggestedNames(
|
| - suggestedGlobalNames,
|
| - usedGlobalNames,
|
| + globalScope,
|
| const <String>[
|
| r'Object', 'wrapException', r'$eq', r'S', r'ioore',
|
| r'UnsupportedError$', r'length', r'$sub',
|
| @@ -135,8 +133,7 @@ class MinifyNamer extends Namer with _MinifiedFieldNamer,
|
| ]);
|
| }
|
|
|
| - void _populateSuggestedNames(Map<String, String> suggestionMap,
|
| - Set<String> used,
|
| + void _populateSuggestedNames(NamingScope scope,
|
| List<String> suggestions) {
|
| int c = $a - 1;
|
| String letter;
|
| @@ -145,9 +142,9 @@ class MinifyNamer extends Namer with _MinifiedFieldNamer,
|
| assert(c != $Z);
|
| c = (c == $z) ? $A : c + 1;
|
| letter = new String.fromCharCodes([c]);
|
| - } while (_hasBannedPrefix(letter) || used.contains(letter));
|
| - assert(suggestionMap[name] == null);
|
| - suggestionMap[name] = letter;
|
| + } while (_hasBannedPrefix(letter) || scope.isUsed(letter));
|
| + assert(!scope.hasSuggestion(name));
|
| + scope.addSuggestion(name, letter);
|
| }
|
| }
|
|
|
| @@ -156,8 +153,7 @@ class MinifyNamer extends Namer with _MinifiedFieldNamer,
|
| // 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
|
| // changes in the output, which can be useful for diffing etc.
|
| - String _getUnusedName(String proposedName, Set<String> usedNames,
|
| - Iterable<String> suggestions) {
|
| + 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.
|
| @@ -177,10 +173,10 @@ class MinifyNamer extends Namer with _MinifiedFieldNamer,
|
| h2 ~/= ALPHANUMERIC_CHARACTERS;
|
| }
|
| final candidate = new String.fromCharCodes(codes);
|
| - if (!usedNames.contains(candidate) &&
|
| + if (scope.isUnused(candidate) &&
|
| !jsReserved.contains(candidate) &&
|
| !_hasBannedPrefix(candidate) &&
|
| - (n != 1 || !suggestions.contains(candidate))) {
|
| + (n != 1 || scope.isSuggestion(candidate))) {
|
| return candidate;
|
| }
|
| // Try again with a slightly different hash. After around 10 turns
|
| @@ -188,7 +184,7 @@ class MinifyNamer extends Namer with _MinifiedFieldNamer,
|
| h ~/= 7;
|
| }
|
| }
|
| - return _badName(hash, usedNames);
|
| + return _badName(hash, scope);
|
| }
|
|
|
| /// Instance members starting with g and s are reserved for getters and
|
| @@ -217,7 +213,7 @@ class MinifyNamer extends Namer with _MinifiedFieldNamer,
|
|
|
| /// If we can't find a hash based name in the three-letter space, then base
|
| /// the name on a letter and a counter.
|
| - String _badName(int hash, Set<String> usedNames) {
|
| + String _badName(int hash, NamingScope scope) {
|
| int count = _badNames.putIfAbsent(hash, () => 0);
|
| String startLetter =
|
| new String.fromCharCodes([_letterNumber(hash + count)]);
|
| @@ -226,7 +222,7 @@ class MinifyNamer extends Namer with _MinifiedFieldNamer,
|
| int i = 0;
|
| do {
|
| name = "$startLetter${i++}";
|
| - } while (usedNames.contains(name));
|
| + } while (scope.isUsed(name));
|
| // We don't need to check for banned prefix because the name is in the form
|
| // xnnn, where nnn is a number. There can be no getter or setter called
|
| // gnnn since that would imply a numeric field name.
|
|
|