blob: 2a9adbf49ed2ba2e4272b96adae53c972ce5c8b7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009-2013 xored software, Inc and NumberFour AG.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* xored software, Inc. - initial API and Implementation (Vladimir Belov)
* NumberFour AG - multiple API improvements (Alex Panchenko)
*******************************************************************************/
package org.eclipse.dltk.javascript.ast;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.dltk.ast.ASTNode;
public abstract class ASTVisitor<E> implements INodeVisitor<E> {
public E visit(Collection<? extends ASTNode> nodes) {
E result = null;
for (ASTNode node : nodes) {
result = visit(node);
}
return result;
}
protected void visitList(Collection<? extends ASTNode> nodes) {
for (ASTNode node : nodes) {
visit(node);
}
}
private static final Map<Class<? extends ASTNode>, Integer> HANDLERS = new HashMap<Class<? extends ASTNode>, Integer>();
// generated block
static {
HANDLERS.put(ArrayInitializer.class, 0);
HANDLERS.put(BinaryOperation.class, 1);
HANDLERS.put(BooleanLiteral.class, 2);
HANDLERS.put(BreakStatement.class, 3);
HANDLERS.put(CallExpression.class, 4);
HANDLERS.put(CommaExpression.class, 5);
HANDLERS.put(ConditionalOperator.class, 6);
HANDLERS.put(ConstStatement.class, 7);
HANDLERS.put(ContinueStatement.class, 8);
HANDLERS.put(DecimalLiteral.class, 9);
HANDLERS.put(DoWhileStatement.class, 10);
HANDLERS.put(EmptyExpression.class, 11);
HANDLERS.put(ForStatement.class, 12);
HANDLERS.put(ForInStatement.class, 13);
HANDLERS.put(ForEachInStatement.class, 14);
HANDLERS.put(FunctionStatement.class, 15);
HANDLERS.put(GetArrayItemExpression.class, 16);
HANDLERS.put(Identifier.class, 17);
HANDLERS.put(IfStatement.class, 18);
HANDLERS.put(LabelledStatement.class, 19);
HANDLERS.put(NewExpression.class, 20);
HANDLERS.put(NullExpression.class, 21);
HANDLERS.put(ObjectInitializer.class, 22);
HANDLERS.put(ParenthesizedExpression.class, 23);
HANDLERS.put(PropertyExpression.class, 24);
HANDLERS.put(RegExpLiteral.class, 25);
HANDLERS.put(ReturnStatement.class, 26);
HANDLERS.put(Script.class, 27);
HANDLERS.put(StatementBlock.class, 28);
HANDLERS.put(StringLiteral.class, 29);
HANDLERS.put(SwitchStatement.class, 30);
HANDLERS.put(ThisExpression.class, 31);
HANDLERS.put(ThrowStatement.class, 32);
HANDLERS.put(TryStatement.class, 33);
HANDLERS.put(UnaryOperation.class, 34);
HANDLERS.put(VariableStatement.class, 35);
HANDLERS.put(VoidExpression.class, 36);
HANDLERS.put(YieldOperator.class, 37);
HANDLERS.put(WhileStatement.class, 38);
HANDLERS.put(WithStatement.class, 39);
HANDLERS.put(XmlLiteral.class, 40);
HANDLERS.put(DefaultXmlNamespaceStatement.class, 41);
HANDLERS.put(XmlAttributeIdentifier.class, 42);
HANDLERS.put(AsteriskExpression.class, 43);
HANDLERS.put(GetAllChildrenExpression.class, 44);
HANDLERS.put(GetLocalNameExpression.class, 45);
HANDLERS.put(ErrorExpression.class, 46);
HANDLERS.put(EmptyStatement.class, 47);
}
// generated function
private final E handle(ASTNode node, int handlerIndex) {
switch (handlerIndex) {
case 0:
return visitArrayInitializer((ArrayInitializer) node);
case 1:
return visitBinaryOperation((BinaryOperation) node);
case 2:
return visitBooleanLiteral((BooleanLiteral) node);
case 3:
return visitBreakStatement((BreakStatement) node);
case 4:
return visitCallExpression((CallExpression) node);
case 5:
return visitCommaExpression((CommaExpression) node);
case 6:
return visitConditionalOperator((ConditionalOperator) node);
case 7:
return visitConstDeclaration((ConstStatement) node);
case 8:
return visitContinueStatement((ContinueStatement) node);
case 9:
return visitDecimalLiteral((DecimalLiteral) node);
case 10:
return visitDoWhileStatement((DoWhileStatement) node);
case 11:
return visitEmptyExpression((EmptyExpression) node);
case 12:
return visitForStatement((ForStatement) node);
case 13:
return visitForInStatement((ForInStatement) node);
case 14:
return visitForEachInStatement((ForEachInStatement) node);
case 15:
return visitFunctionStatement((FunctionStatement) node);
case 16:
return visitGetArrayItemExpression((GetArrayItemExpression) node);
case 17:
return visitIdentifier((Identifier) node);
case 18:
return visitIfStatement((IfStatement) node);
case 19:
return visitLabelledStatement((LabelledStatement) node);
case 20:
return visitNewExpression((NewExpression) node);
case 21:
return visitNullExpression((NullExpression) node);
case 22:
return visitObjectInitializer((ObjectInitializer) node);
case 23:
return visitParenthesizedExpression((ParenthesizedExpression) node);
case 24:
return visitPropertyExpression((PropertyExpression) node);
case 25:
return visitRegExpLiteral((RegExpLiteral) node);
case 26:
return visitReturnStatement((ReturnStatement) node);
case 27:
return visitScript((Script) node);
case 28:
return visitStatementBlock((StatementBlock) node);
case 29:
return visitStringLiteral((StringLiteral) node);
case 30:
return visitSwitchStatement((SwitchStatement) node);
case 31:
return visitThisExpression((ThisExpression) node);
case 32:
return visitThrowStatement((ThrowStatement) node);
case 33:
return visitTryStatement((TryStatement) node);
case 34:
return visitUnaryOperation((UnaryOperation) node);
case 35:
return visitVariableStatement((VariableStatement) node);
case 36:
return visitVoidExpression((VoidExpression) node);
case 37:
return visitYieldOperator((YieldOperator) node);
case 38:
return visitWhileStatement((WhileStatement) node);
case 39:
return visitWithStatement((WithStatement) node);
case 40:
return visitXmlLiteral((XmlLiteral) node);
case 41:
return visitDefaultXmlNamespace((DefaultXmlNamespaceStatement) node);
case 42:
return visitXmlPropertyIdentifier((XmlAttributeIdentifier) node);
case 43:
return visitAsteriskExpression((AsteriskExpression) node);
case 44:
return visitGetAllChildrenExpression((GetAllChildrenExpression) node);
case 45:
return visitGetLocalNameExpression((GetLocalNameExpression) node);
case 46:
return visitErrorExpression((ErrorExpression) node);
case 47:
return visitEmptyStatement((EmptyStatement) node);
}
return visitUnknownNode(node);
}
public E visit(ASTNode node) {
if (node == null) {
return null;
}
Integer handler = HANDLERS.get(node.getClass());
if (handler != null) {
return handle(node, handler.intValue());
} else {
if (node instanceof JSUserNode) {
final ASTNode original = ((JSUserNode) node).getOriginal();
if (original != null) {
handler = HANDLERS.get(original.getClass());
if (handler != null) {
return handle(original, handler.intValue());
}
}
}
return visitUnknownNode(node);
}
}
public abstract E visitArrayInitializer(ArrayInitializer node);
public abstract E visitBinaryOperation(BinaryOperation node);
public abstract E visitBooleanLiteral(BooleanLiteral node);
public abstract E visitBreakStatement(BreakStatement node);
public abstract E visitCallExpression(CallExpression node);
@Deprecated
public final E visitCaseClause(CaseClause node) {
return null;
}
@Deprecated
public final E visitCatchClause(CatchClause node) {
return null;
}
public abstract E visitCommaExpression(CommaExpression node);
public abstract E visitConditionalOperator(ConditionalOperator node);
public abstract E visitConstDeclaration(ConstStatement node);
public abstract E visitContinueStatement(ContinueStatement node);
public abstract E visitDecimalLiteral(DecimalLiteral node);
@Deprecated
public final E visitDefaultClause(DefaultClause node) {
return null;
}
public abstract E visitDoWhileStatement(DoWhileStatement node);
public abstract E visitEmptyExpression(EmptyExpression node);
@Deprecated
public final E visitFinallyClause(FinallyClause node) {
return null;
}
public abstract E visitForStatement(ForStatement node);
public abstract E visitForInStatement(ForInStatement node);
public abstract E visitForEachInStatement(ForEachInStatement node);
public abstract E visitFunctionStatement(FunctionStatement node);
@Deprecated
public final E visitArgument(Argument argument) {
return null;
}
public abstract E visitGetArrayItemExpression(GetArrayItemExpression node);
@Deprecated
public final E visitGetMethod(GetMethod node) {
return null;
}
public abstract E visitIdentifier(Identifier node);
public abstract E visitIfStatement(IfStatement node);
@Deprecated
public final E visitKeyword(Keyword node) {
return null;
}
public abstract E visitLabelledStatement(LabelledStatement node);
public abstract E visitNewExpression(NewExpression node);
public abstract E visitNullExpression(NullExpression node);
public abstract E visitObjectInitializer(ObjectInitializer node);
public abstract E visitParenthesizedExpression(ParenthesizedExpression node);
public abstract E visitPropertyExpression(PropertyExpression node);
@Deprecated
public final E visitPropertyInitializer(PropertyInitializer node) {
return null;
}
public abstract E visitRegExpLiteral(RegExpLiteral node);
public abstract E visitReturnStatement(ReturnStatement node);
public abstract E visitScript(Script node);
@Deprecated
public final E visitSetMethod(SetMethod node) {
return null;
}
public abstract E visitStatementBlock(StatementBlock node);
public abstract E visitStringLiteral(StringLiteral node);
public abstract E visitSwitchStatement(SwitchStatement node);
public abstract E visitThisExpression(ThisExpression node);
public abstract E visitThrowStatement(ThrowStatement node);
public abstract E visitTryStatement(TryStatement node);
public abstract E visitUnaryOperation(UnaryOperation node);
public abstract E visitVariableStatement(VariableStatement node);
@Deprecated
public final E visitVariableDeclaration(VariableDeclaration node) {
return null;
}
public abstract E visitVoidExpression(VoidExpression node);
public abstract E visitYieldOperator(YieldOperator node);
public abstract E visitWhileStatement(WhileStatement node);
public abstract E visitWithStatement(WithStatement node);
public abstract E visitXmlLiteral(XmlLiteral node);
public abstract E visitDefaultXmlNamespace(DefaultXmlNamespaceStatement node);
public abstract E visitXmlPropertyIdentifier(XmlAttributeIdentifier node);
public abstract E visitAsteriskExpression(AsteriskExpression node);
public abstract E visitGetAllChildrenExpression(
GetAllChildrenExpression node);
public abstract E visitGetLocalNameExpression(GetLocalNameExpression node);
public E visitErrorExpression(ErrorExpression node) {
return null;
}
public abstract E visitEmptyStatement(EmptyStatement node);
/**
* @since 2.0
*/
public E visitUnknownNode(ASTNode node) {
throw new UnsupportedOperationException("Unknown node type: "
+ node.getClass().getName());
}
}