[FalconJx] updated FlexJS emitting

FlexJS was updated recently (commit fb614905ac) which meant the previous 
FalconJx version was unable to emit a functional JS application from the 
source. Various minor changes fix the issues that caused the JS error and the 
app is again output correctly:

http://people.apache.org/~erikdebruin/flexjs/
Signed-off-by: Erik de Bruin <e...@ixsoftware.nl>


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

Branch: refs/heads/develop
Commit: cdff845ad050b2597d0e334f46d21851add50eff
Parents: 414bf81
Author: Erik de Bruin <e...@ixsoftware.nl>
Authored: Fri Mar 29 19:54:36 2013 +0100
Committer: Erik de Bruin <e...@ixsoftware.nl>
Committed: Fri Mar 29 19:54:36 2013 +0100

----------------------------------------------------------------------
 .../codegen/js/flexjs/JSFlexJSEmitter.java         |  107 +++++++++++++-
 .../codegen/mxml/flexjs/MXMLFlexJSEmitter.java     |   79 +++++++----
 .../codegen/mxml/flexjs/MXMLFlexJSPublisher.java   |    4 -
 3 files changed, 148 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/cdff845a/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 7e59fa0..4d0b3e9 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
@@ -23,6 +23,7 @@ import java.io.FilterWriter;
 
 import org.apache.flex.compiler.codegen.js.flexjs.IJSFlexJSEmitter;
 import org.apache.flex.compiler.common.ASModifier;
+import org.apache.flex.compiler.common.ModifiersSet;
 import org.apache.flex.compiler.constants.IASLanguageConstants;
 import org.apache.flex.compiler.definitions.IDefinition;
 import org.apache.flex.compiler.definitions.IFunctionDefinition;
@@ -33,11 +34,14 @@ import 
org.apache.flex.compiler.internal.codegen.js.goog.JSGoogEmitter;
 import org.apache.flex.compiler.internal.codegen.js.goog.JSGoogEmitterTokens;
 import org.apache.flex.compiler.internal.definitions.AccessorDefinition;
 import org.apache.flex.compiler.internal.definitions.ClassDefinition;
+import org.apache.flex.compiler.internal.definitions.ClassTraitsDefinition;
 import org.apache.flex.compiler.internal.definitions.ParameterDefinition;
 import org.apache.flex.compiler.internal.definitions.VariableDefinition;
 import org.apache.flex.compiler.internal.tree.as.BinaryOperatorAssignmentNode;
+import org.apache.flex.compiler.internal.tree.as.ChainedVariableNode;
 import org.apache.flex.compiler.internal.tree.as.FunctionCallNode;
 import org.apache.flex.compiler.internal.tree.as.FunctionNode;
+import org.apache.flex.compiler.internal.tree.as.ParameterNode;
 import org.apache.flex.compiler.projects.ICompilerProject;
 import org.apache.flex.compiler.tree.ASTNodeID;
 import org.apache.flex.compiler.tree.as.IASNode;
@@ -53,6 +57,7 @@ import org.apache.flex.compiler.tree.as.IIdentifierNode;
 import org.apache.flex.compiler.tree.as.ILanguageIdentifierNode;
 import org.apache.flex.compiler.tree.as.IMemberAccessExpressionNode;
 import org.apache.flex.compiler.tree.as.ISetterNode;
+import org.apache.flex.compiler.tree.as.IVariableNode;
 import org.apache.flex.compiler.utils.ASNodeUtils;
 import org.apache.flex.compiler.utils.NativeUtils;
 
@@ -71,6 +76,61 @@ public class JSFlexJSEmitter extends JSGoogEmitter 
implements IJSFlexJSEmitter
     }
 
     @Override
+    public void emitField(IVariableNode node)
+    {
+        ICompilerProject project = getWalker().getProject();
+
+        IDefinition definition = getClassDefinition(node);
+
+        IDefinition def = null;
+        IExpressionNode enode = 
node.getVariableTypeNode();//getAssignedValueNode();
+        if (enode != null)
+            def = enode.resolveType(project);
+
+        getDoc().emitFieldDoc(node, def);
+
+        IDefinition ndef = node.getDefinition();
+
+        ModifiersSet modifierSet = ndef.getModifiers();
+        String root = "";
+        if (modifierSet != null && !modifierSet.hasModifier(ASModifier.STATIC))
+        {
+            root = JSEmitterTokens.PROTOTYPE.getToken();
+            root += ASEmitterTokens.MEMBER_ACCESS.getToken();
+        }
+
+        if (definition == null)
+            definition = ndef.getContainingScope().getDefinition();
+
+        write(definition.getQualifiedName()
+                + ASEmitterTokens.MEMBER_ACCESS.getToken() + root
+                + node.getName());
+
+        IExpressionNode vnode = node.getAssignedValueNode();
+        if (vnode != null)
+        {
+            write(ASEmitterTokens.SPACE);
+            writeToken(ASEmitterTokens.EQUAL);
+            getWalker().walk(vnode);
+        }
+
+        if (!(node instanceof ChainedVariableNode))
+        {
+            int len = node.getChildCount();
+            for (int i = 0; i < len; i++)
+            {
+                IASNode child = node.getChild(i);
+                if (child instanceof ChainedVariableNode)
+                {
+                    writeNewline(ASEmitterTokens.SEMICOLON);
+                    writeNewline();
+                    emitField((IVariableNode) child);
+                }
+            }
+        }
+    }
+
+    @Override
     protected void emitAccessors(IAccessorNode node)
     {
         if (node.getNodeID() == ASTNodeID.GetterID)
@@ -123,7 +183,6 @@ public class JSFlexJSEmitter extends JSGoogEmitter 
implements IJSFlexJSEmitter
             {
                 walkArguments(node.getArgumentNodes());
 
-                write(ASEmitterTokens.SPACE);
                 write("/** Cast to " + def.getQualifiedName() + " */");
             }
         }
