You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ah...@apache.org on 2013/05/01 21:03:49 UTC

[3/3] git commit: [flex-falcon] - Fix MXMLFlexJSEmitter so it handles top tag properties on all MXML files

Fix MXMLFlexJSEmitter so it handles top tag properties on all MXML files


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

Branch: refs/heads/develop
Commit: d80c98572c23adf691a0e6cc35787a8363d9180d
Parents: 7bf1bda
Author: Alex Harui <ah...@apache.org>
Authored: Wed May 1 12:03:31 2013 -0700
Committer: Alex Harui <ah...@apache.org>
Committed: Wed May 1 12:03:31 2013 -0700

----------------------------------------------------------------------
 .../flexjs/files/FlexJSTest_again_result.js        |   23 --
 .../test-files/flexjs/files/MyInitialView.mxml     |    2 +-
 .../flexjs/files/MyInitialView_result.js           |   24 +--
 .../flexjs/files/wildcard_import_result.js         |   48 ---
 .../flex/compiler/internal/codegen/Emitter.java    |    3 +-
 .../mxml/flexjs/MXMLDescriptorSpecifier.java       |   22 +--
 .../codegen/mxml/flexjs/MXMLFlexJSEmitter.java     |  224 ++++++++-------
 7 files changed, 128 insertions(+), 218 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/d80c9857/compiler.jx.tests/test-files/flexjs/files/FlexJSTest_again_result.js
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/test-files/flexjs/files/FlexJSTest_again_result.js b/compiler.jx.tests/test-files/flexjs/files/FlexJSTest_again_result.js
index 0e9dc85..dc592ed 100644
--- a/compiler.jx.tests/test-files/flexjs/files/FlexJSTest_again_result.js
+++ b/compiler.jx.tests/test-files/flexjs/files/FlexJSTest_again_result.js
@@ -137,29 +137,6 @@ FlexJSTest_again.prototype.set_collection = function(value)
  * @this {FlexJSTest_again}
  * @return {Array} the Array of UI element descriptors.
  */
-FlexJSTest_again.prototype.get_MXMLDescriptor = function()
-{
-	if (this.mxmldd == undefined)
-	{
-		/** @type {Array} */
-		var arr = goog.base(this, 'get_MXMLDescriptor');
-		/** @type {Array} */
-		var data = [
-];
-	
-		if (arr)
-			this.mxmldd = arr.concat(data);
-		else
-			this.mxmldd = data;
-	}
-	return this.mxmldd;
-};
-
-/**
- * @override
- * @this {FlexJSTest_again}
- * @return {Array} the Array of UI element descriptors.
- */
 FlexJSTest_again.prototype.get_MXMLProperties = function()
 {
 	if (this.mxmldp == undefined)

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/d80c9857/compiler.jx.tests/test-files/flexjs/files/MyInitialView.mxml
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/test-files/flexjs/files/MyInitialView.mxml b/compiler.jx.tests/test-files/flexjs/files/MyInitialView.mxml
index 69fdf71..f2cc9c7 100644
--- a/compiler.jx.tests/test-files/flexjs/files/MyInitialView.mxml
+++ b/compiler.jx.tests/test-files/flexjs/files/MyInitialView.mxml
@@ -69,7 +69,7 @@ limitations under the License.
 								 destinationPropertyName="text" />
 		</basic:beads>
 	</basic:Label>
-	<basic:TextButton text="Start Timer" x="100" y="75" click="startTimer()" />
+	<basic:TextButton text="Let's Start Timer" x="100" y="75" click="startTimer()" />
 	<basic:TextButton text="Stop Timer" x="100" y="100" click="timer.removeEventListener('timer', timerHandler);timer.stop()" />
 	<basic:Label id="timerLabel" x="100" y="125" />
 	

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/d80c9857/compiler.jx.tests/test-files/flexjs/files/MyInitialView_result.js
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/test-files/flexjs/files/MyInitialView_result.js b/compiler.jx.tests/test-files/flexjs/files/MyInitialView_result.js
index 3e91753..7ac5c67 100644
--- a/compiler.jx.tests/test-files/flexjs/files/MyInitialView_result.js
+++ b/compiler.jx.tests/test-files/flexjs/files/MyInitialView_result.js
@@ -484,7 +484,7 @@ true,
 '$ID1',
 'text',
 true,
-'Start Timer',
+'Let\'s Start Timer',
 'y',
 true,
 75,
@@ -843,26 +843,4 @@ null
 	return this.mxmldd;
 };
 
