/*
*
* 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.visitor.as;
import org.apache.flex.compiler.internal.tree.as.BinaryOperatorAsNode;
import org.apache.flex.compiler.internal.tree.as.BinaryOperatorIsNode;
import org.apache.flex.compiler.internal.tree.as.ConfigConditionBlockNode;
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.IContainerNode;
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.IFunctionObjectNode;
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.IImportNode;
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.INamespaceAccessExpressionNode;
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.IUseNamespaceNode;
import org.apache.flex.compiler.tree.as.IVariableExpressionNode;
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.visitor.IASNodeStrategy;
import org.apache.flex.compiler.visitor.IBlockVisitor;
import org.apache.flex.compiler.visitor.as.IASBlockVisitor;
/**
* 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(IBlockVisitor visitor)
{
this.visitor = (IASBlockVisitor) visitor;
}
@Override
public void handle(IASNode node)
{
if (node == null)
return;
// TODO (mschmalle) Still working on the switch, its complication in the expressions
switch (node.getNodeID())
{
case ContainerID:
visitor.visitContainer((IContainerNode) node);
return;
case ConfigBlockID:
ConfigConditionBlockNode condcomp = (ConfigConditionBlockNode)node;
if (condcomp.getChildCount() > 0) // will be 0 if conditional compile variable is false
visitor.visitBlock((IBlockNode) node);
return;
case E4XFilterID:
visitor.visitE4XFilter((IMemberAccessExpressionNode) node);
return;
case FileID:
visitor.visitFile((IFileNode) node);
return;
case PackageID:
visitor.visitPackage((IPackageNode) node);
return;
case ClassID:
visitor.visitClass((IClassNode) node);
return;
case InterfaceID:
visitor.visitInterface((IInterfaceNode) node);
return;
case GetterID:
visitor.visitGetter((IGetterNode) node);
return;
case SetterID:
visitor.visitSetter((ISetterNode) node);
return;
case FunctionID:
visitor.visitFunction((IFunctionNode) node);
return;
case ArgumentID:
case ArgumentRestID:
visitor.visitParameter((IParameterNode) node);
return;
case VariableID:
case BindableVariableID:
visitor.visitVariable((IVariableNode) node);
return;
case NamespaceID:
visitor.visitNamespace((INamespaceNode) node);
return;
case CatchID:
visitor.visitCatch((ICatchNode) node);
return;
case ForEachLoopID:
case ForLoopID:
visitor.visitForLoop((IForLoopNode) node);
return;
case FinallyID:
case DefaultID:
case ElseID:
case TerminalID:
visitor.visitTerminal((ITerminalNode) node);
return;
case TryID:
visitor.visitTry((ITryNode) node);
return;
case WithID:
visitor.visitWith((IWithNode) node);
return;
case IfStatementID:
visitor.visitIf((IIfNode) node);
return;
case SwitchID:
visitor.visitSwitch((ISwitchNode) node);
return;
case WhileLoopID:
case DoWhileLoopID:
visitor.visitWhileLoop((IWhileLoopNode) node);
return;
case FunctionCallID:
visitor.visitFunctionCall((IFunctionCallNode) node);
return;
case TypedExpressionID:
visitor.visitTypedExpression((ITypedExpressionNode) node);
return;
case IdentifierID:
case NamespaceIdentifierID:
case NonResolvingIdentifierID:
if (node instanceof ILanguageIdentifierNode)
{
visitor.visitLanguageIdentifierNode((ILanguageIdentifierNode) node);
return;
}
visitor.visitIdentifier((IIdentifierNode) node);
return;
//case LiteralIntegerZeroID:
case LiteralIntegerID:
//case LiteralIntegerZeroID:
case LiteralUintID:
visitor.visitNumericLiteral((INumericLiteralNode) node);
return;
// case LiteralArrayID:
// case LiteralBooleanID:
// case LiteralNullID:
// case LiteralNumberID:
// case LiteralObjectID:
// case LiteralRegexID:
// case LiteralStringID:
// case LiteralVoidID:
// case LiteralXMLID:
// case LiteralID:
// visitor.visitLiteral((ILiteralNode) node);
// return;
// case MemberAccessExpressionID:
// visitor.visitMemberAccessExpression((IMemberAccessExpressionNode) node);
// return;
case ArrayIndexExpressionID:
visitor.visitDynamicAccess((IDynamicAccessNode) node);
return;
// case NamespaceAccessExpressionID:
// visitor.visitNamespaceAccessExpression((NamespaceAccessExpressionNode) node);
// return;
// case TODO:
// visitor.visitBinaryOperator((IBinaryOperatorNode) node);
// break;
//
// case TODO:
// visitor.visitUnaryOperator((IUnaryOperatorNode) node);
// break;
case ReturnStatementID:
visitor.visitReturn((IReturnNode) node);
return;
case ThrowsStatementID:
visitor.visitThrow((IThrowNode) node);
return;
case TernaryExpressionID:
visitor.visitTernaryOperator((ITernaryOperatorNode) node);
return;
case BlockID:
visitor.visitBlock((IBlockNode) node);
return;
case LabledStatementID:
visitor.visitLabeledStatement((LabeledStatementNode) node);
return;
case BreakID:
case ContinueID:
case GotoID:
visitor.visitIterationFlow((IIterationFlowNode) node);
return;
// case ObjectLiteralValuePairID:
// visitor.visitObjectLiteralValuePair((IObjectLiteralValuePairNode) node);
// return;
case SuperID:
case VoidID:
// XXX this should be removed
visitor.visitLanguageIdentifierNode((ILanguageIdentifierNode) node);
return;
case DefaultXMLStatementID:
visitor.visitDefaultXMLNamespace((IDefaultXMLNamespaceNode) node);
return;
// case TODO:
// visitor.visitKeyword((IKeywordNode) node);
// break;
case VariableExpressionID:
visitor.visitVariableExpression((IVariableExpressionNode) node);
return;
case FunctionObjectID:
case AnonymousFunctionID:
visitor.visitFunctionObject((IFunctionObjectNode) node);
return;
default:
break;
}
// IExpressionNode
if (node instanceof IUseNamespaceNode)
{
visitor.visitUseNamespace((IUseNamespaceNode) node);
}
else if (node instanceof IEmbedNode)
{
visitor.visitEmbed((IEmbedNode) node);
}
else if (node instanceof IObjectLiteralValuePairNode)
{
visitor.visitObjectLiteralValuePair((IObjectLiteralValuePairNode) node);
}
else if (node instanceof NamespaceAccessExpressionNode)
{
visitor.visitNamespaceAccessExpression((INamespaceAccessExpressionNode) node);
}
else if (node instanceof IMemberAccessExpressionNode)
{
visitor.visitMemberAccessExpression((IMemberAccessExpressionNode) node);
}
else if (node instanceof IBinaryOperatorNode)
{
if (node instanceof BinaryOperatorAsNode)
visitor.visitAsOperator((IBinaryOperatorNode) node);
else if (node instanceof BinaryOperatorIsNode)
visitor.visitIsOperator((IBinaryOperatorNode) node);
else
visitor.visitBinaryOperator((IBinaryOperatorNode) node);
}
// IUnaryOperatorNode > IOperator
else if (node instanceof IUnaryOperatorNode)
{
visitor.visitUnaryOperator((IUnaryOperatorNode) 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 IImportNode)
{
visitor.visitImport((IImportNode) node);
}
else if (node instanceof ILiteralNode)
{
visitor.visitLiteral((ILiteralNode) node);
}
else if (node instanceof IExpressionNode)
{
visitor.visitExpression((IExpressionNode) node);
}
else
{
throw new RuntimeException("handle() not found "
+ node.getClass().getName());
}
}
}