@@ -149,6 +208,7 @@ public class JSFlexJSEmitter extends JSGoogEmitter 
implements IJSFlexJSEmitter
         ASTNodeID inode = pnode.getNodeID();
 
         boolean writeSelf = false;
+        boolean writeThis = false;
         if (cnode != null && !(def instanceof ParameterDefinition))
         {
             IDefinitionNode[] members = cnode.getAllMemberNodes();
@@ -177,11 +237,37 @@ public class JSFlexJSEmitter extends JSGoogEmitter 
implements IJSFlexJSEmitter
                 }
             }
         }
-        else if (cnode == null
-                && inode == ASTNodeID.MemberAccessExpressionID
-                && def instanceof VariableDefinition)
+        else if (cnode == null && !(type instanceof ClassTraitsDefinition))
         {
-            writeSelf = true;
+            // (erikdebruin) the sequence of these conditions matters, leave
+            //               well enough alone!
+            if (def instanceof VariableDefinition)
+            {
+                if (inode == ASTNodeID.MemberAccessExpressionID)
+                {
+                    writeSelf = true;
+                }
+                else if (inode == ASTNodeID.ContainerID)
+                {
+                    writeSelf = true;
+                    writeThis = true;
+                }
+                else if (!(pnode instanceof ParameterNode))
+                {
+                    writeSelf = true;
+                }
+            }
+            else if (inode == ASTNodeID.ContainerID)
+            {
+                writeSelf = true;
+            }
+            else if (inode == ASTNodeID.FunctionCallID
+                    && !(def instanceof AccessorDefinition)
+                    && inode != ASTNodeID.MemberAccessExpressionID)
+            {
+                writeSelf = true;
+                writeThis = true;
+            }
         }
 
         boolean emitName = true;
