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 2015/05/31 18:01:16 UTC

[1/2] git commit: [flex-falcon] [refs/heads/develop] - Removed commented out methods from JSFlexJSEmitter.java and placed them in Notes text file (not sure if the might still be used).

Repository: flex-falcon
Updated Branches:
  refs/heads/develop dbad22c99 -> ec0a79236


Removed commented out methods from JSFlexJSEmitter.java and placed them in Notes text file
(not sure if the might still be used).


Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/f51e2348
Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/f51e2348
Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/f51e2348

Branch: refs/heads/develop
Commit: f51e23484ec78cca4935d0f5cab53ae309fa7abc
Parents: dbad22c
Author: Michael Schmalle <ms...@apache.org>
Authored: Sun May 31 11:39:50 2015 -0400
Committer: Michael Schmalle <ms...@apache.org>
Committed: Sun May 31 11:39:50 2015 -0400

----------------------------------------------------------------------
 .../codegen/js/flexjs/JSFlexJSEmitter.java      | 349 +-----------------
 .../codegen/js/flexjs/Notes_JSFlexJSEmitter.txt | 367 +++++++++++++++++++
 2 files changed, 368 insertions(+), 348 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/f51e2348/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
index 7aa4e2a..5562e31 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
@@ -342,7 +342,7 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
     @Override
     public void emitGetAccessor(IGetterNode node)
     {
-       classEmitter.getGetSetEmitter().emitGet(node);
+        classEmitter.getGetSetEmitter().emitGet(node);
     }
 
     @Override
@@ -545,92 +545,6 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
 
     }
 
-    /*
-    @Override
-    public void emitForEachLoop(IForLoopNode node)
-    {
-        IContainerNode xnode = (IContainerNode) node.getChild(1);
-        IBinaryOperatorNode bnode = (IBinaryOperatorNode) node
-                .getConditionalsContainerNode().getChild(0);
-        IASNode childNode = bnode.getChild(0);
-
-        write(ASEmitterTokens.TRY);
-        write(ASEmitterTokens.BLOCK_OPEN);
-        writeNewline();
-        
-        write(JSGoogEmitterTokens.GOOG_ARRAY_FOREACH);
-        write(ASEmitterTokens.PAREN_OPEN);
-        getWalker().walk(bnode.getChild(1));
-        writeToken(ASEmitterTokens.COMMA);
-        writeToken(ASEmitterTokens.FUNCTION);
-        write(ASEmitterTokens.PAREN_OPEN);
-        if (childNode instanceof IVariableExpressionNode)
-        	write(((IVariableNode) childNode.getChild(0)).getName());
-        else
-        	write(((IIdentifierNode) childNode).getName());
-        writeToken(ASEmitterTokens.PAREN_CLOSE);
-        if (isImplicit(xnode))
-            write(ASEmitterTokens.BLOCK_OPEN);
-        getWalker().walk(node.getStatementContentsNode());
-        if (isImplicit(xnode))
-        {
-            writeNewline();
-            write(ASEmitterTokens.BLOCK_CLOSE);
-        }
-        write(ASEmitterTokens.PAREN_CLOSE);
-        writeNewline();
-        write(ASEmitterTokens.BLOCK_CLOSE);
-        writeNewline();
-        write(ASEmitterTokens.CATCH);
-        write(ASEmitterTokens.PAREN_OPEN);
-        write("foreachbreakerror");
-        write(ASEmitterTokens.PAREN_CLOSE);
-        write(ASEmitterTokens.SPACE);
-        write(ASEmitterTokens.BLOCK_OPEN);
-        write(ASEmitterTokens.BLOCK_CLOSE);
-        writeNewline();
-        
-    }
-
-    @Override
-    public void emitIterationFlow(IIterationFlowNode node)
-    {
-    	// look for break in foreach and throw error instead
-    	if (node.getKind() == IIterationFlowNode.IterationFlowKind.BREAK)
-    	{
-    		IASNode pNode = node.getParent();
-    		while (pNode != null)
-    		{
-    			ASTNodeID id = pNode.getNodeID();
-    			if (id == ASTNodeID.ForEachLoopID)
-    			{
-    				write(ASEmitterTokens.THROW);
-    				write(ASEmitterTokens.SPACE);
-    				write(ASEmitterTokens.NEW);
-    				write(ASEmitterTokens.SPACE);
-    				write(JSGoogEmitterTokens.ERROR);
-    				write(ASEmitterTokens.PAREN_OPEN);
-    				write(ASEmitterTokens.PAREN_CLOSE);
-    				write(ASEmitterTokens.SEMICOLON);
-    				return;
-    			}
-    			else if (id == ASTNodeID.ForLoopID ||
-    					id == ASTNodeID.DoWhileLoopID ||
-    					id == ASTNodeID.WhileLoopID)
-    				break;
-    			pNode = pNode.getParent();
-    		}
-    	}
-        write(node.getKind().toString().toLowerCase());
-        IIdentifierNode lnode = node.getLabelNode();
-        if (lnode != null)
-        {
-            write(ASEmitterTokens.SPACE);
-            getWalker().walk(lnode);
-        }
-    }
-    */
-
     @Override
     public void emitTypedExpression(ITypedExpressionNode node)
     {
@@ -685,7 +599,6 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
         write(ASEmitterTokens.SINGLE_QUOTE);
     }
 
-
     @Override
     public String formatQualifiedName(String name)
     {
@@ -694,264 +607,4 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
         name = name.replaceAll("\\.", "_");
         return name;
     }
