Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(103)

Unified Diff: sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart

Issue 694353007: Move dart2js from sdk/lib/_internal/compiler to pkg/compiler (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart
deleted file mode 100644
index 414737e2ea38ab7de84f6feaff5444f20ad427ec..0000000000000000000000000000000000000000
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart
+++ /dev/null
@@ -1,362 +0,0 @@
-// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart_backend;
-
-Comparator get _compareNodes =>
- compareBy((n) => n.getBeginToken().charOffset);
-
-abstract class Renamable implements Comparable {
- final int RENAMABLE_TYPE_ELEMENT = 1;
- final int RENAMABLE_TYPE_MEMBER = 2;
- final int RENAMABLE_TYPE_LOCAL = 3;
-
- final Set<Node> nodes;
-
- Renamable(this.nodes);
- int compareTo(Renamable other) {
- int nodesDiff = other.nodes.length.compareTo(this.nodes.length);
- if (nodesDiff != 0) return nodesDiff;
- int typeDiff = this.kind.compareTo(other.kind);
- return typeDiff != 0 ? typeDiff : compareInternals(other);
- }
-
- int compareInternals(Renamable other);
- int get kind;
-
- String createNewName(PlaceholderRenamer placeholderRenamer);
-}
-
-class GlobalRenamable extends Renamable {
- final Entity entity;
-
- GlobalRenamable(this.entity, Set<Node> nodes)
- : super(nodes);
-
- int compareInternals(GlobalRenamable other) =>
- compareElements(this.entity, other.entity);
- int get kind => RENAMABLE_TYPE_ELEMENT;
- String createNewName(PlaceholderRenamer placeholderRenamer) {
- return placeholderRenamer._renameGlobal(entity);
- }
-}
-
-class MemberRenamable extends Renamable {
- final String identifier;
- MemberRenamable(this.identifier, Set<Node> nodes)
- : super(nodes);
- int compareInternals(MemberRenamable other) =>
- this.identifier.compareTo(other.identifier);
- int get kind => RENAMABLE_TYPE_MEMBER;
- String createNewName(PlaceholderRenamer placeholderRenamer) {
- return placeholderRenamer._generateMemberName(identifier);
- }
-}
-
-class LocalRenamable extends Renamable {
- LocalRenamable(Set<Node> nodes)
- : super(nodes);
- int compareInternals(LocalRenamable other) =>
- _compareNodes(sorted(this.nodes, _compareNodes)[0],
- sorted(other.nodes, _compareNodes)[0]);
- int get kind => RENAMABLE_TYPE_LOCAL;
- String createNewName(PlaceholderRenamer placeholderRenamer) {
- return placeholderRenamer._generateUniqueTopLevelName("");
- }
-}
-
-/**
- * Renames only top-level elements that would lead to ambiguity if not renamed.
- */
-class PlaceholderRenamer {
- /// After running [computeRenames] this will contain the computed renames.
- final Map<Node, String> renames = new Map<Node, String>();
- /// After running [computeRenames] this will contain the used platform
- /// libraries.
- final Set<LibraryElement> platformImports = new Set<LibraryElement>();
-
- final bool enableMinification;
- final Set<String> fixedMemberNames;
- final Map<Element, LibraryElement> reexportingLibraries;
- final bool cutDeclarationTypes;
-
- final Map<Entity, String> _renamedCache = new Map<Entity, String>();
- final Map<Entity, Map<String, String>> _privateCache =
- new Map<Entity, Map<String, String>>();
-
- // Identifiers that has already been used, or are reserved by the
- // language/platform.
- Set<String> _forbiddenIdentifiers;
- Set<String> _allNamedParameterIdentifiers;
-
- Generator _generator;
-
- PlaceholderRenamer(this.fixedMemberNames,
- this.reexportingLibraries,
- {this.enableMinification, this.cutDeclarationTypes});
-
- void _renameNodes(Iterable<Node> nodes, String renamer(Node node)) {
- for (Node node in sorted(nodes, _compareNodes)) {
- renames[node] = renamer(node);
- }
- }
-
- String _generateUniqueTopLevelName(originalName) {
- String newName = _generator.generate(originalName, (name) {
- return _forbiddenIdentifiers.contains(name) ||
- _allNamedParameterIdentifiers.contains(name);
- });
- _forbiddenIdentifiers.add(newName);
- return newName;
- }
-
- String _generateMemberName(String original) {
- return _generator.generate(original, _forbiddenIdentifiers.contains);
- }
-
- /// Looks up [originalName] in the [_privateCache] cache of [library].
- /// If [originalName] was not renamed before, generate a new name.
- String _getPrivateName(LibraryElement library, String originalName) {
- return _privateCache.putIfAbsent(library, () => new Map<String, String>())
- .putIfAbsent(originalName,
- () => _generateUniqueTopLevelName(originalName));
- }
-
- String _renameConstructor(ConstructorPlaceholder placeholder) {
- String name = placeholder.element.name;
- if (name == '') return "";
- String result = _renameGlobal(placeholder.element);
- return result;
- }
-
- String _renameGlobal(Entity entity) {
- assert(entity is! Element ||
- Elements.isErroneousElement(entity) ||
- Elements.isStaticOrTopLevel(entity) ||
- entity is TypeVariableElement);
- // TODO(smok): We may want to reuse class static field and method names.
- if (entity is Element) {
- LibraryElement library = entity.library;
- if (reexportingLibraries.containsKey(entity)) {
- library = reexportingLibraries[entity];
- }
- if (library.isPlatformLibrary) {
- if (library.canonicalUri != Compiler.DART_CORE) {
- platformImports.add(library);
- }
- if (library.isInternalLibrary) {
- throw new SpannableAssertionFailure(entity,
- "Internal library $library should never have been imported from "
- "the code compiled by dart2dart.");
- }
- return entity.name;
- }
- }
- String name = _renamedCache.putIfAbsent(entity,
- () => _generateUniqueTopLevelName(entity.name));
- // Look up in [_renamedCache] for a name for [entity] .
- // If it was not renamed before, generate a new name.
- return name;
- }
-
- void _computeMinifiedRenames(PlaceholderCollector placeholderCollector) {
- _generator = new MinifyingGenerator();
-
- // Build a list sorted by usage of local nodes that will be renamed to
- // the same identifier. So the top-used local variables in all functions
- // will be renamed first and will all share the same new identifier.
- int maxLength = placeholderCollector.functionScopes.values.fold(0,
- (a, b) => max(a, b.localPlaceholders.length));
-
- List<Set<Node>> allLocals = new List<Set<Node>>
- .generate(maxLength, (_) => new Set<Node>());
-
- for (FunctionScope functionScope
- in placeholderCollector.functionScopes.values) {
- // Add current sorted local identifiers to the whole sorted list
- // of all local identifiers for all functions.
- List<LocalPlaceholder> currentSortedPlaceholders =
- sorted(functionScope.localPlaceholders,
- compareBy((LocalPlaceholder ph) => -ph.nodes.length));
-
- List<Set<Node>> currentSortedNodes = currentSortedPlaceholders
- .map((LocalPlaceholder ph) => ph.nodes).toList();
-
- for (int i = 0; i < currentSortedNodes.length; i++) {
- allLocals[i].addAll(currentSortedNodes[i]);
- }
- }
-
- // Rename elements, members and locals together based on their usage
- // count, otherwise when we rename elements first there will be no good
- // identifiers left for members even if they are used often.
- List<Renamable> renamables = new List<Renamable>();
- placeholderCollector.elementNodes.forEach(
- (Element element, Set<Node> nodes) {
- renamables.add(new GlobalRenamable(element, nodes));
- });
- placeholderCollector.memberPlaceholders.forEach(
- (String memberName, Set<Identifier> identifiers) {
- renamables.add(new MemberRenamable(memberName, identifiers));
- });
- for (Set<Node> localIdentifiers in allLocals) {
- renamables.add(new LocalRenamable(localIdentifiers));
- }
- renamables.sort();
- for (Renamable renamable in renamables) {
- String newName = renamable.createNewName(this);
- _renameNodes(renamable.nodes, (_) => newName);
- }
- }
-
- void _computeNonMinifiedRenames(PlaceholderCollector placeholderCollector) {
- _generator = new ConservativeGenerator();
- // Rename elements.
- placeholderCollector.elementNodes.forEach(
- (Element element, Set<Node> nodes) {
- _renameNodes(nodes, (_) => _renameGlobal(element));
- });
-
- // Rename locals.
- placeholderCollector.functionScopes.forEach(
- (functionElement, functionScope) {
-
- Set<String> memberIdentifiers = new Set<String>();
- Set<LocalPlaceholder> placeholders = functionScope.localPlaceholders;
- if (functionElement.enclosingClass != null) {
- functionElement.enclosingClass.forEachMember(
- (enclosingClass, member) {
- memberIdentifiers.add(member.name);
- });
- }
- Set<String> usedLocalIdentifiers = new Set<String>();
- for (LocalPlaceholder placeholder in placeholders) {
- String nextId = _generator.generate(placeholder.identifier, (name) {
- return functionScope.parameterIdentifiers.contains(name)
- || _forbiddenIdentifiers.contains(name)
- || usedLocalIdentifiers.contains(name)
- || memberIdentifiers.contains(name);
- });
- usedLocalIdentifiers.add(nextId);
- _renameNodes(placeholder.nodes, (_) => nextId);
- }
- });
-
- // Do not rename members to top-levels, that allows to avoid renaming
- // members to constructors.
- placeholderCollector.memberPlaceholders.forEach((identifier, nodes) {
- String newIdentifier = _generateMemberName(identifier);
- _renameNodes(nodes, (_) => newIdentifier);
- });
- }
-
- /// Finds renamings for all the placeholders in [placeholderCollector] and
- /// stores them in [renames].
- /// Also adds to [platformImports] all the platform-libraries that are used.
- void computeRenames(PlaceholderCollector placeholderCollector) {
- _allNamedParameterIdentifiers = new Set<String>();
- for (FunctionScope functionScope in
- placeholderCollector.functionScopes.values) {
- _allNamedParameterIdentifiers.addAll(functionScope.parameterIdentifiers);
- }
-
- _forbiddenIdentifiers = new Set<String>.from(fixedMemberNames);
- _forbiddenIdentifiers.addAll(Keyword.keywords.keys);
- _forbiddenIdentifiers.add('main');
-
- if (enableMinification) {
- _computeMinifiedRenames(placeholderCollector);
- } else {
- _computeNonMinifiedRenames(placeholderCollector);
- }
-
- // Rename constructors.
- for (ConstructorPlaceholder placeholder in
- placeholderCollector.constructorPlaceholders) {
- renames[placeholder.node] =
- _renameConstructor(placeholder);
- };
-
- // Rename private identifiers uniquely for each library.
- placeholderCollector.privateNodes.forEach(
- (LibraryElement library, Set<Identifier> identifiers) {
- for (Identifier identifier in identifiers) {
- renames[identifier] = _getPrivateName(library, identifier.source);
- }
- });
-
- // Rename unresolved nodes, to make sure they still do not resolve.
- for (Node node in placeholderCollector.unresolvedNodes) {
- renames[node] = _generateUniqueTopLevelName('Unresolved');
- }
-
- // Erase prefixes that are now not needed.
- for (Node node in placeholderCollector.prefixNodesToErase) {
- renames[node] = '';
- }
-
- if (cutDeclarationTypes) {
- for (DeclarationTypePlaceholder placeholder in
- placeholderCollector.declarationTypePlaceholders) {
- renames[placeholder.typeNode] = placeholder.requiresVar ? 'var' : '';
- }
- }
- }
-}
-
-/**
- * Generates mini ID based on index.
- * In other words, it converts index to visual representation
- * as if digits are given characters.
- */
-String generateMiniId(int index) {
- const String firstCharAlphabet =
- r'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
- const String otherCharsAlphabet =
- r'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_$';
- // It's like converting index in decimal to [chars] radix.
- if (index < firstCharAlphabet.length) return firstCharAlphabet[index];
- StringBuffer resultBuilder = new StringBuffer();
- resultBuilder.writeCharCode(
- firstCharAlphabet.codeUnitAt(index % firstCharAlphabet.length));
- index ~/= firstCharAlphabet.length;
- int length = otherCharsAlphabet.length;
- while (index >= length) {
- resultBuilder.writeCharCode(otherCharsAlphabet.codeUnitAt(index % length));
- index ~/= length;
- }
- resultBuilder.write(otherCharsAlphabet[index]);
- return resultBuilder.toString();
-}
-
-abstract class Generator {
- String generate(String originalName, bool isForbidden(String name));
-}
-
-/// Always tries to return original identifier name unless it is forbidden.
-class ConservativeGenerator implements Generator {
- String generate(String originalName, bool isForbidden(String name)) {
- String result = originalName;
- int index = 0;
- while (isForbidden(result) ){ //|| result == originalName) {
- result = '${originalName}_${generateMiniId(index++)}';
- }
- return result;
- }
-}
-
-/// Always tries to generate the most compact identifier.
-class MinifyingGenerator implements Generator {
- int index = 0;
-
- MinifyingGenerator();
-
- String generate(String originalName, bool isForbidden(String name)) {
- String result;
- do {
- result = generateMiniId(index++);
- } while (isForbidden(result));
- return result;
- }
-}

Powered by Google App Engine
This is Rietveld 408576698