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);
 
     //--------------------------------------------------------------------------