blob: 3ad8ac469e66e50a79e7aefe32fd652da57b3c4e [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.visitor;
import org.apache.flex.compiler.internal.as.codegen.ASBlockWalker;
import org.apache.flex.compiler.internal.as.visitor.ASNodeSwitch;
import org.apache.flex.compiler.internal.tree.as.LabeledStatementNode;
import org.apache.flex.compiler.internal.tree.as.NamespaceAccessExpressionNode;
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;
/**
* The {@link IASBlockVisitor} interface allows an {@link IASNodeStrategy} to
* delegate within it's {@link IASNodeStrategy#handle(IASNode)} method to this
* API's visitor method.
* <p>
* Currently the {@link ASNodeSwitch} class is a monolithic if else statement
* using instanceof to switch on the correct {@link IASNode} interface type.
* This is where more experienced developers in Java might know a way that is
* more efficient but, currently it works well, performance on the instanceof
* will have to be determined.
* <p>
* <strong>Note</strong> This API is not complete.
*
* @author Michael Schmalle
*
* @see ASBlockWalker
*/
public interface IASBlockVisitor
{
//--------------------------------------------------------------------------
// Top level nodes
//--------------------------------------------------------------------------
void visitCompilationUnit(ICompilationUnit unit);
void visitPackage(IPackageNode node);
void visitFile(IFileNode node);
void visitClass(IClassNode node);
void visitInterface(IInterfaceNode node);
//--------------------------------------------------------------------------
// Member nodes
//--------------------------------------------------------------------------
// block var or field
void visitVariable(IVariableNode node);
void visitFunction(IFunctionNode node);
void visitGetter(IGetterNode node);
void visitSetter(ISetterNode node);
void visitNamespace(INamespaceNode node);
//--------------------------------------------------------------------------
// Statement nodes
//--------------------------------------------------------------------------
void visitIf(IIfNode node);
void visitForLoop(IForLoopNode node);
void visitWhileLoop(IWhileLoopNode node);
void visitTry(ITryNode node);
void visitCatch(ICatchNode node);
void visitSwitch(ISwitchNode node);
void visitLabeledStatement(LabeledStatementNode node);
void visitWith(IWithNode node);
void visitThrow(IThrowNode node);
//--------------------------------------------------------------------------
// Statement helper nodes
//--------------------------------------------------------------------------
void visitIterationFlow(IIterationFlowNode node);
void visitConditional(IConditionalNode node);
// is a IVariableNode
void visitParameter(IParameterNode node);
void visitObjectLiteralValuePair(IObjectLiteralValuePairNode node);
//--------------------------------------------------------------------------
// Expression Statement nodes
//--------------------------------------------------------------------------
void visitMemberAccessExpression(IMemberAccessExpressionNode node);
void visitNamespaceAccessExpression(NamespaceAccessExpressionNode node);
void visitLanguageIdentifierNode(ILanguageIdentifierNode node);
void visitReturn(IReturnNode node);
void visitDefaultXMLNamespace(IDefaultXMLNamespaceNode node);
void visitTypedExpression(ITypedExpressionNode node);
// this is a IBinaryOperatorNode goes before
void visitDynamicAccess(IDynamicAccessNode node);
void visitTernaryOperator(ITernaryOperatorNode node);
//--------------------------------------------------------------------------
// Container nodes
//--------------------------------------------------------------------------
void visitBlock(IBlockNode node);
//--------------------------------------------------------------------------
// Expression nodes
//--------------------------------------------------------------------------
void visitFunctionCall(IFunctionCallNode node);
void visitBinaryOperator(IBinaryOperatorNode node);
void visitUnaryOperator(IUnaryOperatorNode node);
void visitExpression(IExpressionNode node);
//--------------------------------------------------------------------------
// Terminal like Expression nodes
//--------------------------------------------------------------------------
void visitIdentifier(IIdentifierNode node);
void visitKeyword(IKeywordNode node);
void visitLiteral(ILiteralNode node);
void visitNumericLiteral(INumericLiteralNode node);
void visitTerminal(ITerminalNode node);
//--------------------------------------------------------------------------
// Various nodes
//--------------------------------------------------------------------------
void visitMetaTags(IMetaTagsNode node);
void visitMetaTag(IMetaTagNode node);
void visitEmbed(IEmbedNode node);
}