-/**
- * @override
- * @this {MyInitialView}
- * @return {Array} the Array of UI element descriptors.
- */
-MyInitialView.prototype.get_MXMLProperties = function()
-{
-	if (this.mxmldp == undefined)
-	{
-		/** @type {Array} */
-		var arr = goog.base(this, 'get_MXMLProperties');
-		/** @type {Array} */
-		var data = [
-];
-	
-		if (arr)
-			this.mxmldp = arr.concat(data);
-		else
-			this.mxmldp = data;
-	}
-	return this.mxmldp;
-};
 

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/d80c9857/compiler.jx.tests/test-files/flexjs/files/wildcard_import_result.js
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/test-files/flexjs/files/wildcard_import_result.js b/compiler.jx.tests/test-files/flexjs/files/wildcard_import_result.js
index 9c7c4c9..6923f67 100644
--- a/compiler.jx.tests/test-files/flexjs/files/wildcard_import_result.js
+++ b/compiler.jx.tests/test-files/flexjs/files/wildcard_import_result.js
@@ -32,52 +32,4 @@ wildcard_import.prototype.tmp = function() {
 	myButton = new org.apache.flex.html.staticControls.Button();
 };
 
-/**
- * @override
- * @this {wildcard_import}
- * @return {Array} the Array of UI element descriptors.
- */
-wildcard_import.prototype.get_MXMLDescriptor = function()
-{
-	if (this.mxmldd == undefined)
-	{
-		/** @type {Array} */
-		var arr = goog.base(this, 'get_MXMLDescriptor');
-		/** @type {Array} */
-		var data = [
-];
-	
-		if (arr)
-			this.mxmldd = arr.concat(data);
-		else
-			this.mxmldd = data;
-	}
-	return this.mxmldd;
-};
-
-/**
- * @override
- * @this {wildcard_import}
- * @return {Array} the Array of UI element descriptors.
- */
-wildcard_import.prototype.get_MXMLProperties = function()
-{
-	if (this.mxmldp == undefined)
-	{
-		/** @type {Array} */
-		var arr = goog.base(this, 'get_MXMLProperties');
-		/** @type {Array} */
-		var data = [
-0,
-0,
-0
-];
-	
-		if (arr)
-			this.mxmldp = arr.concat(data);
-		else
-			this.mxmldp = data;
-	}
-	return this.mxmldp;
-};
 

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/d80c9857/compiler.jx/src/org/apache/flex/compiler/internal/codegen/Emitter.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/Emitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/Emitter.java
index 82d7163..c399d73 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/Emitter.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/Emitter.java
@@ -154,7 +154,8 @@ public class Emitter implements IEmitter
     @Override
     public void indentPop()
     {
-        currentIndent--;
+        if (currentIndent > 0)
+            currentIndent--;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/d80c9857/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLDescriptorSpecifier.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLDescriptorSpecifier.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLDescriptorSpecifier.java
index c8fd737..e4c98a5 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLDescriptorSpecifier.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLDescriptorSpecifier.java
@@ -76,10 +76,10 @@ public class MXMLDescriptorSpecifier extends MXMLNodeSpecifier
     public String id;
 
     //---------------------------------
-    //    isTopNodeInMainFile
+    //    isTopNode
     //---------------------------------
 
-    public boolean isTopNodeInMainFile;
+    public boolean isTopNode;
 
     //---------------------------------
     //    isProperty
@@ -88,23 +88,11 @@ public class MXMLDescriptorSpecifier extends MXMLNodeSpecifier
     public boolean isProperty;
     
     //---------------------------------
-    //    name
-    //---------------------------------
-
-    public String name;
-
-    //---------------------------------
     //    parent
     //---------------------------------
 
     public MXMLDescriptorSpecifier parent;
 
-    //---------------------------------
-    //    value
-    //---------------------------------
-
-    public String value;
-
     //--------------------------------------------------------------------------
     //
     //    Methods
@@ -205,7 +193,7 @@ public class MXMLDescriptorSpecifier extends MXMLNodeSpecifier
     @Override
     public String output(boolean writeNewline)
     {
-        if (isTopNodeInMainFile)
+        if (isTopNode)
         {
             int count = 0;
             for (MXMLDescriptorSpecifier md : propertySpecifiers)
@@ -257,7 +245,7 @@ public class MXMLDescriptorSpecifier extends MXMLNodeSpecifier
 
             outputEventSpecifier(writeNewline);
             
-            if (!isTopNodeInMainFile)
+            if (!isTopNode)
             {
                 writeDelimiter(writeNewline);
                 
@@ -270,7 +258,7 @@ public class MXMLDescriptorSpecifier extends MXMLNodeSpecifier
                     && parent.propertySpecifiers.indexOf(this) == parent.propertySpecifiers
                             .size() - 1;
 
-            if (!isLastChild && !isTopNodeInMainFile)
+            if (!isLastChild && !isTopNode)
                 writeDelimiter(writeNewline);
         }
 

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/d80c9857/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 0f10cd8..a2bd7e3 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
@@ -58,6 +58,7 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
     private ArrayList<MXMLDescriptorSpecifier> currentInstances;
     private ArrayList<MXMLDescriptorSpecifier> currentPropertySpecifiers;
     private ArrayList<MXMLDescriptorSpecifier> descriptorTree;
+    private MXMLDescriptorSpecifier propertiesTree;
     private ArrayList<MXMLEventSpecifier> events;
     private ArrayList<MXMLDescriptorSpecifier> instances;
     private ArrayList<MXMLScriptSpecifier> scripts;
@@ -66,7 +67,7 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
     private int eventCounter;
     private int idCounter;
 
-    private boolean isMainFile;
+    private boolean inMXMLContent;
 
     public MXMLFlexJSEmitter(FilterWriter out)
     {
@@ -79,6 +80,7 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
     public void emitDocument(IMXMLDocumentNode node)
     {
         descriptorTree = new ArrayList<MXMLDescriptorSpecifier>();
+        propertiesTree = new MXMLDescriptorSpecifier();
 
         events = new ArrayList<MXMLEventSpecifier>();
         instances = new ArrayList<MXMLDescriptorSpecifier>();
@@ -88,25 +90,9 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
         currentInstances = new ArrayList<MXMLDescriptorSpecifier>();
         currentPropertySpecifiers = new ArrayList<MXMLDescriptorSpecifier>();
 
-        isMainFile = true;
-        IMXMLPropertySpecifierNode[] propertySpecifierNodes = node
-                .getPropertySpecifierNodes();
-        if (propertySpecifierNodes != null && propertySpecifierNodes.length > 0)
-            isMainFile = !isMXMLContentNode((IMXMLPropertySpecifierNode) node
-                    .getPropertySpecifierNodes()[0]);
-
         eventCounter = 0;
         idCounter = 0;
 
-        if (isMainFile)
-        {
-            // fake root node; the main file doesn't have 'mxmlContent' as root 
-            MXMLDescriptorSpecifier fakeRoot = new MXMLDescriptorSpecifier();
-            fakeRoot.name = "mxmlContent";
-            descriptorTree.add(fakeRoot);
-            currentInstances.add(fakeRoot);
-        }
-
         // visit MXML
         IClassDefinition cdef = node.getClassDefinition();
         IASEmitter asEmitter = ((IMXMLBlockWalker) getMXMLWalker())
@@ -124,9 +110,7 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
 
         emitHeader(node);
 
-        boolean indent = !isMainFile || propertySpecifierNodes == null;
-
-        emitClassDeclStart(cname, node, indent);
+        emitClassDeclStart(cname, node, false);
 
         emitPropertyDecls();
 
@@ -302,89 +286,94 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
     protected void emitMXMLDescriptorFuncs(String cname)
     {
         // top level is 'mxmlContent', skip it...
-        if (descriptorTree.size() == 0)
-            return;
-
-        MXMLDescriptorSpecifier root = descriptorTree.get(0);
-        root.isTopNodeInMainFile = isMainFile;
-
-        writeNewline("/**");
-        writeNewline(" * @override");
-        writeNewline(" * @this {" + cname + "}");
-        writeNewline(" * @return {Array} the Array of UI element descriptors.");
-        writeNewline(" */");
-        writeNewline(cname + ".prototype.get_MXMLDescriptor = function()");
-        indentPush();
-        writeNewline("{");
-        writeNewline("if (this.mxmldd == undefined)");
-        indentPush();
-        writeNewline("{");
-        writeNewline("/** @type {Array} */");
-        writeNewline("var arr = goog.base(this, 'get_MXMLDescriptor');");
-        writeNewline("/** @type {Array} */");
-        indentPop();
-        indentPop();
-        writeNewline("var data = [");
-
-        if (!isMainFile)
+        if (descriptorTree.size() > 0)
+        {
+            MXMLDescriptorSpecifier root = descriptorTree.get(0);
+            root.isTopNode = false;
+    
+            writeNewline("/**");
+            writeNewline(" * @override");
+            writeNewline(" * @this {" + cname + "}");
+            writeNewline(" * @return {Array} the Array of UI element descriptors.");
+            writeNewline(" */");
+            writeNewline(cname + ".prototype.get_MXMLDescriptor = function()");
+            indentPush();
+            writeNewline("{");
+            writeNewline("if (this.mxmldd == undefined)");
+            indentPush();
+            writeNewline("{");
+            writeNewline("/** @type {Array} */");
+            writeNewline("var arr = goog.base(this, 'get_MXMLDescriptor');");
+            writeNewline("/** @type {Array} */");
+            indentPop();
+            indentPop();
+            writeNewline("var data = [");
+    
             writeNewline(root.output(true));
-
-        indentPush();
-        writeNewline("];");
-        indentPush();
-        writeNewline("");
-        indentPush();
-        writeNewline("if (arr)");
-        indentPop();
-        writeNewline("this.mxmldd = arr.concat(data);");
-        indentPush();
-        writeNewline("else");
-        indentPop();
-        indentPop();
-        writeNewline("this.mxmldd = data;");
-        writeNewline("}");
-        indentPop();
-        writeNewline("return this.mxmldd;");
-        writeNewline("};");
-        writeNewline();
-        writeNewline("/**");
-        writeNewline(" * @override");
-        writeNewline(" * @this {" + cname + "}");
-        writeNewline(" * @return {Array} the Array of UI element descriptors.");
-        writeNewline(" */");
-        writeNewline(cname + ".prototype.get_MXMLProperties = function()");
-        indentPush();
-        writeNewline("{");
-        writeNewline("if (this.mxmldp == undefined)");
-        indentPush();
-        writeNewline("{");
-        writeNewline("/** @type {Array} */");
-        writeNewline("var arr = goog.base(this, 'get_MXMLProperties');");
-        writeNewline("/** @type {Array} */");
-        indentPop();
-        indentPop();
-        writeNewline("var data = [");
-
-        if (isMainFile)
+    
+            indentPush();
+            writeNewline("];");
+            indentPush();
+            writeNewline("");
+            indentPush();
+            writeNewline("if (arr)");
+            indentPop();
+            writeNewline("this.mxmldd = arr.concat(data);");
+            indentPush();
+            writeNewline("else");
+            indentPop();
+            indentPop();
+            writeNewline("this.mxmldd = data;");
+            writeNewline("}");
+            indentPop();
+            writeNewline("return this.mxmldd;");
+            writeNewline("};");
+            writeNewline();
+        }
+        
+        if (propertiesTree.propertySpecifiers.size() > 0 ||
+                propertiesTree.eventSpecifiers.size() > 0)
+        {
+            writeNewline("/**");
+            writeNewline(" * @override");
+            writeNewline(" * @this {" + cname + "}");
+            writeNewline(" * @return {Array} the Array of UI element descriptors.");
+            writeNewline(" */");
+            writeNewline(cname + ".prototype.get_MXMLProperties = function()");
+            indentPush();
+            writeNewline("{");
+            writeNewline("if (this.mxmldp == undefined)");
+            indentPush();
+            writeNewline("{");
+            writeNewline("/** @type {Array} */");
+            writeNewline("var arr = goog.base(this, 'get_MXMLProperties');");
+            writeNewline("/** @type {Array} */");
+            indentPop();
+            indentPop();
+            writeNewline("var data = [");
+    
+            MXMLDescriptorSpecifier root = propertiesTree;
+            root.isTopNode = true;
             writeNewline(root.output(true));
-
-        indentPush();
-        writeNewline("];");
-        indentPush();
-        writeNewline("");
-        indentPush();
-        writeNewline("if (arr)");
-        indentPop();
-        writeNewline("this.mxmldp = arr.concat(data);");
-        indentPush();
-        writeNewline("else");
-        indentPop();
-        indentPop();
-        writeNewline("this.mxmldp = data;");
-        writeNewline("}");
-        indentPop();
-        writeNewline("return this.mxmldp;", false);
-        writeNewline("};");
+    
+            indentPush();
+            writeNewline("];");
+            indentPush();
+            writeNewline("");
+            indentPush();
+            writeNewline("if (arr)");
+            indentPop();
+            writeNewline("this.mxmldp = arr.concat(data);");
+            indentPush();
+            writeNewline("else");
+            indentPop();
+            indentPop();
+            writeNewline("this.mxmldp = data;");
+            writeNewline("}");
+            indentPop();
+            writeNewline("return this.mxmldp;", false);
+            writeNewline("};");
+        }
     }
 
     //--------------------------------------------------------------------------    
@@ -426,6 +415,8 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
 
         if (currentDescriptor != null)
             currentDescriptor.eventSpecifiers.add(eventSpecifier);
+        else  // in theory, if no currentdescriptor must be top tag event
+            propertiesTree.eventSpecifiers.add(eventSpecifier);
 
         events.add(eventSpecifier);
     }
@@ -451,8 +442,13 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
 
         if (currentPropertySpecifier != null)
             currentPropertySpecifier.propertySpecifiers.add(currentInstance);
-        else
+        else if (inMXMLContent)
             descriptorTree.add(currentInstance);
+        else
+        {
+            currentInstance.parent = propertiesTree;
+            propertiesTree.propertySpecifiers.add(currentInstance);
+        }
 
         instances.add(currentInstance);
 
@@ -497,10 +493,19 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
         currentPropertySpecifier.name = cdef.getQualifiedName();
         currentPropertySpecifier.parent = currentInstance;
 
+        boolean oldInMXMLContent = inMXMLContent;
+        if (currentPropertySpecifier.name.equals("mxmlContent"))
+            inMXMLContent = true;
+        
         if (currentInstance != null)
             currentInstance.propertySpecifiers.add(currentPropertySpecifier);
-        else
+        else if (inMXMLContent)
             descriptorTree.add(currentPropertySpecifier);
+        else
+        {
+            currentPropertySpecifier.parent = propertiesTree;
+            propertiesTree.propertySpecifiers.add(currentPropertySpecifier);
+        }
 
         boolean bypass = cnode != null && cnode instanceof IMXMLArrayNode;
 
@@ -511,6 +516,8 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
         getMXMLWalker().walk(cnode); // Array or Instance
 
         moveUp(bypass, false);
+        
+        inMXMLContent = oldInMXMLContent;
     }
 
     @Override
@@ -593,8 +600,15 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
         if (ps.valueNeedsQuotes)
             ps.value += ASEmitterTokens.SINGLE_QUOTE.getToken();
 
-        ps.value += node.getValue().toString();
-
+        String s = node.getValue().toString();
+        if (ps.valueNeedsQuotes)
+        {
+            // escape all single quotes found within the string
+            s = s.replace(ASEmitterTokens.SINGLE_QUOTE.getToken(), 
+                    "\\" + ASEmitterTokens.SINGLE_QUOTE.getToken());
+        }
+        ps.value += s;
+        
         if (ps.valueNeedsQuotes)
             ps.value += ASEmitterTokens.SINGLE_QUOTE.getToken();
     }