blob: 0614d99880318891413c4d291e741c53a47d28e5 [file] [log] [blame]
/*
* 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);
}
}
}
}