| Index: compiler/java/com/google/dart/compiler/backend/js/Cloner.java
|
| diff --git a/compiler/java/com/google/dart/compiler/backend/js/Cloner.java b/compiler/java/com/google/dart/compiler/backend/js/Cloner.java
|
| deleted file mode 100644
|
| index b0dd804410ed9d58c99ed253170bed43a7c8256e..0000000000000000000000000000000000000000
|
| --- a/compiler/java/com/google/dart/compiler/backend/js/Cloner.java
|
| +++ /dev/null
|
| @@ -1,253 +0,0 @@
|
| -// Copyright 2011, the Dart project authors. All rights reserved.
|
| -// Redistribution and use in source and binary forms, with or without
|
| -// modification, are permitted provided that the following conditions are
|
| -// met:
|
| -//
|
| -// * Redistributions of source code must retain the above copyright
|
| -// notice, this list of conditions and the following disclaimer.
|
| -// * Redistributions in binary form must reproduce the above
|
| -// copyright notice, this list of conditions and the following
|
| -// disclaimer in the documentation and/or other materials provided
|
| -// with the distribution.
|
| -// * Neither the name of Google Inc. nor the names of its
|
| -// contributors may be used to endorse or promote products derived
|
| -// from this software without specific prior written permission.
|
| -//
|
| -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| -package com.google.dart.compiler.backend.js;
|
| -
|
| -import com.google.dart.compiler.InternalCompilerException;
|
| -import com.google.dart.compiler.backend.js.ast.JsArrayAccess;
|
| -import com.google.dart.compiler.backend.js.ast.JsArrayLiteral;
|
| -import com.google.dart.compiler.backend.js.ast.JsBinaryOperation;
|
| -import com.google.dart.compiler.backend.js.ast.JsBooleanLiteral;
|
| -import com.google.dart.compiler.backend.js.ast.JsConditional;
|
| -import com.google.dart.compiler.backend.js.ast.JsContext;
|
| -import com.google.dart.compiler.backend.js.ast.JsExpression;
|
| -import com.google.dart.compiler.backend.js.ast.JsFunction;
|
| -import com.google.dart.compiler.backend.js.ast.JsInvocation;
|
| -import com.google.dart.compiler.backend.js.ast.JsName;
|
| -import com.google.dart.compiler.backend.js.ast.JsNameRef;
|
| -import com.google.dart.compiler.backend.js.ast.JsNew;
|
| -import com.google.dart.compiler.backend.js.ast.JsNullLiteral;
|
| -import com.google.dart.compiler.backend.js.ast.JsNumberLiteral;
|
| -import com.google.dart.compiler.backend.js.ast.JsObjectLiteral;
|
| -import com.google.dart.compiler.backend.js.ast.JsPostfixOperation;
|
| -import com.google.dart.compiler.backend.js.ast.JsPrefixOperation;
|
| -import com.google.dart.compiler.backend.js.ast.JsPropertyInitializer;
|
| -import com.google.dart.compiler.backend.js.ast.JsRegExp;
|
| -import com.google.dart.compiler.backend.js.ast.JsStringLiteral;
|
| -import com.google.dart.compiler.backend.js.ast.JsThisRef;
|
| -import com.google.dart.compiler.backend.js.ast.JsVisitor;
|
| -
|
| -import java.util.ArrayList;
|
| -import java.util.List;
|
| -import java.util.Stack;
|
| -
|
| -/**
|
| - * Implements actual cloning logic. We rely on the JsExpressions to provide
|
| - * traversal logic. The {@link #stack} field is used to accumulate
|
| - * already-cloned JsExpression instances. One gotcha that falls out of this is
|
| - * that argument lists are on the stack in reverse order, so lists should be
|
| - * constructed via inserts, rather than appends.
|
| - */
|
| -public class Cloner extends JsVisitor {
|
| - protected final Stack<JsExpression> stack = new Stack<JsExpression>();
|
| - private boolean successful = true;
|
| -
|
| - /**
|
| - * @param expression
|
| - * @return Return a clone of the expression tree
|
| - */
|
| - public static JsExpression clone(JsExpression expression) {
|
| - Cloner c = new Cloner();
|
| - c.accept(expression);
|
| - return c.getExpression();
|
| - }
|
| -
|
| - @Override
|
| - public void endVisit(JsArrayAccess x, JsContext ctx) {
|
| - JsArrayAccess newExpression = new JsArrayAccess();
|
| - newExpression.setIndexExpr(stack.pop());
|
| - newExpression.setArrayExpr(stack.pop());
|
| - stack.push(newExpression);
|
| - }
|
| -
|
| - @Override
|
| - public void endVisit(JsArrayLiteral x, JsContext ctx) {
|
| - JsArrayLiteral toReturn = new JsArrayLiteral();
|
| - List<JsExpression> expressions = toReturn.getExpressions();
|
| - int size = x.getExpressions().size();
|
| - while (size-- > 0) {
|
| - expressions.add(0, stack.pop());
|
| - }
|
| - stack.push(toReturn);
|
| - }
|
| -
|
| - @Override
|
| - public void endVisit(JsBinaryOperation x, JsContext ctx) {
|
| - JsBinaryOperation toReturn = new JsBinaryOperation(x.getOperator());
|
| - toReturn.setArg2(stack.pop());
|
| - toReturn.setArg1(stack.pop());
|
| - stack.push(toReturn);
|
| - }
|
| -
|
| - @Override
|
| - public void endVisit(JsBooleanLiteral x, JsContext ctx) {
|
| - stack.push(x);
|
| - }
|
| -
|
| - @Override
|
| - public void endVisit(JsConditional x, JsContext ctx) {
|
| - JsConditional toReturn = new JsConditional();
|
| - toReturn.setElseExpression(stack.pop());
|
| - toReturn.setThenExpression(stack.pop());
|
| - toReturn.setTestExpression(stack.pop());
|
| - stack.push(toReturn);
|
| - }
|
| -
|
| - /**
|
| - * The only functions that would get be visited are those being used as
|
| - * first-class objects.
|
| - */
|
| - @Override
|
| - public void endVisit(JsFunction x, JsContext ctx) {
|
| - // Set a flag to indicate that we cannot continue, and push a null so
|
| - // we don't run out of elements on the stack.
|
| - successful = false;
|
| - stack.push(null);
|
| - }
|
| -
|
| - /**
|
| - * Cloning the invocation allows us to modify it without damaging other call
|
| - * sites.
|
| - */
|
| - @Override
|
| - public void endVisit(JsInvocation x, JsContext ctx) {
|
| - JsInvocation toReturn = new JsInvocation();
|
| - List<JsExpression> params = toReturn.getArguments();
|
| - int size = x.getArguments().size();
|
| - while (size-- > 0) {
|
| - params.add(0, stack.pop());
|
| - }
|
| - toReturn.setQualifier(stack.pop());
|
| - stack.push(toReturn);
|
| - }
|
| -
|
| - /**
|
| - * Do a deep clone of a JsNameRef. Because JsNameRef chains are shared
|
| - * throughout the AST, you can't just go and change their qualifiers when
|
| - * re-writing an invocation.
|
| - */
|
| - @Override
|
| - public void endVisit(JsNameRef x, JsContext ctx) {
|
| - JsNameRef toReturn;
|
| - JsName name = x.getName();
|
| - if (name != null) {
|
| - toReturn = new JsNameRef(name);
|
| - } else {
|
| - toReturn = new JsNameRef(x.getIdent());
|
| - }
|
| -
|
| - if (x.getQualifier() != null) {
|
| - toReturn.setQualifier(stack.pop());
|
| - }
|
| - stack.push(toReturn);
|
| - }
|
| -
|
| - @Override
|
| - public void endVisit(JsNew x, JsContext ctx) {
|
| - int size = x.getArguments().size();
|
| - List<JsExpression> arguments = new ArrayList<JsExpression>(size);
|
| - while (size-- > 0) {
|
| - arguments.add(0, stack.pop());
|
| - }
|
| - JsNew toReturn = new JsNew(stack.pop());
|
| - toReturn.getArguments().addAll(arguments);
|
| - stack.push(toReturn);
|
| - }
|
| -
|
| - @Override
|
| - public void endVisit(JsNullLiteral x, JsContext ctx) {
|
| - stack.push(x);
|
| - }
|
| -
|
| - @Override
|
| - public void endVisit(JsNumberLiteral x, JsContext ctx) {
|
| - stack.push(x);
|
| - }
|
| -
|
| - @Override
|
| - public void endVisit(JsObjectLiteral x, JsContext ctx) {
|
| - JsObjectLiteral toReturn = new JsObjectLiteral();
|
| - List<JsPropertyInitializer> inits = toReturn.getPropertyInitializers();
|
| -
|
| - int size = x.getPropertyInitializers().size();
|
| - while (size-- > 0) {
|
| - /*
|
| - * JsPropertyInitializers are the only non-JsExpression objects that we
|
| - * care about, so we just go ahead and create the objects in the loop,
|
| - * rather than expecting it to be on the stack and having to perform
|
| - * narrowing casts at all stack.pop() invocations.
|
| - */
|
| - JsPropertyInitializer newInit = new JsPropertyInitializer();
|
| - newInit.setValueExpr(stack.pop());
|
| - newInit.setLabelExpr(stack.pop());
|
| -
|
| - inits.add(0, newInit);
|
| - }
|
| - stack.push(toReturn);
|
| - }
|
| -
|
| - @Override
|
| - public void endVisit(JsPostfixOperation x, JsContext ctx) {
|
| - JsPostfixOperation toReturn = new JsPostfixOperation(x.getOperator());
|
| - toReturn.setArg(stack.pop());
|
| - stack.push(toReturn);
|
| - }
|
| -
|
| - @Override
|
| - public void endVisit(JsPrefixOperation x, JsContext ctx) {
|
| - JsPrefixOperation toReturn = new JsPrefixOperation(x.getOperator());
|
| - toReturn.setArg(stack.pop());
|
| - stack.push(toReturn);
|
| - }
|
| -
|
| - @Override
|
| - public void endVisit(JsRegExp x, JsContext ctx) {
|
| - stack.push(x);
|
| - }
|
| -
|
| - @Override
|
| - public void endVisit(JsStringLiteral x, JsContext ctx) {
|
| - stack.push(x);
|
| - }
|
| -
|
| - @Override
|
| - public void endVisit(JsThisRef x, JsContext ctx) {
|
| - stack.push(new JsThisRef());
|
| - }
|
| -
|
| - public JsExpression getExpression() {
|
| - return (successful && checkStack()) ? stack.peek() : null;
|
| - }
|
| -
|
| - private boolean checkStack() {
|
| - if (stack.size() > 1) {
|
| - throw new InternalCompilerException("Too many expressions on stack");
|
| - }
|
| -
|
| - return stack.size() == 1;
|
| - }
|
| -}
|
| -
|
|
|