-
-}
-
-/*
-@Override
-public void emitInterface(IInterfaceNode node)
-{
-    ICompilerProject project = getWalker().getProject();
-
-    getDoc().emitInterfaceDoc(node, project);
-
-    String qname = node.getQualifiedName();
-    if (qname != null && !qname.equals(""))
-    {
-        write(formatQualifiedName(qname));
-        write(ASEmitterTokens.SPACE);
-        writeToken(ASEmitterTokens.EQUAL);
-        write(ASEmitterTokens.FUNCTION);
-        write(ASEmitterTokens.PAREN_OPEN);
-        write(ASEmitterTokens.PAREN_CLOSE);
-        write(ASEmitterTokens.SPACE);
-        write(ASEmitterTokens.BLOCK_OPEN);
-        writeNewline();
-        write(ASEmitterTokens.BLOCK_CLOSE);
-        write(ASEmitterTokens.SEMICOLON);
-    }
-
-    
-    final IDefinitionNode[] members = node.getAllMemberDefinitionNodes();
-    for (IDefinitionNode mnode : members)
-    {
-        boolean isAccessor = mnode.getNodeID() == ASTNodeID.GetterID
-                || mnode.getNodeID() == ASTNodeID.SetterID;
-
-        writeNewline();
-        writeNewline();
-        writeNewline();
-
-        getDoc().emitInterfaceMemberDoc((IFunctionNode) mnode, project);
-        
-        write(formatQualifiedName(qname));
-        write(ASEmitterTokens.MEMBER_ACCESS);
-        write(JSEmitterTokens.PROTOTYPE);
-        write(ASEmitterTokens.MEMBER_ACCESS);
-        if (isAccessor)
-        {
-            writeGetSetPrefix(mnode.getNodeID() == ASTNodeID.GetterID);
-        }
-        write(mnode.getQualifiedName());
-        write(ASEmitterTokens.SPACE);
-        writeToken(ASEmitterTokens.EQUAL);
-        write(ASEmitterTokens.FUNCTION);
-        emitParameters(((IFunctionNode) mnode).getParameterNodes());
-        write(ASEmitterTokens.SPACE);
-        write(ASEmitterTokens.BLOCK_OPEN);
-        write(ASEmitterTokens.BLOCK_CLOSE);
-        write(ASEmitterTokens.SEMICOLON);
-    }
-}
-*/
-
-/*
-@Override
-public void emitMethod(IFunctionNode node)
-{
-    FunctionNode fn = (FunctionNode) node;
-    fn.parseFunctionBody(getProblems());
-
-    ICompilerProject project = getWalker().getProject();
-
-    getDoc().emitMethodDoc(node, project);
-
-    boolean isConstructor = node.isConstructor();
-
-    String qname = getTypeDefinition(node).getQualifiedName();
-    if (qname != null && !qname.equals(""))
-    {
-        write(formatQualifiedName(qname));
-        if (!isConstructor)
-        {
-            write(ASEmitterTokens.MEMBER_ACCESS);
-            if (!fn.hasModifier(ASModifier.STATIC))
-            {
-                write(JSEmitterTokens.PROTOTYPE);
-                write(ASEmitterTokens.MEMBER_ACCESS);
-            }
-        }
-    }
-
-    if (!isConstructor)
-        emitMemberName(node);
-
-    write(ASEmitterTokens.SPACE);
-    writeToken(ASEmitterTokens.EQUAL);
-    write(ASEmitterTokens.FUNCTION);
-
-    emitParameters(node.getParameterNodes());
-
-    boolean hasSuperClass = hasSuperClass(node);
-
-    if (isConstructor && node.getScopedNode().getChildCount() == 0)
-    {
-        write(ASEmitterTokens.SPACE);
-        write(ASEmitterTokens.BLOCK_OPEN);
-        if (hasSuperClass)
-            emitSuperCall(node, CONSTRUCTOR_EMPTY);
-        writeNewline();
-        write(ASEmitterTokens.BLOCK_CLOSE);
-    }
-
-    if (!isConstructor || node.getScopedNode().getChildCount() > 0)
-        emitMethodScope(node.getScopedNode());
-
-    if (isConstructor && hasSuperClass)
-    {
-        writeNewline(ASEmitterTokens.SEMICOLON);
-        write(JSGoogEmitterTokens.GOOG_INHERITS);
-        write(ASEmitterTokens.PAREN_OPEN);
-        write(formatQualifiedName(qname));
-        writeToken(ASEmitterTokens.COMMA);
-        String sname = getSuperClassDefinition(node, project)
-                .getQualifiedName();
-        write(formatQualifiedName(sname));
-        write(ASEmitterTokens.PAREN_CLOSE);
-    }
-}
-*/
-
-/*
-@Override
-protected void emitDefaultParameterCodeBlock(IFunctionNode node)
-{
-    IParameterNode[] pnodes = node.getParameterNodes();
-    if (pnodes.length == 0)
-        return;
-
-    Map<Integer, IParameterNode> defaults = getDefaults(pnodes);
-
-    if (defaults != null)
-    {
-        final StringBuilder code = new StringBuilder();
-
-        if (!hasBody(node))
-        {
-            indentPush();
-            write(JSFlexJSEmitterTokens.INDENT);
-        }
-
-        List<IParameterNode> parameters = new ArrayList<IParameterNode>(
-                defaults.values());
-
-        for (int i = 0, n = parameters.size(); i < n; i++)
-        {
-            IParameterNode pnode = parameters.get(i);
-
-            if (pnode != null)
-            {
-                code.setLength(0);
-
-                // x = typeof y !== 'undefined' ? y : z;\n 
-                code.append(pnode.getName());
-                code.append(ASEmitterTokens.SPACE.getToken());
-                code.append(ASEmitterTokens.EQUAL.getToken());
-                code.append(ASEmitterTokens.SPACE.getToken());
-                code.append(ASEmitterTokens.TYPEOF.getToken());
-                code.append(ASEmitterTokens.SPACE.getToken());
-                code.append(pnode.getName());
-                code.append(ASEmitterTokens.SPACE.getToken());
-                code.append(ASEmitterTokens.STRICT_NOT_EQUAL.getToken());
-                code.append(ASEmitterTokens.SPACE.getToken());
-                code.append(ASEmitterTokens.SINGLE_QUOTE.getToken());
-                code.append(ASEmitterTokens.UNDEFINED.getToken());
-                code.append(ASEmitterTokens.SINGLE_QUOTE.getToken());
-                code.append(ASEmitterTokens.SPACE.getToken());
-                code.append(ASEmitterTokens.TERNARY.getToken());
-                code.append(ASEmitterTokens.SPACE.getToken());
-                code.append(pnode.getName());
-                code.append(ASEmitterTokens.SPACE.getToken());
-                code.append(ASEmitterTokens.COLON.getToken());
-                code.append(ASEmitterTokens.SPACE.getToken());
-                code.append(pnode.getDefaultValue());
-                code.append(ASEmitterTokens.SEMICOLON.getToken());
-
-                write(code.toString());
-
-                if (i == n - 1 && !hasBody(node))
-                    indentPop();
-
-                writeNewline();
-            }
-        }
-    }
-}
-*/
-
-/*
-private void writeGetSetPrefix(boolean isGet)
-{
-    if (isGet)
-        write(ASEmitterTokens.GET);
-    else
-        write(ASEmitterTokens.SET);
-    write("_");
-}
-*/
-
-/*
-@Override
-public void emitUnaryOperator(IUnaryOperatorNode node)
-{
-    if (node.getNodeID() == ASTNodeID.Op_PreIncrID
-            || node.getNodeID() == ASTNodeID.Op_PreDecrID
-            || node.getNodeID() == ASTNodeID.Op_PostIncrID
-            || node.getNodeID() == ASTNodeID.Op_PostDecrID)
-    {
-        IExpressionNode opNode = node.getOperandNode();
-        String getString = stringifyNode(opNode);
-        int index = getString.lastIndexOf("get_");
-        if (index != -1)
-        {
-            write(JSFlexJSEmitterTokens.LANGUAGE_QNAME);
-            write(ASEmitterTokens.MEMBER_ACCESS);
-            if (node.getNodeID() == ASTNodeID.Op_PreIncrID)
-                write(JSFlexJSEmitterTokens.PREINCREMENT);
-            else if (node.getNodeID() == ASTNodeID.Op_PostIncrID)
-                write(JSFlexJSEmitterTokens.POSTINCREMENT);
-            else if (node.getNodeID() == ASTNodeID.Op_PreDecrID)
-                write(JSFlexJSEmitterTokens.PREDECREMENT);
-            else
-                write(JSFlexJSEmitterTokens.POSTDECREMENT);
-            write(ASEmitterTokens.PAREN_OPEN);
-            String obj = getString.substring(0, index - 1);
-            write(obj);
-            write(ASEmitterTokens.COMMA);
-            String prop = getString.substring(index + 4);               
-            int endIndex = prop.indexOf(ASEmitterTokens.PAREN_OPEN.getToken());
-            prop = prop.substring(0, endIndex);
-            write(ASEmitterTokens.DOUBLE_QUOTE);
-            write(prop);
-            write(ASEmitterTokens.DOUBLE_QUOTE);
-            write(ASEmitterTokens.PAREN_CLOSE);
-            return;
-        }
-        else
-        {
-            IASNode parentNode = node.getParent();
-            if (parentNode.getNodeID() == ASTNodeID.MemberAccessExpressionID &&
-                    ((MemberAccessExpressionNode)parentNode).getLeftOperandNode() == node)
-            {
-                // GCC wanted parens around foo++.toString().  As in (foo++).toString();
-                write(ASEmitterTokens.PAREN_OPEN);
-                super.emitUnaryOperator(node);
-                write(ASEmitterTokens.PAREN_CLOSE);
-                return;
-            }
-        }
-
-    }
-    super.emitUnaryOperator(node);
 }
-*/
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/f51e2348/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/Notes_JSFlexJSEmitter.txt
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/Notes_JSFlexJSEmitter.txt b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/Notes_JSFlexJSEmitter.txt
new file mode 100644
index 0000000..97e2ffa
--- /dev/null
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/Notes_JSFlexJSEmitter.txt
@@ -0,0 +1,367 @@
+/*
+ *
+ *  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.
+ *
+ */
+
+//-------------------------------------
+// Removed from JSFlexJSEmitter.java 05-31-2015
+//-------------------------------------
+
+/*
+    @Override
+    public void emitForEachLoop(IForLoopNode node)
+    {
+        IContainerNode xnode = (IContainerNode) node.getChild(1);
+        IBinaryOperatorNode bnode = (IBinaryOperatorNode) node
+                .getConditionalsContainerNode().getChild(0);
+        IASNode childNode = bnode.getChild(0);
+
+        write(ASEmitterTokens.TRY);
+        write(ASEmitterTokens.BLOCK_OPEN);
+        writeNewline();
+        
+        write(JSGoogEmitterTokens.GOOG_ARRAY_FOREACH);
+        write(ASEmitterTokens.PAREN_OPEN);
+        getWalker().walk(bnode.getChild(1));
+        writeToken(ASEmitterTokens.COMMA);
+        writeToken(ASEmitterTokens.FUNCTION);
+        write(ASEmitterTokens.PAREN_OPEN);
+        if (childNode instanceof IVariableExpressionNode)
+        	write(((IVariableNode) childNode.getChild(0)).getName());
+        else
+        	write(((IIdentifierNode) childNode).getName());
+        writeToken(ASEmitterTokens.PAREN_CLOSE);
+        if (isImplicit(xnode))
+            write(ASEmitterTokens.BLOCK_OPEN);
+        getWalker().walk(node.getStatementContentsNode());
+        if (isImplicit(xnode))
+        {
+            writeNewline();
+            write(ASEmitterTokens.BLOCK_CLOSE);
+        }
+        write(ASEmitterTokens.PAREN_CLOSE);
+        writeNewline();
+        write(ASEmitterTokens.BLOCK_CLOSE);
+        writeNewline();
+        write(ASEmitterTokens.CATCH);
+        write(ASEmitterTokens.PAREN_OPEN);
+        write("foreachbreakerror");
+        write(ASEmitterTokens.PAREN_CLOSE);
+        write(ASEmitterTokens.SPACE);
+        write(ASEmitterTokens.BLOCK_OPEN);
+        write(ASEmitterTokens.BLOCK_CLOSE);
+        writeNewline();
+        
+    }
+
+    @Override
+    public void emitIterationFlow(IIterationFlowNode node)
+    {
+    	// look for break in foreach and throw error instead
+    	if (node.getKind() == IIterationFlowNode.IterationFlowKind.BREAK)
+    	{
+    		IASNode pNode = node.getParent();
+    		while (pNode != null)
+    		{
+    			ASTNodeID id = pNode.getNodeID();
+    			if (id == ASTNodeID.ForEachLoopID)
+    			{
+    				write(ASEmitterTokens.THROW);
+    				write(ASEmitterTokens.SPACE);
+    				write(ASEmitterTokens.NEW);
+    				write(ASEmitterTokens.SPACE);
+    				write(JSGoogEmitterTokens.ERROR);
+    				write(ASEmitterTokens.PAREN_OPEN);
+    				write(ASEmitterTokens.PAREN_CLOSE);
+    				write(ASEmitterTokens.SEMICOLON);
+    				return;
+    			}
+    			else if (id == ASTNodeID.ForLoopID ||
+    					id == ASTNodeID.DoWhileLoopID ||
+    					id == ASTNodeID.WhileLoopID)
+    				break;
+    			pNode = pNode.getParent();
+    		}
+    	}
+        write(node.getKind().toString().toLowerCase());
+        IIdentifierNode lnode = node.getLabelNode();
+        if (lnode != null)
+        {
+            write(ASEmitterTokens.SPACE);
+            getWalker().walk(lnode);
+        }
+    }
+*/
+
+/*
+@Override
+public void emitInterface(IInterfaceNode node)
+{
+    ICompilerProject project = getWalker().getProject();
+
+    getDoc().emitInterfaceDoc(node, project);
+
+    String qname = node.getQualifiedName();
+    if (qname != null && !qname.equals(""))
+    {
+        write(formatQualifiedName(qname));
+        write(ASEmitterTokens.SPACE);
+        writeToken(ASEmitterTokens.EQUAL);
+        write(ASEmitterTokens.FUNCTION);
+        write(ASEmitterTokens.PAREN_OPEN);
+        write(ASEmitterTokens.PAREN_CLOSE);
+        write(ASEmitterTokens.SPACE);
+        write(ASEmitterTokens.BLOCK_OPEN);
+        writeNewline();
+        write(ASEmitterTokens.BLOCK_CLOSE);
+        write(ASEmitterTokens.SEMICOLON);
+    }
+
+    
+    final IDefinitionNode[] members = node.getAllMemberDefinitionNodes();
+    for (IDefinitionNode mnode : members)
+    {
+        boolean isAccessor = mnode.getNodeID() == ASTNodeID.GetterID
+                || mnode.getNodeID() == ASTNodeID.SetterID;
+
+        writeNewline();
+        writeNewline();
+        writeNewline();
+
+        getDoc().emitInterfaceMemberDoc((IFunctionNode) mnode, project);
+        
+        write(formatQualifiedName(qname));
+        write(ASEmitterTokens.MEMBER_ACCESS);
+        write(JSEmitterTokens.PROTOTYPE);
+        write(ASEmitterTokens.MEMBER_ACCESS);
+        if (isAccessor)
+        {
+            writeGetSetPrefix(mnode.getNodeID() == ASTNodeID.GetterID);
+        }
+        write(mnode.getQualifiedName());
+        write(ASEmitterTokens.SPACE);
+        writeToken(ASEmitterTokens.EQUAL);
+        write(ASEmitterTokens.FUNCTION);
+        emitParameters(((IFunctionNode) mnode).getParameterNodes());
+        write(ASEmitterTokens.SPACE);
+        write(ASEmitterTokens.BLOCK_OPEN);
+        write(ASEmitterTokens.BLOCK_CLOSE);
+        write(ASEmitterTokens.SEMICOLON);
+    }
+}
+*/
+
+/*
+@Override
+public void emitMethod(IFunctionNode node)
+{
+    FunctionNode fn = (FunctionNode) node;
+    fn.parseFunctionBody(getProblems());
+
+    ICompilerProject project = getWalker().getProject();
+
+    getDoc().emitMethodDoc(node, project);
+
+    boolean isConstructor = node.isConstructor();
+
+    String qname = getTypeDefinition(node).getQualifiedName();
+    if (qname != null && !qname.equals(""))
+    {
+        write(formatQualifiedName(qname));
+        if (!isConstructor)
+        {
+            write(ASEmitterTokens.MEMBER_ACCESS);
+            if (!fn.hasModifier(ASModifier.STATIC))
+            {
+                write(JSEmitterTokens.PROTOTYPE);
+                write(ASEmitterTokens.MEMBER_ACCESS);
+            }
+        }
+    }
+
+    if (!isConstructor)
+        emitMemberName(node);
+
+    write(ASEmitterTokens.SPACE);
+    writeToken(ASEmitterTokens.EQUAL);
+    write(ASEmitterTokens.FUNCTION);
+
+    emitParameters(node.getParameterNodes());
+
+    boolean hasSuperClass = hasSuperClass(node);
+
+    if (isConstructor && node.getScopedNode().getChildCount() == 0)
+    {
+        write(ASEmitterTokens.SPACE);
+        write(ASEmitterTokens.BLOCK_OPEN);
+        if (hasSuperClass)
+            emitSuperCall(node, CONSTRUCTOR_EMPTY);
+        writeNewline();
+        write(ASEmitterTokens.BLOCK_CLOSE);
+    }
+
+    if (!isConstructor || node.getScopedNode().getChildCount() > 0)
+        emitMethodScope(node.getScopedNode());
+
+    if (isConstructor && hasSuperClass)
+    {
+        writeNewline(ASEmitterTokens.SEMICOLON);
+        write(JSGoogEmitterTokens.GOOG_INHERITS);
+        write(ASEmitterTokens.PAREN_OPEN);
+        write(formatQualifiedName(qname));
+        writeToken(ASEmitterTokens.COMMA);
+        String sname = getSuperClassDefinition(node, project)
+                .getQualifiedName();
+        write(formatQualifiedName(sname));
+        write(ASEmitterTokens.PAREN_CLOSE);
+    }
+}
+*/
+
+/*
+@Override
+protected void emitDefaultParameterCodeBlock(IFunctionNode node)
+{
+    IParameterNode[] pnodes = node.getParameterNodes();
+    if (pnodes.length == 0)
+        return;
+
+    Map<Integer, IParameterNode> defaults = getDefaults(pnodes);
+
+    if (defaults != null)
+    {
+        final StringBuilder code = new StringBuilder();
+
+        if (!hasBody(node))
+        {
+            indentPush();
+            write(JSFlexJSEmitterTokens.INDENT);
+        }
+
+        List<IParameterNode> parameters = new ArrayList<IParameterNode>(
+                defaults.values());
+
+        for (int i = 0, n = parameters.size(); i < n; i++)
+        {
+            IParameterNode pnode = parameters.get(i);
+
+            if (pnode != null)
+            {
+                code.setLength(0);
+
+                // x = typeof y !== 'undefined' ? y : z;\n 
+                code.append(pnode.getName());
+                code.append(ASEmitterTokens.SPACE.getToken());
+                code.append(ASEmitterTokens.EQUAL.getToken());
+                code.append(ASEmitterTokens.SPACE.getToken());
+                code.append(ASEmitterTokens.TYPEOF.getToken());
+                code.append(ASEmitterTokens.SPACE.getToken());
+                code.append(pnode.getName());
+                code.append(ASEmitterTokens.SPACE.getToken());
+                code.append(ASEmitterTokens.STRICT_NOT_EQUAL.getToken());
+                code.append(ASEmitterTokens.SPACE.getToken());
+                code.append(ASEmitterTokens.SINGLE_QUOTE.getToken());
+                code.append(ASEmitterTokens.UNDEFINED.getToken());
+                code.append(ASEmitterTokens.SINGLE_QUOTE.getToken());
+                code.append(ASEmitterTokens.SPACE.getToken());
+                code.append(ASEmitterTokens.TERNARY.getToken());
+                code.append(ASEmitterTokens.SPACE.getToken());
+                code.append(pnode.getName());
+                code.append(ASEmitterTokens.SPACE.getToken());
+                code.append(ASEmitterTokens.COLON.getToken());
+                code.append(ASEmitterTokens.SPACE.getToken());
+                code.append(pnode.getDefaultValue());
+                code.append(ASEmitterTokens.SEMICOLON.getToken());
+
+                write(code.toString());
+
+                if (i == n - 1 && !hasBody(node))
+                    indentPop();
+
+                writeNewline();
+            }
+        }
+    }
+}
+*/
+
+/*
+private void writeGetSetPrefix(boolean isGet)
+{
+    if (isGet)
+        write(ASEmitterTokens.GET);
+    else
+        write(ASEmitterTokens.SET);
+    write("_");
+}
+*/
+
+/*
+@Override
+public void emitUnaryOperator(IUnaryOperatorNode node)
+{
+    if (node.getNodeID() == ASTNodeID.Op_PreIncrID
+            || node.getNodeID() == ASTNodeID.Op_PreDecrID
+            || node.getNodeID() == ASTNodeID.Op_PostIncrID
+            || node.getNodeID() == ASTNodeID.Op_PostDecrID)
+    {
+        IExpressionNode opNode = node.getOperandNode();
+        String getString = stringifyNode(opNode);
+        int index = getString.lastIndexOf("get_");
+        if (index != -1)
+        {
+            write(JSFlexJSEmitterTokens.LANGUAGE_QNAME);
+            write(ASEmitterTokens.MEMBER_ACCESS);
+            if (node.getNodeID() == ASTNodeID.Op_PreIncrID)
+                write(JSFlexJSEmitterTokens.PREINCREMENT);
+            else if (node.getNodeID() == ASTNodeID.Op_PostIncrID)
+                write(JSFlexJSEmitterTokens.POSTINCREMENT);
+            else if (node.getNodeID() == ASTNodeID.Op_PreDecrID)
+                write(JSFlexJSEmitterTokens.PREDECREMENT);
+            else
+                write(JSFlexJSEmitterTokens.POSTDECREMENT);
+            write(ASEmitterTokens.PAREN_OPEN);
+            String obj = getString.substring(0, index - 1);
+            write(obj);
+            write(ASEmitterTokens.COMMA);
+            String prop = getString.substring(index + 4);               
+            int endIndex = prop.indexOf(ASEmitterTokens.PAREN_OPEN.getToken());
+            prop = prop.substring(0, endIndex);
+            write(ASEmitterTokens.DOUBLE_QUOTE);
+            write(prop);
+            write(ASEmitterTokens.DOUBLE_QUOTE);
+            write(ASEmitterTokens.PAREN_CLOSE);
+            return;
+        }
+        else
+        {
+            IASNode parentNode = node.getParent();
+            if (parentNode.getNodeID() == ASTNodeID.MemberAccessExpressionID &&
+                    ((MemberAccessExpressionNode)parentNode).getLeftOperandNode() == node)
+            {
+                // GCC wanted parens around foo++.toString().  As in (foo++).toString();
+                write(ASEmitterTokens.PAREN_OPEN);
+                super.emitUnaryOperator(node);
+                write(ASEmitterTokens.PAREN_CLOSE);
+                return;
+            }
+        }
+
+    }
+    super.emitUnaryOperator(node);
+}
+*/
\ No newline at end of file


