blob: f8cdb859e1cb6cbc4b2f39266cb7a85882a3d13b [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.flex.compiler.internal.as.visitor;
import org.apache.flex.compiler.internal.tree.as.LabeledStatementNode;
import org.apache.flex.compiler.internal.tree.as.NamespaceAccessExpressionNode;
import org.apache.flex.compiler.tree.ASTNodeID;
import org.apache.flex.compiler.tree.as.IASNode;
import org.apache.flex.compiler.tree.as.IBinaryOperatorNode;
import org.apache.flex.compiler.tree.as.IBlockNode;
import org.apache.flex.compiler.tree.as.ICatchNode;
import org.apache.flex.compiler.tree.as.IClassNode;
import org.apache.flex.compiler.tree.as.IConditionalNode;
import org.apache.flex.compiler.tree.as.IDefaultXMLNamespaceNode;
import org.apache.flex.compiler.tree.as.IDynamicAccessNode;
import org.apache.flex.compiler.tree.as.IEmbedNode;
import org.apache.flex.compiler.tree.as.IExpressionNode;
import org.apache.flex.compiler.tree.as.IFileNode;
import org.apache.flex.compiler.tree.as.IForLoopNode;
import org.apache.flex.compiler.tree.as.IFunctionCallNode;
import org.apache.flex.compiler.tree.as.IFunctionNode;
import org.apache.flex.compiler.tree.as.IGetterNode;
import org.apache.flex.compiler.tree.as.IIdentifierNode;
import org.apache.flex.compiler.tree.as.IIfNode;
import org.apache.flex.compiler.tree.as.IInterfaceNode;
import org.apache.flex.compiler.tree.as.IIterationFlowNode;
import org.apache.flex.compiler.tree.as.IKeywordNode;
import org.apache.flex.compiler.tree.as.ILanguageIdentifierNode;
import org.apache.flex.compiler.tree.as.ILiteralNode;
import org.apache.flex.compiler.tree.as.IMemberAccessExpressionNode;
import org.apache.flex.compiler.tree.as.INamespaceNode;
import org.apache.flex.compiler.tree.as.INumericLiteralNode;
import org.apache.flex.compiler.tree.as.IObjectLiteralValuePairNode;
import org.apache.flex.compiler.tree.as.IPackageNode;
import org.apache.flex.compiler.tree.as.IParameterNode;
import org.apache.flex.compiler.tree.as.IReturnNode;
import org.apache.flex.compiler.tree.as.ISetterNode;
import org.apache.flex.compiler.tree.as.ISwitchNode;
import org.apache.flex.compiler.tree.as.ITerminalNode;
import org.apache.flex.compiler.tree.as.ITernaryOperatorNode;
import org.apache.flex.compiler.tree.as.IThrowNode;
import org.apache.flex.compiler.tree.as.ITryNode;
import org.apache.flex.compiler.tree.as.ITypedExpressionNode;
import org.apache.flex.compiler.tree.as.IUnaryOperatorNode;
import org.apache.flex.compiler.tree.as.IVariableNode;
import org.apache.flex.compiler.tree.as.IWhileLoopNode;
import org.apache.flex.compiler.tree.as.IWithNode;
import org.apache.flex.compiler.tree.metadata.IMetaTagNode;
import org.apache.flex.compiler.tree.metadata.IMetaTagsNode;
import org.apache.flex.compiler.units.ICompilationUnit;
import org.apache.flex.compiler.visitor.IASBlockVisitor;
import org.apache.flex.compiler.visitor.IASNodeStrategy;
/**
* The {@link ASNodeSwitch} class is an {@link IASNodeStrategy} implementation
* that handles {@link IASNode} types based on the node interface type.
* <p>
* All traversable {@link ASTNodeID} node visitor methods are found within the
* class {@link #handle(IASNode)} method's if else statements.
*
* @author Michael Schmalle
*/
public class ASNodeSwitch implements IASNodeStrategy
{
private IASBlockVisitor visitor;
/**
* Creates a new node switch using the {@link #visitor} to handle the
* {@link IASNode} in the current traverse.
*
* @param visitor The {@link IASBlockVisitor} strategy that will visit an
* {@link IASNode} based on it's type.
*/
public ASNodeSwitch(IASBlockVisitor visitor)
{
this.visitor = visitor;
}
@Override
public void handle(IASNode node)
{
if (node instanceof ICompilationUnit)
{
visitor.visitCompilationUnit((ICompilationUnit) node);
}
else if (node instanceof IFileNode)
{
visitor.visitFile((IFileNode) node);
}
else if (node instanceof IPackageNode)
{
visitor.visitPackage((IPackageNode) node);
}
// ITypeNode
else if (node instanceof IClassNode)
{
visitor.visitClass((IClassNode) node);
}
else if (node instanceof IInterfaceNode)
{
visitor.visitInterface((IInterfaceNode) node);
}
// IScopedDefinitionNode
else if (node instanceof IGetterNode)
{
visitor.visitGetter((IGetterNode) node);
}
else if (node instanceof ISetterNode)
{
visitor.visitSetter((ISetterNode) node);
}
else if (node instanceof IFunctionNode)
{
visitor.visitFunction((IFunctionNode) node);
}
// IVariableNode
else if (node instanceof IParameterNode)
{
visitor.visitParameter((IParameterNode) node);
}
else if (node instanceof IVariableNode)
{
visitor.visitVariable((IVariableNode) node);
}
else if (node instanceof INamespaceNode)
{
visitor.visitNamespace((INamespaceNode) node);
}
// IStatementNode
else if (node instanceof ICatchNode)
{
visitor.visitCatch((ICatchNode) node);
}
else if (node instanceof IForLoopNode)
{
visitor.visitForLoop((IForLoopNode) node);
}
else if (node instanceof ITerminalNode)
{
visitor.visitTerminal((ITerminalNode) node);
}
else if (node instanceof ITryNode)
{
visitor.visitTry((ITryNode) node);
}
else if (node instanceof IWithNode)
{
visitor.visitWith((IWithNode) node);
}
// IConditionalNode after statements
// > IConditionalNode > IStatementNode
else if (node instanceof IIfNode)
{
visitor.visitIf((IIfNode) node);
}
else if (node instanceof ISwitchNode)
{
visitor.visitSwitch((ISwitchNode) node);
}
else if (node instanceof IWhileLoopNode)
{
visitor.visitWhileLoop((IWhileLoopNode) node);
}
else if (node instanceof IConditionalNode)
{
visitor.visitConditional((IConditionalNode) node);
}
// IExpressionNode
else if (node instanceof IEmbedNode)
{
visitor.visitEmbed((IEmbedNode) node);
}
else if (node instanceof IFunctionCallNode)
{
visitor.visitFunctionCall((IFunctionCallNode) node);
}
else if (node instanceof ITypedExpressionNode)
{
visitor.visitTypedExpression((ITypedExpressionNode) node);
}
else if (node instanceof IIdentifierNode)
{
visitor.visitIdentifier((IIdentifierNode) node);
}
// ILiteralNode > IExpressionNode
else if (node instanceof INumericLiteralNode)
{
visitor.visitNumericLiteral((INumericLiteralNode) node);
}
else if (node instanceof ILiteralNode)
{
visitor.visitLiteral((ILiteralNode) node);
}
// IBinaryOperatorNode > IOperator
else if (node instanceof IMemberAccessExpressionNode)
{
visitor.visitMemberAccessExpression((IMemberAccessExpressionNode) node);
}
else if (node instanceof IDynamicAccessNode)
{
visitor.visitDynamicAccess((IDynamicAccessNode) node);
}
else if (node instanceof NamespaceAccessExpressionNode)
{
visitor.visitNamespaceAccessExpression((NamespaceAccessExpressionNode) node);
}
else if (node instanceof IBinaryOperatorNode)
{
visitor.visitBinaryOperator((IBinaryOperatorNode) node);
}
// IUnaryOperatorNode > IOperator
else if (node instanceof IUnaryOperatorNode)
{
visitor.visitUnaryOperator((IUnaryOperatorNode) node);
}
else if (node instanceof IReturnNode)
{
visitor.visitReturn((IReturnNode) node);
}
else if (node instanceof IThrowNode)
{
visitor.visitThrow((IThrowNode) node);
}
else if (node instanceof ITernaryOperatorNode)
{
visitor.visitTernaryOperator((ITernaryOperatorNode) node);
}
// Container
else if (node instanceof IBlockNode)
{
visitor.visitBlock((IBlockNode) node);
}
// TODO (mschmalle) Organize leaf
else if (node instanceof LabeledStatementNode)
{
visitor.visitLabeledStatement((LabeledStatementNode) node);
}
else if (node instanceof IIterationFlowNode)
{
visitor.visitIterationFlow((IIterationFlowNode) node);
}
else if (node instanceof IObjectLiteralValuePairNode)
{
visitor.visitObjectLiteralValuePair((IObjectLiteralValuePairNode) node);
}
else if (node instanceof ILanguageIdentifierNode)
{
visitor.visitLanguageIdentifierNode((ILanguageIdentifierNode) node);
}
else if (node instanceof IDefaultXMLNamespaceNode)
{
visitor.visitDefaultXMLNamespace((IDefaultXMLNamespaceNode) node);
}
else if (node instanceof IKeywordNode)
{
visitor.visitKeyword((IKeywordNode) node);
}
else if (node instanceof IMetaTagsNode)
{
visitor.visitMetaTags((IMetaTagsNode) node);
}
else if (node instanceof IMetaTagNode)
{
visitor.visitMetaTag((IMetaTagNode) node);
}
else if (node instanceof IExpressionNode)
{
visitor.visitExpression((IExpressionNode) node);
}
else
{
throw new RuntimeException("handle() not found "
+ node.getClass().getName());
}
}
}