You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ms...@apache.org on 2013/01/16 19:30:48 UTC

svn commit: r1434094 - in /flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler: as/codegen/IASEmitter.java internal/as/codegen/ASBlockWalker.java internal/as/codegen/ASEmitter.java

Author: mschmalle
Date: Wed Jan 16 18:30:48 2013
New Revision: 1434094

URL: http://svn.apache.org/viewvc?rev=1434094&view=rev
Log:
Flex:FalconJx
- Refactored for and for each statements into ASEmitter

Modified:
    flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/as/codegen/IASEmitter.java
    flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASBlockWalker.java
    flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASEmitter.java

Modified: flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/as/codegen/IASEmitter.java
URL: http://svn.apache.org/viewvc/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/as/codegen/IASEmitter.java?rev=1434094&r1=1434093&r2=1434094&view=diff
==============================================================================
--- flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/as/codegen/IASEmitter.java (original)
+++ flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/as/codegen/IASEmitter.java Wed Jan 16 18:30:48 2013
@@ -27,6 +27,7 @@ import org.apache.flex.compiler.tree.as.
 import org.apache.flex.compiler.tree.as.IBlockNode;
 import org.apache.flex.compiler.tree.as.IClassNode;
 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;
@@ -159,7 +160,7 @@ public interface IASEmitter
     void emitSetAccessor(ISetterNode node);
 
     void emitParameter(IParameterNode node);
-    
+
     /**
      * Emit a namespace member.
      * 
@@ -168,6 +169,31 @@ public interface IASEmitter
     void emitNamespace(INamespaceNode node);
 
     //--------------------------------------------------------------------------
+    // Statements
+    //--------------------------------------------------------------------------
+
+    /**
+     * Emit a statement found within an {@link IBlockNode}.
+     * 
+     * @param node The {@link IASNode} statement.
+     */
+    void emitStatement(IASNode node);
+
+    /**
+     * Emit a <code>for each</code> statement.
+     * 
+     * @param node The {@link IForLoopNode} node.
+     */
+    void emitForEachLoop(IForLoopNode node);
+
+    /**
+     * Emit a <code>for</code> statement.
+     * 
+     * @param node The {@link IForLoopNode} node.
+     */
+    void emitForLoop(IForLoopNode node);
+
+    //--------------------------------------------------------------------------
     // Expressions
     //--------------------------------------------------------------------------
 
@@ -186,28 +212,21 @@ public interface IASEmitter
      * @param node The anonymous {@link FunctionObjectNode}.
      */
     void emitFunctionObject(IExpressionNode node);
-    
+
     /**
      * Emit a header at the start of a function block.
      * 
      * @param node The {@link IFunctionNode} node.
      */
     void emitFunctionBlockHeader(IFunctionNode node);
-    
+
     /**
      * Emit a function call like <code>new Foo()</code> or <code>foo(42)</code>.
      * 
      * @param node The {@link IFunctionCallNode} node.
      */
     void emitFunctionCall(IFunctionCallNode node);
-    
-    /**
-     * Emit a statement found within an {@link IBlockNode}.
-     * 
-     * @param node The {@link IASNode} statement.
-     */
-    void emitStatement(IASNode node);
-    
+
     //--------------------------------------------------------------------------
     // Operators
     //--------------------------------------------------------------------------
@@ -219,8 +238,4 @@ public interface IASEmitter
      */
     void emitBinaryOperator(IBinaryOperatorNode node);
 
-    
-
-    
-
 }

Modified: flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASBlockWalker.java
URL: http://svn.apache.org/viewvc/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASBlockWalker.java?rev=1434094&r1=1434093&r2=1434094&view=diff
==============================================================================
--- flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASBlockWalker.java (original)
+++ flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASBlockWalker.java Wed Jan 16 18:30:48 2013
@@ -72,7 +72,6 @@ import org.apache.flex.compiler.tree.as.
 import org.apache.flex.compiler.tree.as.IReturnNode;
 import org.apache.flex.compiler.tree.as.IScopedNode;
 import org.apache.flex.compiler.tree.as.ISetterNode;