[2/2] git commit: [flex-falcon] [refs/heads/develop] - - Moved emitBindableVarDefineProperty() to Bindable emitter. - Refactored foreach into emitter.

Posted by ms...@apache.org.
- Moved emitBindableVarDefineProperty() to Bindable emitter.
- Refactored foreach into emitter.


Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/ec0a7923
Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/ec0a7923
Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/ec0a7923

Branch: refs/heads/develop
Commit: ec0a792366d61ef6be6967745e96c13b662cd421
Parents: f51e234
Author: Michael Schmalle <ms...@apache.org>
Authored: Sun May 31 12:00:44 2015 -0400
Committer: Michael Schmalle <ms...@apache.org>
Committed: Sun May 31 12:00:44 2015 -0400

----------------------------------------------------------------------
 .../internal/codegen/js/JSSessionModel.java     |  12 +++
 .../codegen/js/flexjs/JSFlexJSEmitter.java      | 105 +------------------
 .../internal/codegen/js/jx/BindableEmitter.java |  58 +++++++++-
 .../internal/codegen/js/jx/ForEachEmitter.java  |  88 ++++++++++++++++
 4 files changed, 162 insertions(+), 101 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/ec0a7923/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSSessionModel.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSSessionModel.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSSessionModel.java
index ba8df11..48079fa 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSSessionModel.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSSessionModel.java
@@ -50,6 +50,8 @@ public class JSSessionModel
 
     private ArrayList<String> bindableVars = new ArrayList<String>();
 
