| Index: compiler/java/com/google/dart/compiler/backend/js/GenerateNamesAndScopes.java
|
| diff --git a/compiler/java/com/google/dart/compiler/backend/js/GenerateNamesAndScopes.java b/compiler/java/com/google/dart/compiler/backend/js/GenerateNamesAndScopes.java
|
| deleted file mode 100644
|
| index 771f984ca04c403445231527fa5a393011046280..0000000000000000000000000000000000000000
|
| --- a/compiler/java/com/google/dart/compiler/backend/js/GenerateNamesAndScopes.java
|
| +++ /dev/null
|
| @@ -1,214 +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.
|
| -
|
| -package com.google.dart.compiler.backend.js;
|
| -
|
| -import com.google.dart.compiler.ast.DartClass;
|
| -import com.google.dart.compiler.ast.DartContext;
|
| -import com.google.dart.compiler.ast.DartField;
|
| -import com.google.dart.compiler.ast.DartFunction;
|
| -import com.google.dart.compiler.ast.DartFunctionExpression;
|
| -import com.google.dart.compiler.ast.DartLabel;
|
| -import com.google.dart.compiler.ast.DartMethodDefinition;
|
| -import com.google.dart.compiler.ast.DartParameter;
|
| -import com.google.dart.compiler.ast.DartVariable;
|
| -import com.google.dart.compiler.backend.js.ast.JsFunction;
|
| -import com.google.dart.compiler.backend.js.ast.JsName;
|
| -import com.google.dart.compiler.backend.js.ast.JsScope;
|
| -import com.google.dart.compiler.common.Symbol;
|
| -import com.google.dart.compiler.resolver.ConstructorElement;
|
| -import com.google.dart.compiler.resolver.Elements;
|
| -import com.google.dart.compiler.resolver.FieldElement;
|
| -import com.google.dart.compiler.resolver.LibraryElement;
|
| -import com.google.dart.compiler.resolver.MethodElement;
|
| -
|
| -import java.util.Deque;
|
| -import java.util.LinkedList;
|
| -
|
| -/**
|
| - * This visitor generates Javascript scopes and names for all the Dart nodes, filling in the
|
| - * node->name map in 'names'.
|
| - */
|
| -class GenerateNamesAndScopes extends NormalizedVisitor {
|
| -
|
| - /**
|
| - * A JsScope used to manage fields and methods. A MemberJsScope can become
|
| - * parentless.
|
| - */
|
| - private static class MemberJsScope extends JsScope {
|
| - private MemberJsScope(JsScope parent, String description) {
|
| - super(parent, description);
|
| - }
|
| -
|
| - @Override
|
| - protected void detachFromParent() {
|
| - super.detachFromParent();
|
| - }
|
| - }
|
| -
|
| - private final Deque<JsScope> scopes = new LinkedList<JsScope>();
|
| - private DartClass currentClass = null;
|
| - private int labelUniqifier = 0; // to resolve label name collisions.
|
| - private int varUniqifier = 0; // to resolve variable name collisions.
|
| -
|
| - private final TranslationContext translationContext;
|
| - private final LibraryElement unitLibrary;
|
| -
|
| - private JsScope getGlobalScope() {
|
| - return translationContext.getProgram().getScope();
|
| - }
|
| -
|
| - public GenerateNamesAndScopes(TranslationContext data, LibraryElement unitLibrary) {
|
| - this.translationContext = data;
|
| - this.unitLibrary = unitLibrary;
|
| - scopes.push(getGlobalScope());
|
| - }
|
| -
|
| - @Override
|
| - public boolean visit(DartClass x, DartContext ctx) {
|
| - assert currentClass == null;
|
| - // Global variables are declared lazily. We don't declare the class now.
|
| - currentClass = x;
|
| - // We add the member scope into the hierarchy, so that the resolution works on unqualified
|
| - // identifiers. Once the resolution is done, we can rip out the scope from the hierarchy.
|
| - scopes.push(new MemberJsScope(scopes.peek(), x.getClassName()));
|
| - return true;
|
| - }
|
| -
|
| - @Override
|
| - public boolean visit(DartField x, DartContext ctx) {
|
| - FieldElement element = x.getSymbol();
|
| - String mangledFieldName = translationContext.getMangler().mangleField(element, unitLibrary);
|
| - JsName fieldName = declare(x.getSymbol(), mangledFieldName, element.getName());
|
| - fieldName.setObfuscatable(false);
|
| - return true;
|
| - }
|
| -
|
| - public boolean generateConstructorName(DartMethodDefinition x) {
|
| - ConstructorElement element = (ConstructorElement) x.getSymbol();
|
| - String name = translationContext.getMangler().mangleConstructor(element.getName(), unitLibrary);
|
| - JsName jsName = function(x.getSymbol(), name, element.getName(), x.getFunction());
|
| - // Constructors are globally accessible.
|
| - jsName.setObfuscatable(false);
|
| - return true;
|
| - }
|
| -
|
| - @Override
|
| - public boolean visit(DartMethodDefinition x, DartContext ctx) {
|
| - MethodElement element = x.getSymbol();
|
| - if (Elements.isNonFactoryConstructor(element)) {
|
| - return generateConstructorName(x);
|
| - }
|
| - if (x.getModifiers().isFactory()) {
|
| - String className = ((ConstructorElement) element).getConstructorType().getName();
|
| - String name = translationContext.getMangler().createFactorySyntax(className, element.getName(), unitLibrary);
|
| - JsName jsName = function(x.getSymbol(), name, element.getName(), x.getFunction());
|
| - // Factories are globally accessible.
|
| - jsName.setObfuscatable(false);
|
| - return true;
|
| - }
|
| -
|
| - String mangledName = translationContext.getMangler().mangleMethod(element, unitLibrary);
|
| - JsName methodName = function(x.getSymbol(), mangledName, element.getName(), x.getFunction());
|
| - methodName.setObfuscatable(false);
|
| - return true;
|
| - }
|
| -
|
| - @Override
|
| - public boolean visit(DartFunctionExpression x, DartContext ctx) {
|
| - function(x.getSymbol(), x.getFunctionName(), x.getFunctionName(), x.getFunction());
|
| - return true;
|
| - }
|
| -
|
| - @Override
|
| - public boolean visit(DartParameter x, DartContext ctx) {
|
| - // TODO(ngeoffray): A parameter in a function type does not have a symbol.
|
| - if (x.getSymbol() != null) {
|
| - declareExclusively(x.getSymbol(), x.getParameterName());
|
| - }
|
| - return true;
|
| - }
|
| -
|
| - @Override
|
| - public boolean visit(DartVariable x, DartContext ctx) {
|
| - declareExclusively(x.getSymbol(), x.getVariableName());
|
| - return true;
|
| - }
|
| -
|
| - @Override
|
| - public boolean visit(DartLabel x, DartContext ctx) {
|
| - declareExclusively(x.getSymbol(), String.format("L%X", labelUniqifier++));
|
| - return true;
|
| - }
|
| -
|
| - @Override
|
| - public void endVisit(DartMethodDefinition x, DartContext ctx) {
|
| - scopes.pop();
|
| - }
|
| -
|
| - @Override
|
| - public void endVisit(DartFunctionExpression x, DartContext ctx) {
|
| - scopes.pop();
|
| - }
|
| -
|
| - @Override
|
| - public void endVisit(DartClass x, DartContext ctx) {
|
| - currentClass = null;
|
| - // Rip out the member scope. Members are always accessed through an object and don't clash
|
| - // with other variables.
|
| - GenerateNamesAndScopes.MemberJsScope memberScope = (GenerateNamesAndScopes.MemberJsScope) scopes.pop();
|
| - memberScope.rebaseChildScopes(memberScope.getParent());
|
| - memberScope.detachFromParent();
|
| - translationContext.getMemberScopes().put(x.getSymbol(), memberScope);
|
| - }
|
| -
|
| - private JsName function(Symbol symbol, String name, String originalName, DartFunction func) {
|
| - JsName jsName = name != null ? declareExclusively(symbol, name, originalName) : null;
|
| - JsFunction jsFunc = new JsFunction(scopes.peek(), jsName);
|
| - jsFunc.setFromDart(true);
|
| - scopes.push(jsFunc.getScope());
|
| - translationContext.getMethods().put(func, jsFunc);
|
| - return jsName;
|
| - }
|
| -
|
| - private JsName declare(Symbol x, String name, String originalName) {
|
| - return declareInScope(scopes.peek(), x, name, originalName);
|
| - }
|
| -
|
| - private JsName declareExclusively(Symbol x, String name, String originalName) {
|
| - return declareExclusivelyInScope(scopes.peek(), x, name, originalName);
|
| - }
|
| -
|
| - private JsName declareExclusively(Symbol x, String name) {
|
| - return declareExclusivelyInScope(scopes.peek(), x, name, name);
|
| - }
|
| -
|
| - private static final int BIG_PRIME_UNDER_0XFFFFF = 985531;
|
| -
|
| - /**
|
| - * Create a unique name for this variable in this scope.
|
| - *
|
| - * Try to keep this from being a linear scan of the namespace, and keep
|
| - * it under 5 hex digits (over 1,000,000 unique suffixes).
|
| - *
|
| - */
|
| - private JsName declareExclusivelyInScope(JsScope scope, Symbol x,
|
| - String name, String originalName) {
|
| - String mappedName = name;
|
| - int offset = 0;
|
| - while (scope.findExistingName(mappedName) != null) {
|
| - mappedName = String.format("%s_%X", mappedName, varUniqifier);
|
| - varUniqifier = (varUniqifier + offset++) % BIG_PRIME_UNDER_0XFFFFF;
|
| - }
|
| - return declareInScope(scope, x, mappedName, originalName);
|
| - }
|
| -
|
| - private JsName declareInScope(JsScope scope, Symbol x, String name, String originalName) {
|
| - JsName jsName = scope.declareName(name, name, originalName);
|
| - jsName.getClass(); // Fast null check.
|
| - x.getClass(); // Fast null check.
|
| - translationContext.getNames().setName(x, jsName);
|
| - return jsName;
|
| - }
|
| -}
|
|
|