-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;
@@ -369,82 +368,13 @@ public class ASBlockWalker implements IA
     protected void visitForEach(IForLoopNode node)
     {
         debug("visitForEach()");
-        IContainerNode xnode = (IContainerNode) node.getChild(1);
-        emitter.write("for");
-        emitter.write(" ");
-        emitter.write("each");
-        emitter.write(" ");
-        emitter.write("(");
-
-        IContainerNode cnode = node.getConditionalsContainerNode();
-        visitForInBody(cnode);
-
-        emitter.write(")");
-        if (!isImplicit(xnode))
-            emitter.write(" ");
-
-        walk(node.getStatementContentsNode());
+        emitter.emitForEachLoop(node);
     }
 
     protected void visitFor(IForLoopNode node)
     {
         debug("visitFor()");
-        IContainerNode xnode = (IContainerNode) node.getChild(1);
-
-        emitter.write("for");
-        emitter.write(" ");
-        emitter.write("(");
-
-        IContainerNode cnode = node.getConditionalsContainerNode();
-        final IASNode node0 = cnode.getChild(0);
-        if (node0.getNodeID() == ASTNodeID.Op_InID)
-        {
-            visitForInBody(cnode);
-        }
-        else
-        {
-            visitForBody(cnode);
-        }
-
-        emitter.write(")");
-        if (!isImplicit(xnode))
-            emitter.write(" ");
-
-        walk(node.getStatementContentsNode());
-    }
-
-    protected void visitForInBody(IContainerNode node)
-    {
-        walk(node.getChild(0));
-    }
-
-    protected void visitForBody(IContainerNode node)
-    {
-        final IASNode node0 = node.getChild(0);
-        final IASNode node1 = node.getChild(1);
-        final IASNode node2 = node.getChild(2);
-
-        // initializer
-        if (node0 != null)
-        {
-            walk(node0);
-            emitter.write(";");
-            if (node1.getNodeID() != ASTNodeID.NilID)
-                emitter.write(" ");
-        }
-        // condition or target
-        if (node1 != null)
-        {
-            walk(node1);
-            emitter.write(";");
-            if (node2.getNodeID() != ASTNodeID.NilID)
-                emitter.write(" ");
-        }
-        // iterator
-        if (node2 != null)
-        {
-            walk(node2);
-        }
+        emitter.emitForLoop(node);
     }
 
     @Override

Modified: flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASEmitter.java
URL: http://svn.apache.org/viewvc/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASEmitter.java?rev=1434094&r1=1434093&r2=1434094&view=diff
==============================================================================
--- flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASEmitter.java (original)
+++ flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASEmitter.java Wed Jan 16 18:30:48 2013
@@ -41,8 +41,10 @@ import org.apache.flex.compiler.tree.as.
 import org.apache.flex.compiler.tree.as.IAccessorNode;
 import org.apache.flex.compiler.tree.as.IBinaryOperatorNode;
 import org.apache.flex.compiler.tree.as.IClassNode;
+import org.apache.flex.compiler.tree.as.IContainerNode;
 import org.apache.flex.compiler.tree.as.IDefinitionNode;
 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;
@@ -56,6 +58,7 @@ import org.apache.flex.compiler.tree.as.
 import org.apache.flex.compiler.tree.as.IStatementNode;
 import org.apache.flex.compiler.tree.as.ITypeNode;
 import org.apache.flex.compiler.tree.as.IVariableNode;
+import org.apache.flex.compiler.tree.as.IContainerNode.ContainerType;
 import org.apache.flex.compiler.visitor.IASBlockWalker;
 
 /**
@@ -712,6 +715,10 @@ public class ASEmitter implements IASEmi
         emitMethodScope(node);
     }
 
+    //--------------------------------------------------------------------------
+    // Statements
+    //--------------------------------------------------------------------------
+
     @Override
     public void emitStatement(IASNode node)
     {
@@ -727,8 +734,55 @@ public class ASEmitter implements IASEmi
             write("\n");
     }
 
+    @Override
+    public void emitForEachLoop(IForLoopNode node)
+    {
+        IContainerNode xnode = (IContainerNode) node.getChild(1);
+        write("for");
+        write(" ");
+        write("each");
+        write(" ");
+        write("(");
+
+        IContainerNode cnode = node.getConditionalsContainerNode();
+        getWalker().walk(cnode.getChild(0));
+
+        write(")");
+        if (!isImplicit(xnode))
+            write(" ");
+
+        getWalker().walk(node.getStatementContentsNode());
+    }
+
+    @Override
+    public void emitForLoop(IForLoopNode node)
+    {
+        IContainerNode xnode = (IContainerNode) node.getChild(1);
+
+        write("for");
+        write(" ");
+        write("(");
+
+        IContainerNode cnode = node.getConditionalsContainerNode();
+        final IASNode node0 = cnode.getChild(0);
+        if (node0.getNodeID() == ASTNodeID.Op_InID)
+        {
+            getWalker().walk(cnode.getChild(0));
+        }
+        else
+        {
+            visitForBody(cnode);
+        }
+
+        write(")");
+        if (!isImplicit(xnode))
+            write(" ");
+
+        getWalker().walk(node.getStatementContentsNode());
+    }
+
     //--------------------------------------------------------------------------
-    // 
+    // Expressions
     //--------------------------------------------------------------------------
 
     @Override
@@ -825,4 +879,39 @@ public class ASEmitter implements IASEmi
         }
         return -1;
     }
+
+    private static final boolean isImplicit(IContainerNode node)
+    {
+        return node.getContainerType() == ContainerType.IMPLICIT
+                || node.getContainerType() == ContainerType.SYNTHESIZED;
+    }
+
+    protected void visitForBody(IContainerNode node)
+    {
+        final IASNode node0 = node.getChild(0);
+        final IASNode node1 = node.getChild(1);
+        final IASNode node2 = node.getChild(2);
+
+        // initializer
+        if (node0 != null)
+        {
+            getWalker().walk(node0);
+            write(";");
+            if (node1.getNodeID() != ASTNodeID.NilID)
+                write(" ");
+        }
+        // condition or target
+        if (node1 != null)
+        {
+            getWalker().walk(node1);
+            write(";");
+            if (node2.getNodeID() != ASTNodeID.NilID)
+                write(" ");
+        }
+        // iterator
+        if (node2 != null)
+        {
+            getWalker().walk(node2);
+        }
+    }
 }