+    private int foreachLoopCount = 0;
+
     public IClassDefinition getCurrentClass()
     {
         return currentClass;
@@ -80,4 +82,14 @@ public class JSSessionModel
         return bindableVars;
     }
 
+    public final void incForeachLoopCount()
+    {
+        foreachLoopCount++;
+    }
+
+    public String getCurrentForeachName()
+    {
+        return "foreachiter" + Integer.toString(foreachLoopCount);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/ec0a7923/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
index 5562e31..f86ca5a 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
@@ -26,7 +26,6 @@ import org.apache.flex.compiler.codegen.IDocEmitter;
 import org.apache.flex.compiler.codegen.js.flexjs.IJSFlexJSEmitter;
 import org.apache.flex.compiler.common.ASModifier;
 import org.apache.flex.compiler.common.IMetaInfo;
-import org.apache.flex.compiler.definitions.IClassDefinition;
 import org.apache.flex.compiler.definitions.IDefinition;
 import org.apache.flex.compiler.definitions.IFunctionDefinition;
 import org.apache.flex.compiler.definitions.IPackageDefinition;
@@ -38,6 +37,7 @@ import org.apache.flex.compiler.internal.codegen.js.goog.JSGoogEmitterTokens;
 import org.apache.flex.compiler.internal.codegen.js.jx.BinaryOperatorEmitter;
 import org.apache.flex.compiler.internal.codegen.js.jx.ClassEmitter;
 import org.apache.flex.compiler.internal.codegen.js.jx.FieldEmitter;
+import org.apache.flex.compiler.internal.codegen.js.jx.ForEachEmitter;
 import org.apache.flex.compiler.internal.codegen.js.jx.FunctionCallEmitter;
 import org.apache.flex.compiler.internal.codegen.js.jx.IdentifierEmitter;
 import org.apache.flex.compiler.internal.codegen.js.jx.MemberAccessEmitter;
@@ -65,11 +65,10 @@ import org.apache.flex.compiler.tree.as.IMemberAccessExpressionNode;
 import org.apache.flex.compiler.tree.as.IParameterNode;
 import org.apache.flex.compiler.tree.as.ISetterNode;
 import org.apache.flex.compiler.tree.as.ITypedExpressionNode;
-import org.apache.flex.compiler.tree.as.IVariableExpressionNode;
 import org.apache.flex.compiler.tree.as.IVariableNode;
 
 /**
- * Concrete implementation of the 'goog' JavaScript production.
+ * Concrete implementation of the 'FlexJS' JavaScript production.
  * 
  * @author Michael Schmalle
  * @author Erik de Bruin
@@ -77,8 +76,6 @@ import org.apache.flex.compiler.tree.as.IVariableNode;
 public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
 {
 
-    private int foreachLoopCounter = 0;
-
     private JSFlexJSDocEmitter docEmitter = null;
 
     private PackageHeaderEmitter packageHeaderEmitter;
@@ -88,6 +85,7 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
     private FieldEmitter fieldEmitter;
     private FunctionCallEmitter functionCallEmitter;
     private SuperCallEmitter superCallEmitter;
+    private ForEachEmitter forEachEmitter;
     private MemberAccessEmitter memberAccessEmitter;
     private BinaryOperatorEmitter binaryOperatorEmitter;
     private IdentifierEmitter identifierEmitter;
@@ -116,6 +114,7 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
         fieldEmitter = new FieldEmitter(this);
         functionCallEmitter = new FunctionCallEmitter(this);
         superCallEmitter = new SuperCallEmitter(this);
+        forEachEmitter = new ForEachEmitter(this);
         memberAccessEmitter = new MemberAccessEmitter(this);
         binaryOperatorEmitter = new BinaryOperatorEmitter(this);
         identifierEmitter = new IdentifierEmitter(this);
@@ -154,58 +153,6 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
         fieldEmitter.emit(node);
     }
 
-    public void emitBindableVarDefineProperty(String name, IClassDefinition cdef)
-    {
-        // 'PropName': {
-        writeNewline("/** @expose */");
-        writeNewline(name + ASEmitterTokens.COLON.getToken()
-                + ASEmitterTokens.SPACE.getToken()
-                + ASEmitterTokens.BLOCK_OPEN.getToken());
-        indentPush();
-        writeNewline("/** @this {"
-                + formatQualifiedName(cdef.getQualifiedName()) + "} */");
-        writeNewline(ASEmitterTokens.GET.getToken()
-                + ASEmitterTokens.COLON.getToken()
-                + ASEmitterTokens.SPACE.getToken()
-                + ASEmitterTokens.FUNCTION.getToken()
-                + ASEmitterTokens.PAREN_OPEN.getToken()
-                + ASEmitterTokens.PAREN_CLOSE.getToken()
-                + ASEmitterTokens.SPACE.getToken()
-                + ASEmitterTokens.BLOCK_OPEN.getToken());
-        writeNewline(ASEmitterTokens.RETURN.getToken()
-                + ASEmitterTokens.SPACE.getToken()
-                + ASEmitterTokens.THIS.getToken()
-                + ASEmitterTokens.MEMBER_ACCESS.getToken() + name + "_"
-                + ASEmitterTokens.SEMICOLON.getToken());
-        indentPop();
-        writeNewline(ASEmitterTokens.BLOCK_CLOSE.getToken()
-                + ASEmitterTokens.COMMA.getToken());
-        writeNewline();
-        writeNewline("/** @this {"
-                + formatQualifiedName(cdef.getQualifiedName()) + "} */");
-        writeNewline(ASEmitterTokens.SET.getToken()
-                + ASEmitterTokens.COLON.getToken()
-                + ASEmitterTokens.SPACE.getToken()
-                + ASEmitterTokens.FUNCTION.getToken()
-                + ASEmitterTokens.PAREN_OPEN.getToken() + "value"
-                + ASEmitterTokens.PAREN_CLOSE.getToken()
-                + ASEmitterTokens.SPACE.getToken()
-                + ASEmitterTokens.BLOCK_OPEN.getToken());
-        writeNewline("if (value != " + ASEmitterTokens.THIS.getToken()
-                + ASEmitterTokens.MEMBER_ACCESS.getToken() + name + "_) {");
-        writeNewline("    var oldValue = " + ASEmitterTokens.THIS.getToken()
-                + ASEmitterTokens.MEMBER_ACCESS.getToken() + name + "_"
-                + ASEmitterTokens.SEMICOLON.getToken());
-        writeNewline("    " + ASEmitterTokens.THIS.getToken()
-                + ASEmitterTokens.MEMBER_ACCESS.getToken() + name
-                + "_ = value;");
-        writeNewline("    this.dispatchEvent(org_apache_flex_events_ValueChangeEvent.createUpdateEvent(");
-        writeNewline("         this, \"" + name + "\", oldValue, value));");
-        writeNewline("}");
-        write(ASEmitterTokens.BLOCK_CLOSE.getToken());
-        write(ASEmitterTokens.BLOCK_CLOSE.getToken());
-    }
-
     @Override
     public void emitAccessors(IAccessorNode node)
     {
@@ -500,49 +447,7 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
     @Override
     public void emitForEachLoop(IForLoopNode node)
     {
-        IBinaryOperatorNode bnode = (IBinaryOperatorNode) node
-                .getConditionalsContainerNode().getChild(0);
-        IASNode childNode = bnode.getChild(0);
-
-        String iterName = "foreachiter"
-                + new Integer(foreachLoopCounter).toString();
-        foreachLoopCounter++;
-
-        write(ASEmitterTokens.FOR);
-        write(ASEmitterTokens.SPACE);
-        write(ASEmitterTokens.PAREN_OPEN);
-        write(ASEmitterTokens.VAR);
-        write(ASEmitterTokens.SPACE);
-        write(iterName);
-        write(ASEmitterTokens.SPACE);
-        write(ASEmitterTokens.IN);
-        write(ASEmitterTokens.SPACE);
-        getWalker().walk(bnode.getChild(1));
-        writeToken(ASEmitterTokens.PAREN_CLOSE);
-        writeNewline();
-        write(ASEmitterTokens.BLOCK_OPEN);
-        writeNewline();
-        if (childNode instanceof IVariableExpressionNode)
-        {
-            write(ASEmitterTokens.VAR);
-            write(ASEmitterTokens.SPACE);
-            write(((IVariableNode) childNode.getChild(0)).getName());
-        }
-        else
-            write(((IIdentifierNode) childNode).getName());
-        write(ASEmitterTokens.SPACE);
-        write(ASEmitterTokens.EQUAL);
-        write(ASEmitterTokens.SPACE);
-        getWalker().walk(bnode.getChild(1));
-        write(ASEmitterTokens.SQUARE_OPEN);
-        write(iterName);
-        write(ASEmitterTokens.SQUARE_CLOSE);
-        write(ASEmitterTokens.SEMICOLON);
-        writeNewline();
-        getWalker().walk(node.getStatementContentsNode());
-        write(ASEmitterTokens.BLOCK_CLOSE);
-        writeNewline();
-
+        forEachEmitter.emit(node);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/ec0a7923/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/BindableEmitter.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/BindableEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/BindableEmitter.java
index 310bf6b..0ec3fd2 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/BindableEmitter.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/BindableEmitter.java
@@ -66,11 +66,67 @@ public class BindableEmitter extends JSSubEmitter implements
                 else
                     write(ASEmitterTokens.COMMA);
 
-                fjs.emitBindableVarDefineProperty(varName, definition);
+                emitBindableVarDefineProperty(varName, definition);
             }
             writeNewline(ASEmitterTokens.BLOCK_CLOSE);
             write(ASEmitterTokens.PAREN_CLOSE);
             write(ASEmitterTokens.SEMICOLON);
         }
     }