@@ -194,15 +280,20 @@ public class JSFlexJSEmitter extends JSGoogEmitter 
implements IJSFlexJSEmitter
 
         if (writeSelf && !isRunningInTestMode)
         {
-            if (inode == ASTNodeID.ContainerID)
+            boolean useGoogBind = inode == ASTNodeID.ContainerID && !writeThis;
+
+            if (useGoogBind)
             {
                 write("goog.bind(");
             }
 
-            write(JSGoogEmitterTokens.SELF);
+            if (writeThis)
+                write(ASEmitterTokens.THIS);
+            else
+                write(JSGoogEmitterTokens.SELF);
             write(ASEmitterTokens.MEMBER_ACCESS);
 
-            if (inode == ASTNodeID.ContainerID)
+            if (useGoogBind)
             {
                 write(node.getName());
                 write(", self)");

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/cdff845a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java
----------------------------------------------------------------------
diff --git 
a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java
 
b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java
index 635e630..f9effde 100644
--- 
a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java
+++ 
b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java
@@ -33,6 +33,7 @@ import 
org.apache.flex.compiler.internal.codegen.mxml.MXMLEmitter;
 import org.apache.flex.compiler.projects.ICompilerProject;
 import org.apache.flex.compiler.tree.as.IASNode;
 import org.apache.flex.compiler.tree.as.IFunctionNode;
+import org.apache.flex.compiler.tree.as.IImportNode;
 import org.apache.flex.compiler.tree.mxml.IMXMLArrayNode;
 import org.apache.flex.compiler.tree.mxml.IMXMLDocumentNode;
 import org.apache.flex.compiler.tree.mxml.IMXMLEventSpecifierNode;
@@ -51,25 +52,13 @@ public class MXMLFlexJSEmitter extends MXMLEmitter 
implements
         IMXMLFlexJSEmitter
 {
 
-    // list of all current instance and it's ancestors
     private ArrayList<MXMLDescriptorSpecifier> currentInstances;
-
-    // list of all current property specifier and it's ancestors
     private ArrayList<MXMLDescriptorSpecifier> currentPropertySpecifiers;
-
-    // tree of all contents
     private ArrayList<MXMLDescriptorSpecifier> descriptorTree;
-
-    // linear list of all events
     private ArrayList<MXMLEventSpecifier> events;
-
-    // linear list of all instances
     private ArrayList<MXMLDescriptorSpecifier> instances;
-
-    // linear list of all scripts
+    private ArrayList<String> imports;
     private ArrayList<MXMLScriptSpecifier> scripts;
-
-    // linear list of all styles
     //private ArrayList<MXMLStyleSpecifier> styles;
 
     private int eventCounter;
@@ -91,6 +80,7 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
 
         events = new ArrayList<MXMLEventSpecifier>();
         instances = new ArrayList<MXMLDescriptorSpecifier>();
+        imports = new ArrayList<String>();
         scripts = new ArrayList<MXMLScriptSpecifier>();
         //styles = new ArrayList<MXMLStyleSpecifier>();
 
@@ -134,6 +124,14 @@ public class MXMLFlexJSEmitter extends MXMLEmitter 
implements
                 writtenInstances.add(name);
             }
         }
+        for (String name : imports)
+        {
+            if (writtenInstances.indexOf(name) == -1)
+            {
+                emitHeaderDoc(name, "require");
+                writtenInstances.add(name);
+            }
+        }
 
         writeNewline();
         writeNewline("/**");
@@ -209,16 +207,10 @@ public class MXMLFlexJSEmitter extends MXMLEmitter 
implements
             indentPush();
             writeNewline("{");
             indentPop();
-            
-            // TODO (erikdebruin) fix properly: hack to get FlexJSAgain working
-            if (event.value.contains("model /**"))
-                event.value = event.value.replace("model /**", "this.model 
/**");
-            
-            // TODO (erikdebruin) fix properly: hack to get FlexJSAgain working
-            if (event.value.contains("dispatchEvent"))
-                event.value = event.value.replace("dispatchEvent", 
"this.dispatchEvent");
-            
+
+            writeNewline("var self = this;");
             writeNewline(event.value + ASEmitterTokens.SEMICOLON.getToken());
+
             writeNewline("};");
             writeNewline();
         }
@@ -361,7 +353,22 @@ public class MXMLFlexJSEmitter extends MXMLEmitter 
implements
         IASEmitter asEmitter = ((IMXMLBlockWalker) getMXMLWalker())
                 .getASEmitter();
 
-        eventSpecifier.value = asEmitter.stringifyNode(node.getChild(0));
+        StringBuilder sb = null;
+        int len = node.getChildCount();
+        if (len > 0)
+        {
+            sb = new StringBuilder();
+            for (int i = 0; i < len; i++)
+            {
+                sb.append(asEmitter.stringifyNode(node.getChild(i)));
+                if (i < len - 1)
+                {
+                    sb.append(ASEmitterTokens.SEMICOLON.getToken());
+                    sb.append(ASEmitterTokens.NEW_LINE.getToken());
+                }
+            }
+        }
+        eventSpecifier.value = sb.toString();
 
         if (currentDescriptor != null)
             currentDescriptor.eventSpecifiers.add(eventSpecifier);
@@ -476,16 +483,28 @@ public class MXMLFlexJSEmitter extends MXMLEmitter 
implements
                 IASNode cnode = node.getChild(i);
 
                 docEmitter.setBufferWrite(true);
-                docEmitter.emitMethodDoc((IFunctionNode) cnode, getMXMLWalker()
-                        .getProject());
+                if (cnode instanceof IFunctionNode)
+                {
+                    docEmitter.emitMethodDoc((IFunctionNode) cnode,
+                            getMXMLWalker().getProject());
+                }
+                else if (cnode instanceof IImportNode)
+                {
+                    imports.add(((IImportNode) cnode).getImportName());
+                }
                 sb.append(docEmitter.flushBuffer());
-                
-                sb.append(asEmitter.stringifyNode(cnode));
 
-                if (i == len - 1)
-                    indentPop();
+                if (!(cnode instanceof IImportNode))
+                {
+                    sb.append(asEmitter.stringifyNode(cnode));
+
+                    sb.append(ASEmitterTokens.SEMICOLON.getToken());
+
+                    if (i == len - 1)
+                        indentPop();
 
-                sb.append(nl);
+                    sb.append(nl);
+                }
 
                 scriptSpecifier.fragment = sb.toString();
 

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/cdff845a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSPublisher.java
----------------------------------------------------------------------
diff --git 
a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSPublisher.java
 
b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSPublisher.java
index 2ee179a..8c29a3f 100644
--- 
a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSPublisher.java
+++ 
b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSPublisher.java
@@ -197,10 +197,6 @@ public class MXMLFlexJSPublisher extends JSGoogPublisher 
implements
         htmlFile.append("\t\t\treturn true;\n");
         htmlFile.append("\t\t};\n");
         htmlFile.append("\t\t\n");
-        htmlFile.append("\t\tfunction Event(type) {\n");
-        htmlFile.append("\t\t\treturn 
org.apache.flex.FlexGlobal.newObject(flash.events.Event, [type]);\n");
-        htmlFile.append("\t\t};\n");
-        htmlFile.append("\t\t\n");
         
         htmlFile.append("\t\tnew ");
         htmlFile.append(projectName);

Reply via email to