/* * Copyright 2008 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.jjs.ast; import com.google.gwt.dev.jjs.InternalCompilerException; import com.google.gwt.dev.jjs.ast.js.JDebuggerStatement; import com.google.gwt.dev.jjs.ast.js.JMultiExpression; import com.google.gwt.dev.jjs.ast.js.JsniClassLiteral; import com.google.gwt.dev.jjs.ast.js.JsniFieldRef; import com.google.gwt.dev.jjs.ast.js.JsniMethodBody; import com.google.gwt.dev.jjs.ast.js.JsniMethodRef; import com.google.gwt.dev.jjs.ast.js.JsonArray; import com.google.gwt.thirdparty.guava.common.collect.Lists; import java.util.List; /** * A base class for transformers from JNode. * * @param <T> the type of the transformed node. */ @SuppressWarnings("unused") public class JTransformer<T> { public T transformAbstractMethodBody(JAbstractMethodBody x) { return missing(x); } public T transformArrayLength(JArrayLength x) { return transformExpression(x); } public T transformArrayRef(JArrayRef x) { return transformExpression(x); } public T transformArrayType(JArrayType x) { return transformReferenceType(x); } public T transformAssertStatement(JAssertStatement x) { return transformStatement(x); } public T transformBinaryOperation(JBinaryOperation x) { return transformExpression(x); } public T transformBlock(JBlock x) { return transformStatement(x); } public T transformBooleanLiteral(JBooleanLiteral x) { return transformValueLiteral(x); } public T transformBreakStatement(JBreakStatement x) { return transformStatement(x); } public T transformCaseStatement(JCaseStatement x) { return transformStatement(x); } public T transformCastMap(JCastMap x) { return transformExpression(x); } public T transformCastOperation(JCastOperation x) { return transformExpression(x); } public T transformCharLiteral(JCharLiteral x) { return transformValueLiteral(x); } public T transformClassLiteral(JClassLiteral x) { return transformLiteral(x); } public T transformClassType(JClassType x) { return transformDeclaredType(x); } public T transformConditional(JConditional x) { return transformExpression(x); } public T transformConstructor(JConstructor x) { return transformMethod(x); } public T transformContinueStatement(JContinueStatement x) { return transformStatement(x); } public T transformDebuggerStatement(JDebuggerStatement x) { return transformStatement(x); } public T transformDeclarationStatement(JDeclarationStatement x) { return transformStatement(x); } public T transformDeclaredType(JDeclaredType x) { return transformReferenceType(x); } public T transformDoStatement(JDoStatement x) { return transformStatement(x); } public T transformDoubleLiteral(JDoubleLiteral x) { return transformValueLiteral(x); } public T transformExpression(JExpression x) { return missing(x); } public T transformExpressionStatement(JExpressionStatement x) { return transformStatement(x); } public T transformField(JField x) { return transformVariable(x); } public T transformFieldRef(JFieldRef x) { return transformVariableRef(x); } public T transformFloatLiteral(JFloatLiteral x) { return transformValueLiteral(x); } public T transformForStatement(JForStatement x) { return transformStatement(x); } public T transformIfStatement(JIfStatement x) { return transformStatement(x); } public T transformInstanceOf(JInstanceOf x) { return transformExpression(x); } public T transformInterfaceType(JInterfaceType x) { return transformDeclaredType(x); } public T transformIntLiteral(JIntLiteral x) { return transformValueLiteral(x); } public T transformLabel(JLabel x) { return missing(x); } public T transformLabeledStatement(JLabeledStatement x) { return transformStatement(x); } public T transformLiteral(JLiteral x) { return transformExpression(x); } public T transformLocal(JLocal x) { return transformVariable(x); } public T transformLocalRef(JLocalRef x) { return transformVariableRef(x); } public T transformLongLiteral(JLongLiteral x) { return transformValueLiteral(x); } public T transformMethod(JMethod x) { return missing(x); } public T transformMethodBody(JMethodBody x) { return transformAbstractMethodBody(x); } public T transformMethodCall(JMethodCall x) { return transformExpression(x); } public T transformMultiExpression(JMultiExpression x) { return transformExpression(x); } public T transformNameOf(JNameOf x) { return transformExpression(x); } public T transformNewArray(JNewArray x) { return transformExpression(x); } public T transformNewInstance(JNewInstance x) { return transformMethodCall(x); } public T missing(JNode x) { throw new InternalCompilerException( "Missing transform for " + x + " (" + x.getClass().getSimpleName() + ")"); } public T transformNullLiteral(JNullLiteral x) { return transformValueLiteral(x); } public T transformNumericEntry(JNumericEntry x) { return transformExpression(x); } public T transformParameter(JParameter x) { return transformVariable(x); } public T transformParameterRef(JParameterRef x) { return transformVariableRef(x); } public T transformPermutationDependentValue(JPermutationDependentValue x) { return transformExpression(x); } public T transformPostfixOperation(JPostfixOperation x) { return transformUnaryOperation(x); } public T transformPrefixOperation(JPrefixOperation x) { return transformUnaryOperation(x); } public T transformPrimitiveType(JPrimitiveType x) { return transformType(x); } public T transformProgram(JProgram x) { return missing(x); } public T transformReferenceType(JReferenceType x) { return transformType(x); } public T transformReturnStatement(JReturnStatement x) { return transformStatement(x); } public T transformRunAsync(JRunAsync x) { return transformExpression(x); } public T transformRuntimeTypeReference(JRuntimeTypeReference x) { return transformExpression(x); } public T transformJsniClassLiteral(JsniClassLiteral x) { return transformClassLiteral(x); } public T transformJsniFieldRef(JsniFieldRef x) { return transformFieldRef(x); } public T transformJsniMethodBody(JsniMethodBody x) { return transformAbstractMethodBody(x); } public T transformJsniMethodRef(JsniMethodRef x) { return transformMethodCall(x); } public T transformJsonArray(JsonArray x) { return transformExpression(x); } public T transformStatement(JStatement x) { return missing(x); } public T transformStringLiteral(JStringLiteral x) { return transformValueLiteral(x); } public T transformSwitchStatement(JSwitchStatement x) { return transformStatement(x); } public T transformThisRef(JThisRef x) { return transformExpression(x); } public T transformThrowStatement(JThrowStatement x) { return transformStatement(x); } public T transformTryStatement(JTryStatement x) { return transformStatement(x); } public T transformType(JType x) { return missing(x); } public T transformUnaryOperation(JUnaryOperation x) { return transformExpression(x); } public T transformValueLiteral(JValueLiteral x) { return transformLiteral(x); } public T transformVariable(JVariable x) { return missing(x); } public T transformVariableRef(JVariableRef x) { return transformExpression(x); } public T transformUnsafeTypeCoercion(JUnsafeTypeCoercion x) { return transformExpression(x); } public T transformWhileStatement(JWhileStatement x) { return transformStatement(x); } private class JRewriterVisitor extends JVisitor { T result = null; public boolean didChange() { throw new UnsupportedOperationException(); } public final void endVisit(JAbstractMethodBody x, Context ctx) { } public final void endVisit(JArrayLength x, Context ctx) { } public final void endVisit(JArrayRef x, Context ctx) { } public final void endVisit(JArrayType x, Context ctx) { } public final void endVisit(JAssertStatement x, Context ctx) { } public final void endVisit(JBinaryOperation x, Context ctx) { } public final void endVisit(JBlock x, Context ctx) { } public final void endVisit(JBooleanLiteral x, Context ctx) { } public final void endVisit(JBreakStatement x, Context ctx) { } public final void endVisit(JCaseStatement x, Context ctx) { } public final void endVisit(JCastMap x, Context ctx) { } public final void endVisit(JCastOperation x, Context ctx) { } public final void endVisit(JCharLiteral x, Context ctx) { } public final void endVisit(JClassLiteral x, Context ctx) { } public final void endVisit(JClassType x, Context ctx) { } public final void endVisit(JConditional x, Context ctx) { } public final void endVisit(JConstructor x, Context ctx) { } public final void endVisit(JContinueStatement x, Context ctx) { } public final void endVisit(JDebuggerStatement x, Context ctx) { } public final void endVisit(JDeclarationStatement x, Context ctx) { } public final void endVisit(JDeclaredType x, Context ctx) { } public final void endVisit(JDoStatement x, Context ctx) { } public final void endVisit(JDoubleLiteral x, Context ctx) { } public final void endVisit(JExpression x, Context ctx) { } public final void endVisit(JExpressionStatement x, Context ctx) { } public final void endVisit(JField x, Context ctx) { } public final void endVisit(JFieldRef x, Context ctx) { } public final void endVisit(JFloatLiteral x, Context ctx) { } public final void endVisit(JForStatement x, Context ctx) { } public final void endVisit(JIfStatement x, Context ctx) { } public final void endVisit(JInstanceOf x, Context ctx) { } public final void endVisit(JInterfaceType x, Context ctx) { } public final void endVisit(JIntLiteral x, Context ctx) { } public final void endVisit(JLabel x, Context ctx) { } public final void endVisit(JLabeledStatement x, Context ctx) { } public final void endVisit(JLiteral x, Context ctx) { } public final void endVisit(JLocal x, Context ctx) { } public final void endVisit(JLocalRef x, Context ctx) { } public final void endVisit(JLongLiteral x, Context ctx) { } public final void endVisit(JMethod x, Context ctx) { } public final void endVisit(JMethodBody x, Context ctx) { } public final void endVisit(JMethodCall x, Context ctx) { } public final void endVisit(JMultiExpression x, Context ctx) { } public final void endVisit(JNameOf x, Context ctx) { } public final void endVisit(JNewArray x, Context ctx) { } public final void endVisit(JNewInstance x, Context ctx) { } public final void endVisit(JNode x, Context ctx) { } public final void endVisit(JNullLiteral x, Context ctx) { } public final void endVisit(JNumericEntry x, Context ctx) { } public final void endVisit(JParameter x, Context ctx) { } public final void endVisit(JParameterRef x, Context ctx) { } public final void endVisit(JPermutationDependentValue x, Context ctx) { } public final void endVisit(JPostfixOperation x, Context ctx) { } public final void endVisit(JPrefixOperation x, Context ctx) { } public final void endVisit(JPrimitiveType x, Context ctx) { } public final void endVisit(JProgram x, Context ctx) { } public final void endVisit(JReferenceType x, Context ctx) { } public final void endVisit(JReturnStatement x, Context ctx) { } public final void endVisit(JRunAsync x, Context ctx) { } public final void endVisit(JRuntimeTypeReference x, Context ctx) { } public final void endVisit(JsniClassLiteral x, Context ctx) { } public final void endVisit(JsniFieldRef x, Context ctx) { } public final void endVisit(JsniMethodBody x, Context ctx) { } public final void endVisit(JsniMethodRef x, Context ctx) { } public final void endVisit(JsonArray x, Context ctx) { } public final void endVisit(JStatement x, Context ctx) { } public final void endVisit(JStringLiteral x, Context ctx) { } public final void endVisit(JSwitchStatement x, Context ctx) { } public final void endVisit(JThisRef x, Context ctx) { } public final void endVisit(JThrowStatement x, Context ctx) { } public final void endVisit(JTryStatement x, Context ctx) { } public final void endVisit(JType x, Context ctx) { } public final void endVisit(JUnaryOperation x, Context ctx) { } public final void endVisit(JValueLiteral x, Context ctx) { } public final void endVisit(JVariable x, Context ctx) { } public final void endVisit(JVariableRef x, Context ctx) { } public final void endVisit(JWhileStatement x, Context ctx) { } public final boolean visit(JAbstractMethodBody x, Context ctx) { assert result == null; result = transformAbstractMethodBody(x); return false; } public final boolean visit(JArrayLength x, Context ctx) { assert result == null; result = transformArrayLength(x); return false; } public final boolean visit(JArrayRef x, Context ctx) { assert result == null; result = transformArrayRef(x); return false; } public final boolean visit(JArrayType x, Context ctx) { assert result == null; result = transformArrayType(x); return false; } public final boolean visit(JAssertStatement x, Context ctx) { assert result == null; result = transformAssertStatement(x); return false; } public final boolean visit(JBinaryOperation x, Context ctx) { assert result == null; result = transformBinaryOperation(x); return false; } public final boolean visit(JBlock x, Context ctx) { assert result == null; result = transformBlock(x); return false; } public final boolean visit(JBooleanLiteral x, Context ctx) { assert result == null; result = transformBooleanLiteral(x); return false; } public final boolean visit(JBreakStatement x, Context ctx) { assert result == null; result = transformBreakStatement(x); return false; } public final boolean visit(JCaseStatement x, Context ctx) { assert result == null; result = transformCaseStatement(x); return false; } public final boolean visit(JCastMap x, Context ctx) { assert result == null; result = transformCastMap(x); return false; } public final boolean visit(JCastOperation x, Context ctx) { assert result == null; result = transformCastOperation(x); return false; } public final boolean visit(JCharLiteral x, Context ctx) { assert result == null; result = transformCharLiteral(x); return false; } public final boolean visit(JClassLiteral x, Context ctx) { assert result == null; result = transformClassLiteral(x); return false; } public final boolean visit(JClassType x, Context ctx) { assert result == null; result = transformClassType(x); return false; } public final boolean visit(JConditional x, Context ctx) { assert result == null; result = transformConditional(x); return false; } public final boolean visit(JConstructor x, Context ctx) { assert result == null; result = transformConstructor(x); return false; } public final boolean visit(JContinueStatement x, Context ctx) { assert result == null; result = transformContinueStatement(x); return false; } public final boolean visit(JDebuggerStatement x, Context ctx) { assert result == null; result = transformDebuggerStatement(x); return false; } public final boolean visit(JDeclarationStatement x, Context ctx) { assert result == null; result = transformDeclarationStatement(x); return false; } public final boolean visit(JDeclaredType x, Context ctx) { assert result == null; result = transformDeclaredType(x); return false; } public final boolean visit(JDoStatement x, Context ctx) { assert result == null; result = transformDoStatement(x); return false; } public final boolean visit(JDoubleLiteral x, Context ctx) { assert result == null; result = transformDoubleLiteral(x); return false; } public final boolean visit(JExpression x, Context ctx) { assert result == null; result = transformExpression(x); return false; } public final boolean visit(JExpressionStatement x, Context ctx) { assert result == null; result = transformExpressionStatement(x); return false; } public final boolean visit(JField x, Context ctx) { assert result == null; result = transformField(x); return false; } /** * NOTE: not called from JsniFieldRef. */ public final boolean visit(JFieldRef x, Context ctx) { assert result == null; result = transformFieldRef(x); return false; } public final boolean visit(JFloatLiteral x, Context ctx) { assert result == null; result = transformFloatLiteral(x); return false; } public final boolean visit(JForStatement x, Context ctx) { assert result == null; result = transformForStatement(x); return false; } public final boolean visit(JIfStatement x, Context ctx) { assert result == null; result = transformIfStatement(x); return false; } public final boolean visit(JInstanceOf x, Context ctx) { assert result == null; result = transformInstanceOf(x); return false; } public final boolean visit(JInterfaceType x, Context ctx) { assert result == null; result = transformInterfaceType(x); return false; } public final boolean visit(JIntLiteral x, Context ctx) { assert result == null; result = transformIntLiteral(x); return false; } public final boolean visit(JLabel x, Context ctx) { assert result == null; result = transformLabel(x); return false; } public final boolean visit(JLabeledStatement x, Context ctx) { assert result == null; result = transformLabeledStatement(x); return false; } public final boolean visit(JLiteral x, Context ctx) { assert result == null; result = transformLiteral(x); return false; } public final boolean visit(JLocal x, Context ctx) { assert result == null; result = transformLocal(x); return false; } public final boolean visit(JLocalRef x, Context ctx) { assert result == null; result = transformLocalRef(x); return false; } public final boolean visit(JLongLiteral x, Context ctx) { assert result == null; result = transformLongLiteral(x); return false; } public final boolean visit(JMethod x, Context ctx) { assert result == null; result = transformMethod(x); return false; } public final boolean visit(JMethodBody x, Context ctx) { assert result == null; result = transformMethodBody(x); return false; } public final boolean visit(JMethodCall x, Context ctx) { assert result == null; result = transformMethodCall(x); return false; } public final boolean visit(JMultiExpression x, Context ctx) { assert result == null; result = transformMultiExpression(x); return false; } public final boolean visit(JNameOf x, Context ctx) { assert result == null; result = transformNameOf(x); return false; } public final boolean visit(JNewArray x, Context ctx) { assert result == null; result = transformNewArray(x); return false; } public final boolean visit(JNewInstance x, Context ctx) { assert result == null; result = transformNewInstance(x); return false; } public final boolean visit(JNode x, Context ctx) { missing(x); return false; } public final boolean visit(JNullLiteral x, Context ctx) { assert result == null; result = transformNullLiteral(x); return false; } public final boolean visit(JNumericEntry x, Context ctx) { assert result == null; result = transformNumericEntry(x); return false; } public final boolean visit(JParameter x, Context ctx) { assert result == null; result = transformParameter(x); return false; } public final boolean visit(JParameterRef x, Context ctx) { assert result == null; result = transformParameterRef(x); return false; } public final boolean visit(JPermutationDependentValue x, Context ctx) { assert result == null; result = transformPermutationDependentValue(x); return false; } public final boolean visit(JPostfixOperation x, Context ctx) { assert result == null; result = transformPostfixOperation(x); return false; } public final boolean visit(JPrefixOperation x, Context ctx) { assert result == null; result = transformPrefixOperation(x); return false; } public final boolean visit(JPrimitiveType x, Context ctx) { assert result == null; result = transformPrimitiveType(x); return false; } public final boolean visit(JProgram x, Context ctx) { assert result == null; result = transformProgram(x); return false; } public final boolean visit(JReferenceType x, Context ctx) { assert result == null; result = transformReferenceType(x); return false; } public final boolean visit(JReturnStatement x, Context ctx) { assert result == null; result = transformReturnStatement(x); return false; } public final boolean visit(JRunAsync x, Context ctx) { assert result == null; result = transformRunAsync(x); return false; } public final boolean visit(JRuntimeTypeReference x, Context ctx) { assert result == null; result = transformRuntimeTypeReference(x); return false; } public final boolean visit(JsniClassLiteral x, Context ctx) { assert result == null; result = transformJsniClassLiteral(x); return false; } public final boolean visit(JsniFieldRef x, Context ctx) { /* NOTE: Skip JFieldRef */ assert result == null; result = transformJsniFieldRef(x); return false; } public final boolean visit(JsniMethodBody x, Context ctx) { assert result == null; result = transformJsniMethodBody(x); return false; } public final boolean visit(JsniMethodRef x, Context ctx) { /* NOTE: Skip JMethodCall */ assert result == null; result = transformJsniMethodRef(x); return false; } public final boolean visit(JsonArray x, Context ctx) { assert result == null; result = transformJsonArray(x); return false; } public final boolean visit(JStatement x, Context ctx) { assert result == null; result = transformStatement(x); return false; } public final boolean visit(JStringLiteral x, Context ctx) { assert result == null; result = transformStringLiteral(x); return false; } public final boolean visit(JSwitchStatement x, Context ctx) { assert result == null; result = transformSwitchStatement(x); return false; } public final boolean visit(JThisRef x, Context ctx) { assert result == null; result = transformThisRef(x); return false; } public final boolean visit(JThrowStatement x, Context ctx) { assert result == null; result = transformThrowStatement(x); return false; } public final boolean visit(JTryStatement x, Context ctx) { assert result == null; result = transformTryStatement(x); return false; } public final boolean visit(JType x, Context ctx) { assert result == null; result = transformType(x); return false; } public final boolean visit(JUnaryOperation x, Context ctx) { assert result == null; result = transformUnaryOperation(x); return false; } public final boolean visit(JUnsafeTypeCoercion x, Context ctx) { assert result == null; result = transformUnsafeTypeCoercion(x); return false; } public final boolean visit(JValueLiteral x, Context ctx) { assert result == null; result = transformValueLiteral(x); return false; } public final boolean visit(JVariable x, Context ctx) { assert result == null; result = transformVariable(x); return false; } public final boolean visit(JVariableRef x, Context ctx) { assert result == null; result = transformVariableRef(x); return false; } public final boolean visit(JWhileStatement x, Context ctx) { assert result == null; result = transformWhileStatement(x); return false; } } public final <T> T transform(JNode node) { if (node == null) { return null; } JRewriterVisitor visitor = new JRewriterVisitor(); visitor.accept(node); return (T) visitor.result; } public final <T,U extends JNode> List<T> transform(List<U> nodes) { List<T> result = Lists.newArrayListWithCapacity(nodes.size()); transformInto(nodes, result); return result; } public final <T,U extends JNode> void transformInto(List<U> nodes, List<T> transformedNodes) { for (JNode node: nodes) { transformedNodes.add((T) transform(node)); } } public final <T,U extends JNode> void transformIntoExcludingNulls(List<U> nodes, List<T> transformedNodes) { for (JNode node: nodes) { T transformed = transform(node); if (transformed != null) { transformedNodes.add(transformed); } } } }