+
+    private void emitBindableVarDefineProperty(String name,
+            IClassDefinition cdef)
+    {
+        // TODO (mschmalle) will remove this cast as more things get abstracted
+        JSFlexJSEmitter fjs = (JSFlexJSEmitter) getEmitter();
+
+        // 'PropName': {
+        writeNewline("/** @expose */");
+        writeNewline(name + ASEmitterTokens.COLON.getToken()
+                + ASEmitterTokens.SPACE.getToken()
+                + ASEmitterTokens.BLOCK_OPEN.getToken());
+        indentPush();
+        writeNewline("/** @this {"
+                + fjs.formatQualifiedName(cdef.getQualifiedName()) + "} */");
+        writeNewline(ASEmitterTokens.GET.getToken()
+                + ASEmitterTokens.COLON.getToken()
+                + ASEmitterTokens.SPACE.getToken()
+                + ASEmitterTokens.FUNCTION.getToken()
+                + ASEmitterTokens.PAREN_OPEN.getToken()
+                + ASEmitterTokens.PAREN_CLOSE.getToken()
+                + ASEmitterTokens.SPACE.getToken()
+                + ASEmitterTokens.BLOCK_OPEN.getToken());
+        writeNewline(ASEmitterTokens.RETURN.getToken()
+                + ASEmitterTokens.SPACE.getToken()
+                + ASEmitterTokens.THIS.getToken()
+                + ASEmitterTokens.MEMBER_ACCESS.getToken() + name + "_"
+                + ASEmitterTokens.SEMICOLON.getToken());
+        indentPop();
+        writeNewline(ASEmitterTokens.BLOCK_CLOSE.getToken()
+                + ASEmitterTokens.COMMA.getToken());
+        writeNewline();
+        writeNewline("/** @this {"
+                + fjs.formatQualifiedName(cdef.getQualifiedName()) + "} */");
+        writeNewline(ASEmitterTokens.SET.getToken()
+                + ASEmitterTokens.COLON.getToken()
+                + ASEmitterTokens.SPACE.getToken()
+                + ASEmitterTokens.FUNCTION.getToken()
+                + ASEmitterTokens.PAREN_OPEN.getToken() + "value"
+                + ASEmitterTokens.PAREN_CLOSE.getToken()
+                + ASEmitterTokens.SPACE.getToken()
+                + ASEmitterTokens.BLOCK_OPEN.getToken());
+        writeNewline("if (value != " + ASEmitterTokens.THIS.getToken()
+                + ASEmitterTokens.MEMBER_ACCESS.getToken() + name + "_) {");
+        writeNewline("    var oldValue = " + ASEmitterTokens.THIS.getToken()
+                + ASEmitterTokens.MEMBER_ACCESS.getToken() + name + "_"
+                + ASEmitterTokens.SEMICOLON.getToken());
+        writeNewline("    " + ASEmitterTokens.THIS.getToken()
+                + ASEmitterTokens.MEMBER_ACCESS.getToken() + name
+                + "_ = value;");
+        writeNewline("    this.dispatchEvent(org_apache_flex_events_ValueChangeEvent.createUpdateEvent(");
+        writeNewline("         this, \"" + name + "\", oldValue, value));");
+        writeNewline("}");
+        write(ASEmitterTokens.BLOCK_CLOSE.getToken());
+        write(ASEmitterTokens.BLOCK_CLOSE.getToken());
+    }
 }

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/ec0a7923/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/ForEachEmitter.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/ForEachEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/ForEachEmitter.java
new file mode 100644
index 0000000..1b33061
--- /dev/null
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/ForEachEmitter.java
@@ -0,0 +1,88 @@
+/*
+ *
+ *  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.codegen.js.jx;
+
+import org.apache.flex.compiler.codegen.ISubEmitter;
+import org.apache.flex.compiler.codegen.js.IJSEmitter;
+import org.apache.flex.compiler.internal.codegen.as.ASEmitterTokens;
+import org.apache.flex.compiler.internal.codegen.js.JSSubEmitter;
+import org.apache.flex.compiler.tree.as.IASNode;
+import org.apache.flex.compiler.tree.as.IBinaryOperatorNode;
+import org.apache.flex.compiler.tree.as.IForLoopNode;
+import org.apache.flex.compiler.tree.as.IIdentifierNode;
+import org.apache.flex.compiler.tree.as.IVariableExpressionNode;
+import org.apache.flex.compiler.tree.as.IVariableNode;
+
+public class ForEachEmitter extends JSSubEmitter implements
+        ISubEmitter<IForLoopNode>
+{
+
+    public ForEachEmitter(IJSEmitter emitter)
+    {
+        super(emitter);
+    }
+
+    @Override
+    public void emit(IForLoopNode node)
+    {
+        IBinaryOperatorNode bnode = (IBinaryOperatorNode) node
+                .getConditionalsContainerNode().getChild(0);
+        IASNode childNode = bnode.getChild(0);
+
+        final String iterName = getModel().getCurrentForeachName();
+        getModel().incForeachLoopCount();
+
+        write(ASEmitterTokens.FOR);
+        write(ASEmitterTokens.SPACE);
+        write(ASEmitterTokens.PAREN_OPEN);
+        write(ASEmitterTokens.VAR);
+        write(ASEmitterTokens.SPACE);
+        write(iterName);
+        write(ASEmitterTokens.SPACE);
+        write(ASEmitterTokens.IN);
+        write(ASEmitterTokens.SPACE);
+        getWalker().walk(bnode.getChild(1));
+        writeToken(ASEmitterTokens.PAREN_CLOSE);
+        writeNewline();
+        write(ASEmitterTokens.BLOCK_OPEN);
+        writeNewline();
+        if (childNode instanceof IVariableExpressionNode)
+        {
+            write(ASEmitterTokens.VAR);
+            write(ASEmitterTokens.SPACE);
+            write(((IVariableNode) childNode.getChild(0)).getName());
+        }
+        else
+            write(((IIdentifierNode) childNode).getName());
+        write(ASEmitterTokens.SPACE);
+        write(ASEmitterTokens.EQUAL);
+        write(ASEmitterTokens.SPACE);
+        getWalker().walk(bnode.getChild(1));
+        write(ASEmitterTokens.SQUARE_OPEN);
+        write(iterName);
+        write(ASEmitterTokens.SQUARE_CLOSE);
+        write(ASEmitterTokens.SEMICOLON);
+        writeNewline();
+        getWalker().walk(node.getStatementContentsNode());
+        write(ASEmitterTokens.BLOCK_CLOSE);
+        writeNewline();
+    }
+
+}