Flex:FalconJx
- refactor expressions into ASEmitter from ASBlockWalker
- removed a couple unused visit methods
git-svn-id: https://svn.apache.org/repos/asf/flex/whiteboard@1434429 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/as/codegen/IASEmitter.java b/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/as/codegen/IASEmitter.java
index 2697b8d..38b2c7e 100644
--- a/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/as/codegen/IASEmitter.java
+++ b/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/as/codegen/IASEmitter.java
@@ -22,25 +22,37 @@
import java.io.Writer;
import org.apache.flex.compiler.internal.tree.as.FunctionObjectNode;
+import org.apache.flex.compiler.internal.tree.as.LabeledStatementNode;
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.IDynamicAccessNode;
import org.apache.flex.compiler.tree.as.IExpressionNode;
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.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.ISetterNode;
import org.apache.flex.compiler.tree.as.ISwitchNode;
+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.IVariableNode;
import org.apache.flex.compiler.tree.as.IWhileLoopNode;
import org.apache.flex.compiler.tree.as.IWithNode;
@@ -256,6 +268,13 @@
*/
void emitCatch(ICatchNode node);
+ /**
+ * Emit a <code>foo:{}</code> statement.
+ *
+ * @param node The {@link LabeledStatementNode} node.
+ */
+ void emitLabelStatement(LabeledStatementNode node);
+
//--------------------------------------------------------------------------
// Expressions
//--------------------------------------------------------------------------
@@ -290,6 +309,24 @@
*/
void emitFunctionCall(IFunctionCallNode node);
+ void emitIterationFlow(IIterationFlowNode node);
+
+ void emitMemberAccessExpression(IMemberAccessExpressionNode node);
+
+ void emitDynamicAccess(IDynamicAccessNode node);
+
+ void emitTypedExpression(ITypedExpressionNode node);
+
+ void emitObjectLiteralValuePair(IObjectLiteralValuePairNode node);
+
+ void emitIdentifier(IIdentifierNode node);
+
+ void emitLiteral(ILiteralNode node);
+
+ void emitLiteralContainer(IContainerNode node);
+
+ void emitNumericLiteral(INumericLiteralNode node);
+
//--------------------------------------------------------------------------
// Operators
//--------------------------------------------------------------------------
@@ -301,4 +338,11 @@
*/
void emitBinaryOperator(IBinaryOperatorNode node);
+ void emitTernaryOperator(ITernaryOperatorNode node);
+
+ //--------------------------------------------------------------------------
+ // Node
+ //--------------------------------------------------------------------------
+
+ void emitKeyword(IKeywordNode node);
}
diff --git a/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASBlockWalker.java b/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASBlockWalker.java
index bf282cc..bcb6e25 100644
--- a/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASBlockWalker.java
+++ b/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASBlockWalker.java
@@ -27,7 +27,6 @@
import org.apache.flex.compiler.definitions.IInterfaceDefinition;
import org.apache.flex.compiler.internal.semantics.SemanticUtils;
import org.apache.flex.compiler.internal.tree.as.BaseLiteralContainerNode;
-import org.apache.flex.compiler.internal.tree.as.ContainerNode;
import org.apache.flex.compiler.internal.tree.as.FunctionObjectNode;
import org.apache.flex.compiler.internal.tree.as.LabeledStatementNode;
import org.apache.flex.compiler.internal.tree.as.NamespaceAccessExpressionNode;
@@ -42,7 +41,6 @@
import org.apache.flex.compiler.tree.as.IClassNode;
import org.apache.flex.compiler.tree.as.IConditionalNode;
import org.apache.flex.compiler.tree.as.IContainerNode;
-import org.apache.flex.compiler.tree.as.IContainerNode.ContainerType;
import org.apache.flex.compiler.tree.as.IDefaultXMLNamespaceNode;
import org.apache.flex.compiler.tree.as.IDynamicAccessNode;
import org.apache.flex.compiler.tree.as.IEmbedNode;
@@ -141,6 +139,10 @@
emitter.setWalker(this);
}
+ //--------------------------------------------------------------------------
+ // File level
+ //--------------------------------------------------------------------------
+
@Override
public void walk(IASNode node)
{
@@ -189,6 +191,10 @@
emitter.emitPackageFooter(node);
}
+ //--------------------------------------------------------------------------
+ // Type level
+ //--------------------------------------------------------------------------
+
@Override
public void visitClass(IClassNode node)
{
@@ -279,16 +285,6 @@
}
@Override
- public void visitContainer(IContainerNode node)
- {
- debug("visitContainer()");
- emitter.write(toPrefix(node.getContainerType()));
- for (int i = 0; i < node.getChildCount(); i++)
- walk(node.getChild(i));
- emitter.write(toPostfix(node.getContainerType()));
- }
-
- @Override
public void visitIf(IIfNode node)
{
debug("visitIf()");
@@ -318,19 +314,6 @@
}
@Override
- public void visitIterationFlow(IIterationFlowNode node)
- {
- debug("visitIterationFlow()");
- emitter.write(node.getKind().toString().toLowerCase());
- IIdentifierNode lnode = node.getLabelNode();
- if (lnode != null)
- {
- emitter.write(" ");
- walk(lnode);
- }
- }
-
- @Override
public void visitSwitch(ISwitchNode node)
{
debug("visitSwitch()");
@@ -380,18 +363,24 @@
}
@Override
+ public void visitIterationFlow(IIterationFlowNode node)
+ {
+ debug("visitIterationFlow()");
+ emitter.emitIterationFlow(node);
+ }
+
+ @Override
public void visitIdentifier(IIdentifierNode node)
{
debug("visitIdentifier(" + node.getName() + ")");
- String name = node.getName();
- emitter.write(name);
+ emitter.emitIdentifier(node);
}
@Override
public void visitNumericLiteral(INumericLiteralNode node)
{
debug("visitNumericLiteral(" + node.getNumericValue() + ")");
- emitter.write(node.getNumericValue().toString());
+ emitter.emitNumericLiteral(node);
}
@Override
@@ -406,7 +395,7 @@
public void visitKeyword(IKeywordNode node)
{
debug("visitKeyword(" + node.getNodeID().getParaphrase() + ")");
- emitter.write(node.getNodeID().getParaphrase());
+ emitter.emitKeyword(node);
}
@Override
@@ -422,38 +411,22 @@
|| node.getLiteralType() == LiteralType.STRING
|| node.getLiteralType() == LiteralType.VOID)
{
- emitter.write(node.getValue(true));
+ emitter.emitLiteral(node);
}
else if (node.getLiteralType() == LiteralType.ARRAY
|| node.getLiteralType() == LiteralType.OBJECT)
{
BaseLiteralContainerNode anode = (BaseLiteralContainerNode) node;
- ContainerNode cnode = anode.getContentsNode();
- visitLiteralContainer(cnode);
+ IContainerNode cnode = anode.getContentsNode();
+ emitter.emitLiteralContainer(cnode);
}
}
- public void visitLiteralContainer(IContainerNode node)
- {
- emitter.write(toPrefix(node.getContainerType()));
- final int len = node.getChildCount();
- for (int i = 0; i < len; i++)
- {
- IASNode child = node.getChild(i);
- walk(child);
- if (i < len - 1)
- emitter.write(",");
- }
- emitter.write(toPostfix(node.getContainerType()));
- }
-
@Override
public void visitMemberAccessExpression(IMemberAccessExpressionNode node)
{
debug("visitMemberAccessExpression()");
- walk(node.getLeftOperandNode());
- emitter.write(node.getOperator().getOperatorText());
- walk(node.getRightOperandNode());
+ emitter.emitMemberAccessExpression(node);
}
@Override
@@ -470,20 +443,14 @@
public void visitDynamicAccess(IDynamicAccessNode node)
{
debug("visitDynamicAccess()");
- walk(node.getLeftOperandNode());
- emitter.write("[");
- walk(node.getRightOperandNode());
- emitter.write("]");
+ emitter.emitDynamicAccess(node);
}
@Override
public void visitTypedExpression(ITypedExpressionNode node)
{
debug("visitITypedExpression()");
- walk(node.getCollectionNode());
- emitter.write(".<");
- walk(node.getTypeNode());
- emitter.write(">");
+ emitter.emitTypedExpression(node);
}
@Override
@@ -588,6 +555,7 @@
public void visitEmbed(IEmbedNode node)
{
debug("visitEmbed(" + node.getAttributes()[0].getValue() + ")");
+ // TODO (mschmalle) visitEmbed()
}
@Override
@@ -607,35 +575,21 @@
public void visitTernaryOperator(ITernaryOperatorNode node)
{
debug("visitTernaryOperator()");
- walk(node.getConditionalNode());
- emitter.write(" ");
- emitter.write("?");
- emitter.write(" ");
- walk(node.getLeftOperandNode());
- emitter.write(" ");
- emitter.write(":");
- emitter.write(" ");
- walk(node.getRightOperandNode());
+ emitter.emitTernaryOperator(node);
}
@Override
public void visitLabeledStatement(LabeledStatementNode node)
{
debug("visitLabeledStatement()");
- emitter.write(node.getLabel());
- emitter.write(" ");
- emitter.write(":");
- emitter.write(" ");
- walk(node.getLabeledStatement());
+ emitter.emitLabelStatement(node);
}
@Override
- public void visitIObjectLiteralValuePair(IObjectLiteralValuePairNode node)
+ public void visitObjectLiteralValuePair(IObjectLiteralValuePairNode node)
{
debug("visitIObjectLiteralValuePair()");
- walk(node.getNameNode());
- emitter.write(":");
- walk(node.getValueNode());
+ emitter.emitObjectLiteralValuePair(node);
}
@Override
@@ -672,32 +626,6 @@
System.out.println(message);
}
- private String toPrefix(ContainerType type)
- {
- if (type == ContainerType.BRACES)
- return "{";
- else if (type == ContainerType.BRACKETS)
- return "[";
- else if (type == ContainerType.IMPLICIT)
- return "";
- else if (type == ContainerType.PARENTHESIS)
- return "(";
- return null;
- }
-
- private String toPostfix(ContainerType type)
- {
- if (type == ContainerType.BRACES)
- return "}";
- else if (type == ContainerType.BRACKETS)
- return "]";
- else if (type == ContainerType.IMPLICIT)
- return "";
- else if (type == ContainerType.PARENTHESIS)
- return ")";
- return null;
- }
-
//--------------------------------------------------------------------------
//
//--------------------------------------------------------------------------
diff --git a/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASEmitter.java b/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASEmitter.java
index e5f4f67..1847ce7 100644
--- a/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASEmitter.java
+++ b/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASEmitter.java
@@ -35,6 +35,7 @@
import org.apache.flex.compiler.internal.tree.as.ChainedVariableNode;
import org.apache.flex.compiler.internal.tree.as.FunctionNode;
import org.apache.flex.compiler.internal.tree.as.FunctionObjectNode;
+import org.apache.flex.compiler.internal.tree.as.LabeledStatementNode;
import org.apache.flex.compiler.problems.ICompilerProblem;
import org.apache.flex.compiler.tree.ASTNodeID;
import org.apache.flex.compiler.tree.as.IASNode;
@@ -46,15 +47,22 @@
import org.apache.flex.compiler.tree.as.IConditionalNode;
import org.apache.flex.compiler.tree.as.IContainerNode;
import org.apache.flex.compiler.tree.as.IDefinitionNode;
+import org.apache.flex.compiler.tree.as.IDynamicAccessNode;
import org.apache.flex.compiler.tree.as.IExpressionNode;
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.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.IScopedNode;
@@ -62,9 +70,11 @@
import org.apache.flex.compiler.tree.as.IStatementNode;
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.ITypeNode;
+import org.apache.flex.compiler.tree.as.ITypedExpressionNode;
import org.apache.flex.compiler.tree.as.IVariableNode;
import org.apache.flex.compiler.tree.as.IContainerNode.ContainerType;
import org.apache.flex.compiler.tree.as.IWhileLoopNode;
@@ -1056,6 +1066,32 @@
// Static Utility
//--------------------------------------------------------------------------
+ private static String toPrefix(ContainerType type)
+ {
+ if (type == ContainerType.BRACES)
+ return "{";
+ else if (type == ContainerType.BRACKETS)
+ return "[";
+ else if (type == ContainerType.IMPLICIT)
+ return "";
+ else if (type == ContainerType.PARENTHESIS)
+ return "(";
+ return null;
+ }
+
+ private static String toPostfix(ContainerType type)
+ {
+ if (type == ContainerType.BRACES)
+ return "}";
+ else if (type == ContainerType.BRACKETS)
+ return "]";
+ else if (type == ContainerType.IMPLICIT)
+ return "";
+ else if (type == ContainerType.PARENTHESIS)
+ return ")";
+ return null;
+ }
+
protected static IFunctionNode getConstructor(IDefinitionNode[] members)
{
for (IDefinitionNode node : members)
@@ -1159,4 +1195,113 @@
return null;
}
+
+ @Override
+ public void emitLiteral(ILiteralNode node)
+ {
+ write(node.getValue(true));
+ }
+
+ @Override
+ public void emitLiteralContainer(IContainerNode node)
+ {
+ write(toPrefix(node.getContainerType()));
+ final int len = node.getChildCount();
+ for (int i = 0; i < len; i++)
+ {
+ IASNode child = node.getChild(i);
+ getWalker().walk(child);
+ if (i < len - 1)
+ write(",");
+ }
+ write(toPostfix(node.getContainerType()));
+ }
+
+ @Override
+ public void emitIdentifier(IIdentifierNode node)
+ {
+ write(node.getName());
+ }
+
+ @Override
+ public void emitNumericLiteral(INumericLiteralNode node)
+ {
+ write(node.getNumericValue().toString());
+ }
+
+ @Override
+ public void emitKeyword(IKeywordNode node)
+ {
+ write(node.getNodeID().getParaphrase());
+ }
+
+ @Override
+ public void emitIterationFlow(IIterationFlowNode node)
+ {
+ write(node.getKind().toString().toLowerCase());
+ IIdentifierNode lnode = node.getLabelNode();
+ if (lnode != null)
+ {
+ write(" ");
+ getWalker().walk(lnode);
+ }
+ }
+
+ @Override
+ public void emitMemberAccessExpression(IMemberAccessExpressionNode node)
+ {
+ getWalker().walk(node.getLeftOperandNode());
+ write(node.getOperator().getOperatorText());
+ getWalker().walk(node.getRightOperandNode());
+ }
+
+ @Override
+ public void emitDynamicAccess(IDynamicAccessNode node)
+ {
+ getWalker().walk(node.getLeftOperandNode());
+ write("[");
+ getWalker().walk(node.getRightOperandNode());
+ write("]");
+ }
+
+ @Override
+ public void emitTypedExpression(ITypedExpressionNode node)
+ {
+ getWalker().walk(node.getCollectionNode());
+ write(".<");
+ getWalker().walk(node.getTypeNode());
+ write(">");
+ }
+
+ @Override
+ public void emitTernaryOperator(ITernaryOperatorNode node)
+ {
+ getWalker().walk(node.getConditionalNode());
+ write(" ");
+ write("?");
+ write(" ");
+ getWalker().walk(node.getLeftOperandNode());
+ write(" ");
+ write(":");
+ write(" ");
+ getWalker().walk(node.getRightOperandNode());
+ }
+
+ @Override
+ public void emitObjectLiteralValuePair(IObjectLiteralValuePairNode node)
+ {
+ getWalker().walk(node.getNameNode());
+ write(":");
+ getWalker().walk(node.getValueNode());
+ }
+
+ @Override
+ public void emitLabelStatement(LabeledStatementNode node)
+ {
+ write(node.getLabel());
+ write(" ");
+ write(":");
+ write(" ");
+ getWalker().walk(node.getLabeledStatement());
+ }
}
diff --git a/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/visitor/ASNodeSwitch.java b/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/visitor/ASNodeSwitch.java
index e4f67de..f8cdb85 100644
--- a/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/visitor/ASNodeSwitch.java
+++ b/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/visitor/ASNodeSwitch.java
@@ -28,7 +28,6 @@
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.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;
@@ -259,10 +258,6 @@
{
visitor.visitBlock((IBlockNode) node);
}
- else if (node instanceof IContainerNode)
- {
- visitor.visitContainer((IContainerNode) node);
- }
// TODO (mschmalle) Organize leaf
@@ -276,7 +271,7 @@
}
else if (node instanceof IObjectLiteralValuePairNode)
{
- visitor.visitIObjectLiteralValuePair((IObjectLiteralValuePairNode) node);
+ visitor.visitObjectLiteralValuePair((IObjectLiteralValuePairNode) node);
}
else if (node instanceof ILanguageIdentifierNode)
{
diff --git a/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/visitor/IASBlockVisitor.java b/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/visitor/IASBlockVisitor.java
index 5edb718..3ad8ac4 100644
--- a/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/visitor/IASBlockVisitor.java
+++ b/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/visitor/IASBlockVisitor.java
@@ -29,7 +29,6 @@
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.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;
@@ -149,7 +148,7 @@
// is a IVariableNode
void visitParameter(IParameterNode node);
- void visitIObjectLiteralValuePair(IObjectLiteralValuePairNode node);
+ void visitObjectLiteralValuePair(IObjectLiteralValuePairNode node);
//--------------------------------------------------------------------------
// Expression Statement nodes
@@ -176,9 +175,6 @@
// Container nodes
//--------------------------------------------------------------------------
- // TODO (mschmalle) make sure IContainerNode and IBlock are explicitly different and independent
- void visitContainer(IContainerNode node);
-
void visitBlock(IBlockNode node);
//--------------------------------------------------------------------------