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

Unified Diff: lib/compiler/implementation/namer.dart

Issue 10915104: Move namer into javascript backend. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 3 months 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: lib/compiler/implementation/namer.dart
diff --git a/lib/compiler/implementation/namer.dart b/lib/compiler/implementation/namer.dart
deleted file mode 100644
index 9f2897df2698a4914bba7a95677308d725776916..0000000000000000000000000000000000000000
--- a/lib/compiler/implementation/namer.dart
+++ /dev/null
@@ -1,313 +0,0 @@
-// Copyright (c) 2011, 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.
-
-/**
- * Assigns JavaScript identifiers to Dart variables, class-names and members.
- */
-class Namer {
- final Compiler compiler;
-
- static Set<String> _jsReserved = null;
- Set<String> get jsReserved {
- if (_jsReserved === null) {
- _jsReserved = new Set<String>();
- _jsReserved.addAll(JsNames.javaScriptKeywords);
- _jsReserved.addAll(JsNames.reservedPropertySymbols);
- }
- return _jsReserved;
- }
-
- Map<Element, String> globals;
- Map<String, int> usedGlobals;
- Map<String, LibraryElement> shortPrivateNameOwners;
-
- Namer(this.compiler)
- : globals = new Map<Element, String>(),
- usedGlobals = new Map<String, int>(),
- shortPrivateNameOwners = new Map<String, LibraryElement>();
-
- final String CURRENT_ISOLATE = @'$';
- final String ISOLATE = 'Isolate';
- final String ISOLATE_PROPERTIES = @"$isolateProperties";
- /** Some closures must contain their name. The name is stored in
- * [STATIC_CLOSURE_NAME_NAME]. */
- final String STATIC_CLOSURE_NAME_NAME = @'$name';
- static const SourceString CLOSURE_INVOCATION_NAME =
- Compiler.CALL_OPERATOR_NAME;
-
-
- String closureInvocationName(Selector selector) {
- // TODO(floitsch): mangle, while not conflicting with instance names.
- return instanceMethodInvocationName(null, CLOSURE_INVOCATION_NAME,
- selector);
- }
-
- String breakLabelName(LabelElement label) {
- return '\$${label.labelName}\$${label.target.nestingLevel}';
- }
-
- String implicitBreakLabelName(TargetElement target) {
- return '\$${target.nestingLevel}';
- }
-
- // We sometimes handle continue targets differently from break targets,
- // so we have special continue-only labels.
- String continueLabelName(LabelElement label) {
- return 'c\$${label.labelName}\$${label.target.nestingLevel}';
- }
-
- String implicitContinueLabelName(TargetElement target) {
- return 'c\$${target.nestingLevel}';
- }
-
- /** Returns a non-unique name for the given closure element. */
- String closureName(Element element) {
- List<String> parts = <String>[];
- SourceString ownName = element.name;
- if (ownName == null || ownName.stringValue == "") {
- parts.add("anon");
- } else {
- parts.add(ownName.slowToString());
- }
- for (Element enclosingElement = element.enclosingElement;
- enclosingElement != null &&
- (enclosingElement.kind === ElementKind.GENERATIVE_CONSTRUCTOR_BODY
- || enclosingElement.kind === ElementKind.CLASS
- || enclosingElement.kind === ElementKind.FUNCTION
- || enclosingElement.kind === ElementKind.GETTER
- || enclosingElement.kind === ElementKind.SETTER);
- enclosingElement = enclosingElement.enclosingElement) {
- SourceString surroundingName = enclosingElement.name;
- if (surroundingName != null) {
- String surroundingNameString = surroundingName.slowToString();
- if (surroundingNameString != "") parts.add(surroundingNameString);
- }
- }
- // Invert the parts.
- for (int i = 0, j = parts.length - 1; i < j; i++, j--) {
- var tmp = parts[i];
- parts[i] = parts[j];
- parts[j] = tmp;
- }
- return safeName(Strings.join(parts, "_"));
- }
-
- String privateName(LibraryElement lib, SourceString name) {
- if (name.isPrivate()) {
- String nameString = name.slowToString();
- // The first library asking for a short private name wins.
- LibraryElement owner =
- shortPrivateNameOwners.putIfAbsent(nameString, () => lib);
- // If a private name could clash with a mangled private name we don't
- // use the short name. For example a private name "_lib3_foo" would
- // clash with "_foo" from "lib3".
- if (owner === lib && !nameString.startsWith('_$LIBRARY_PREFIX')) {
- return nameString;
- }
- String libName = getName(lib);
- // If a library name does not start with the [LIBRARY_PREFIX] then our
- // assumptions about clashing with mangled private members do not hold.
- assert(libName.startsWith(LIBRARY_PREFIX));
- return '_$libName$nameString';
- } else {
- return name.slowToString();
- }
- }
-
- String instanceMethodName(LibraryElement lib, SourceString name, int arity) {
- return '${privateName(lib, name)}\$$arity';
- }
-
- String instanceMethodInvocationName(LibraryElement lib, SourceString name,
- Selector selector) {
- // TODO(floitsch): mangle, while preserving uniqueness.
- StringBuffer buffer = new StringBuffer();
- List<SourceString> names = selector.getOrderedNamedArguments();
- for (SourceString argumentName in names) {
- buffer.add(@'$');
- argumentName.printOn(buffer);
- }
- return '${privateName(lib, name)}\$${selector.argumentCount}$buffer';
- }
-
- String instanceFieldName(LibraryElement libraryElement, SourceString name) {
- String proposedName = privateName(libraryElement, name);
- return safeName(proposedName);
- }
-
- String shadowedFieldName(Element fieldElement) {
- ClassElement cls = fieldElement.getEnclosingClass();
- LibraryElement libraryElement = fieldElement.getLibrary();
- String libName = getName(libraryElement);
- String clsName = getName(cls);
- String instanceName = instanceFieldName(libraryElement, fieldElement.name);
- return safeName('$libName\$$clsName\$$instanceName');
- }
-
- String setterName(LibraryElement lib, SourceString name) {
- // We dynamically create setters from the field-name. The setter name must
- // therefore be derived from the instance field-name.
- String fieldName = safeName(privateName(lib, name));
- return 'set\$$fieldName';
- }
-
- String getterName(LibraryElement lib, SourceString name) {
- // We dynamically create getters from the field-name. The getter name must
- // therefore be derived from the instance field-name.
- String fieldName = safeName(privateName(lib, name));
- return 'get\$$fieldName';
- }
-
- String getFreshGlobalName(String proposedName) {
- String name = proposedName;
- int count = usedGlobals[name];
- if (count !== null) {
- // Not the first time we see this name. Append a number to make it unique.
- do {
- name = '$proposedName${count++}';
- } while (usedGlobals[name] !== null);
- // Record the count in case we see this name later. We
- // frequently see names multiple times, as all our closures use
- // the same name for their class.
- usedGlobals[proposedName] = count;
- }
- usedGlobals[name] = 0;
- return name;
- }
-
- static const String LIBRARY_PREFIX = "lib";
-
- /**
- * Returns a preferred JS-id for the given top-level or static element.
- * The returned id is guaranteed to be a valid JS-id.
- */
- String _computeGuess(Element element) {
- assert(!element.isInstanceMember());
- LibraryElement lib = element.getLibrary();
- String name;
- if (element.isGenerativeConstructor()) {
- if (element.name == element.getEnclosingClass().name) {
- // Keep the class name for the class and not the factory.
- name = "${element.name.slowToString()}\$";
- } else {
- name = element.name.slowToString();
- }
- } else if (Elements.isStaticOrTopLevel(element)) {
- if (element.isMember()) {
- ClassElement enclosingClass = element.getEnclosingClass();
- name = "${enclosingClass.name.slowToString()}_"
- "${element.name.slowToString()}";
- } else {
- name = element.name.slowToString();
- }
- } else if (element.kind === ElementKind.LIBRARY) {
- name = LIBRARY_PREFIX;
- } else {
- name = element.name.slowToString();
- }
- // Prefix the name with '$' if it is reserved.
- return safeName(name);
- }
-
- String getBailoutName(Element element) {
- return '${getName(element)}\$bailout';
- }
-
- /**
- * Returns a preferred JS-id for the given element. The returned id is
- * guaranteed to be a valid JS-id. Globals and static fields are furthermore
- * guaranteed to be unique.
- *
- * For accessing statics consider calling
- * [isolateAccess]/[isolateBailoutAccess] or [isolatePropertyAccess] instead.
- */
- String getName(Element element) {
- if (element.isInstanceMember()) {
- if (element.kind == ElementKind.GENERATIVE_CONSTRUCTOR_BODY) {
- ConstructorBodyElement bodyElement = element;
- SourceString name = bodyElement.constructor.name;
- return instanceMethodName(element.getLibrary(),
- name, bodyElement.parameterCount(compiler));
- } else if (element.kind == ElementKind.FUNCTION) {
- FunctionElement functionElement = element;
- return instanceMethodName(element.getLibrary(),
- element.name,
- functionElement.parameterCount(compiler));
- } else if (element.kind == ElementKind.GETTER) {
- return getterName(element.getLibrary(), element.name);
- } else if (element.kind == ElementKind.SETTER) {
- return setterName(element.getLibrary(), element.name);
- } else if (element.kind == ElementKind.FIELD) {
- return instanceFieldName(element.getLibrary(), element.name);
- } else {
- compiler.internalError('getName for bad kind: ${element.kind}',
- node: element.parseNode(compiler));
- }
- } else {
- // Dealing with a top-level or static element.
- String cached = globals[element];
- if (cached !== null) return cached;
-
- String guess = _computeGuess(element);
- ElementKind kind = element.kind;
- if (kind === ElementKind.VARIABLE ||
- kind === ElementKind.PARAMETER) {
- // The name is not guaranteed to be unique.
- return guess;
- }
- if (kind === ElementKind.GENERATIVE_CONSTRUCTOR ||
- kind === ElementKind.FUNCTION ||
- kind === ElementKind.CLASS ||
- kind === ElementKind.FIELD ||
- kind === ElementKind.GETTER ||
- kind === ElementKind.SETTER ||
- kind === ElementKind.TYPEDEF ||
- kind === ElementKind.LIBRARY) {
- String result = getFreshGlobalName(guess);
- globals[element] = result;
- return result;
- }
- compiler.internalError('getName for unknown kind: ${element.kind}',
- node: element.parseNode(compiler));
- }
- }
-
- String getLazyInitializerName(Element element) {
- // TODO(floitsch): mangle while not conflicting with other statics.
- assert(Elements.isStaticOrTopLevelField(element));
- return "get\$${getName(element)}";
- }
-
- String isolatePropertiesAccess(Element element) {
- return "$ISOLATE.$ISOLATE_PROPERTIES.${getName(element)}";
- }
-
- String isolatePropertiesAccessForConstant(String constantName) {
- return "$ISOLATE.$ISOLATE_PROPERTIES.$constantName";
- }
-
- String isolateAccess(Element element) {
- return "$CURRENT_ISOLATE.${getName(element)}";
- }
-
- String isolateBailoutAccess(Element element) {
- return '${isolateAccess(element)}\$bailout';
- }
-
- String isolateLazyInitializerAccess(Element element) {
- return "$CURRENT_ISOLATE.${getLazyInitializerName(element)}";
- }
-
- String operatorIs(Element element) {
- return 'is\$${getName(element)}';
- }
-
- String safeName(String name) {
- if (jsReserved.contains(name) || name.startsWith('\$')) {
- name = "\$$name";
- assert(!jsReserved.contains(name));
- }
- return name;
- }
-}

Powered by Google App Engine
This is Rietveld 408576698