This is an automated email from the ASF dual-hosted git repository.

aharui pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-compiler.git


The following commit(s) were added to refs/heads/develop by this push:
     new 2b0fcd9  fix #119
2b0fcd9 is described below

commit 2b0fcd9c860b283d5f2fab138764a65657705c5b
Author: Alex Harui <[email protected]>
AuthorDate: Sun Feb 23 23:21:03 2020 -0800

    fix #119
---
 .../codegen/mxml/royale/MXMLRoyaleEmitter.java     |  14 +-
 .../mxml/royale/TestRoyaleMXMLApplication.java     | 254 ++++++++++++++++++++-
 2 files changed, 258 insertions(+), 10 deletions(-)

diff --git 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java
 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java
index 30baeae..8842ecf 100644
--- 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java
+++ 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java
@@ -2311,20 +2311,16 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
        {
             RoyaleJSProject project = (RoyaleJSProject) 
getMXMLWalker().getProject();
             project.needLanguage = true;
-            IFunctionDefinition fdef = 
((MXMLFunctionNode)node).getValue(project);
+            MXMLFunctionNode fnode = ((MXMLFunctionNode)node);
+            IFunctionDefinition fdef = fnode.getValue(project);
+            IExpressionNode fexpNode = 
(IExpressionNode)fnode.getExpressionNode();
             String fnName = fdef.getBaseName();
             IASEmitter asEmitter = ((IMXMLBlockWalker) getMXMLWalker())
                     .getASEmitter();
             if (fdef.isPrivate() && project.getAllowPrivateNameConflicts())
                fnName = 
((JSRoyaleEmitter)asEmitter).formatPrivateName(fdef.getParent().getQualifiedName(),
 fdef.getBaseName());
-            
-               currentPropertySpecifier.value = 
JSRoyaleEmitterTokens.CLOSURE_FUNCTION_NAME.getToken() + 
ASEmitterTokens.PAREN_OPEN.getToken()
-                                       + ASEmitterTokens.THIS.getToken() + 
ASEmitterTokens.MEMBER_ACCESS.getToken() +
-                               fnName +
-                                       ASEmitterTokens.COMMA.getToken() + 
ASEmitterTokens.SPACE.getToken() + ASEmitterTokens.THIS.getToken() +
-                                       ASEmitterTokens.COMMA.getToken() + 
ASEmitterTokens.SPACE.getToken() + ASEmitterTokens.SINGLE_QUOTE.getToken() +
-                               "__" + 
JSRoyaleEmitterTokens.CLOSURE_FUNCTION_NAME.getToken() + "__" + 
fdef.getBaseName() +
-                                       ASEmitterTokens.SINGLE_QUOTE.getToken() 
+ ASEmitterTokens.PAREN_CLOSE.getToken();
+            String fNodeString = 
((JSRoyaleEmitter)asEmitter).stringifyNode(fexpNode);
+               currentPropertySpecifier.value = fNodeString; 
                return;
        }
 
diff --git 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLApplication.java
 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLApplication.java
index fd28862..6a4435b 100644
--- 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLApplication.java
+++ 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLApplication.java
@@ -1745,7 +1745,7 @@ public class TestRoyaleMXMLApplication extends 
RoyaleTestBase
                                "      '$ID0',\n" +
                                "      'labelFunction',\n" +
                                "      true,\n" +
-                               "      
org.apache.royale.utils.Language.closure(this.fn_test, this, 
'__org.apache.royale.utils.Language.closure__fn_test'),\n" +
+                               "      
org.apache.royale.utils.Language.closure(this.fn_test, this, 'fn_test'),\n" +
                                "      0,\n" +
                                "      0,\n" +
                                "      null\n" +
@@ -1808,6 +1808,258 @@ public class TestRoyaleMXMLApplication extends 
RoyaleTestBase
     }
     
     @Test
+    public void testFXComponentFunctionAttributeFromAnotherObject()
+    {
+        String code = "<basic:Application 
xmlns:fx=\"http://ns.adobe.com/mxml/2009\"; 
xmlns:basic=\"library://ns.apache.org/royale/basic\">"
+                       + "<basic:beads><basic:DataTipBead 
labelFunction=\"initialView.addedToParent\" />"
+                + "</basic:beads></basic:Application>";
+
+        IMXMLDocumentNode dnode = (IMXMLDocumentNode) getNode(code,
+                       IMXMLDocumentNode.class, 
RoyaleTestBase.WRAP_LEVEL_NONE);
+
+        
((JSRoyaleEmitter)(mxmlBlockWalker.getASEmitter())).getModel().setCurrentClass(dnode.getDefinition());
+        mxmlBlockWalker.visitDocument(dnode);
+        String appName = dnode.getQualifiedName();
+        String outTemplate = "/**\n" +
+                       " * AppName\n" +
+                       " *\n" +
+                       " * @fileoverview\n" +
+                       " *\n" +
+                       " * @suppress {checkTypes|accessControls}\n" +
+                       " */\n" +
+                       "\n" +
+                       "goog.provide('AppName');\n" +
+                       "\n" +
+                       "goog.require('org.apache.royale.core.Application');\n" 
+
+                       
"goog.require('org.apache.royale.charts.beads.DataTipBead');\n" +
+//                     "goog.require('org.apache.royale.utils.Language');\n" + 
// in real compiles this will be output, but not in tests
+                       "\n" +
+                       "\n" +
+                       "\n" +
+                       "/**\n" +
+                       " * @constructor\n" +
+                       " * @extends {org.apache.royale.core.Application}\n" +
+                       " */\n" +
+                       "AppName = function() {\n" +
+                       "  AppName.base(this, 'constructor');\n" +
+                       "  \n" +
+                       "  /**\n" +
+                       "   * @private\n" +
+                       "   * @type 
{org.apache.royale.charts.beads.DataTipBead}\n" +
+                       "   */\n" +
+                       "  this.$ID0_;\n" +
+                       "  \n" +
+                       "  /**\n" +
+                       "   * @private\n" +
+                       "   * @type {Array}\n" +
+                       "   */\n" +
+                       "  this.mxmldd;\n" +
+                       "  \n" +
+                       "  /**\n" +
+                       "   * @private\n" +
+                       "   * @type {Array}\n" +
+                       "   */\n" +
+                       "  this.mxmldp;\n" +
+                       "\n" +
+                       "  this.generateMXMLAttributes([\n" +
+                       "    1,\n" +
+                       "    'beads',\n" +
+                               "    null,\n" +
+                               "    [\n" +
+                               "      
org.apache.royale.charts.beads.DataTipBead,\n" +
+                               "      2,\n" +
+                               "      '_id',\n" +
+                               "      true,\n" +
+                               "      '$ID0',\n" +
+                               "      'labelFunction',\n" +
+                               "      true,\n" +
+                               "      
org.apache.royale.utils.Language.closure(this.initialView.addedToParent, 
this.initialView, 'addedToParent'),\n" +
+                               "      0,\n" +
+                               "      0,\n" +
+                               "      null\n" +
+                               "    ],\n" +
+                       "    0,\n" +
+                       "    0\n" +
+                       "  ]);\n" +
+                       "  \n" +
+                       "};\n" +
+                       "goog.inherits(AppName, 
org.apache.royale.core.Application);\n" +
+                       "\n" +
+                       "\n" +
+                       "/**\n" +
+                       " * Prevent renaming of class. Needed for 
reflection.\n" +
+                       " */\n" +
+                       "goog.exportSymbol('AppName', AppName);\n" +
+                       "\n" +
+                       "\n" +
+                               "\n" +
+                       "/**\n" +
+                       " * Metadata\n" +
+                       " *\n" +
+                       " * @type {Object.<string, Array.<Object>>}\n" +
+                       " */\n" +
+                       "AppName.prototype.ROYALE_CLASS_INFO = { names: [{ 
name: 'AppName', qName: 'AppName', kind: 'class'  }] };\n" +
+                       "\n" +
+                       "\n" +
+                       "\n" +
+                       "/**\n" +
+                       " * Reflection\n" +
+                       " *\n" +
+                       " * @return {Object.<string, Function>}\n" +
+                       " */\n" +
+                       "AppName.prototype.ROYALE_REFLECTION_INFO = function () 
{\n" +
+                       "  return {\n" +
+                       "    methods: function () {\n" +
+                       "      return {\n" +
+                               "        'AppName': { type: '', declaredBy: 
'AppName'}\n"+
+                       "      };\n" +
+                       "    }\n" +
+                       "  };\n" +
+                       "};\n" +
+                       "/**\n" +
+                       " * @const\n" +
+                       " * @type {number}\n" +
+                       " */\n" +
+                       "AppName.prototype.ROYALE_COMPILE_FLAGS = 9;";
+
+        assertOutMXMLPostProcess(outTemplate.replaceAll("AppName", appName), 
true);
+    }
+    
+    @Test
+    public void testFXComponentFunctionAttributeStatic()
+    {
+        String code = "<basic:Application 
xmlns:fx=\"http://ns.adobe.com/mxml/2009\"; 
xmlns:basic=\"library://ns.apache.org/royale/basic\">"
+                       + "<fx:Script><![CDATA[public static function 
fn_test(foo:String):void {}]]></fx:Script><basic:beads><basic:DataTipBead 
labelFunction=\"fn_test\" />"
+                + "</basic:beads></basic:Application>";
+
+        IMXMLDocumentNode dnode = (IMXMLDocumentNode) getNode(code,
+                       IMXMLDocumentNode.class, 
RoyaleTestBase.WRAP_LEVEL_NONE);
+
+        
((JSRoyaleEmitter)(mxmlBlockWalker.getASEmitter())).getModel().setCurrentClass(dnode.getDefinition());
+        mxmlBlockWalker.visitDocument(dnode);
+        String appName = dnode.getQualifiedName();
+        String outTemplate = "/**\n" +
+                       " * AppName\n" +
+                       " *\n" +
+                       " * @fileoverview\n" +
+                       " *\n" +
+                       " * @suppress {checkTypes|accessControls}\n" +
+                       " */\n" +
+                       "\n" +
+                       "goog.provide('AppName');\n" +
+                       "\n" +
+                       "goog.require('org.apache.royale.core.Application');\n" 
+
+                       
"goog.require('org.apache.royale.charts.beads.DataTipBead');\n" +
+//                     "goog.require('org.apache.royale.utils.Language');\n" + 
// in real compiles this will be output, but not in tests
+                       "\n" +
+                       "\n" +
+                       "\n" +
+                       "/**\n" +
+                       " * @constructor\n" +
+                       " * @extends {org.apache.royale.core.Application}\n" +
+                       " */\n" +
+                       "AppName = function() {\n" +
+                       "  AppName.base(this, 'constructor');\n" +
+                       "  \n" +
+                       "  /**\n" +
+                       "   * @private\n" +
+                       "   * @type 
{org.apache.royale.charts.beads.DataTipBead}\n" +
+                       "   */\n" +
+                       "  this.$ID0_;\n" +
+                       "  \n" +
+                       "  /**\n" +
+                       "   * @private\n" +
+                       "   * @type {Array}\n" +
+                       "   */\n" +
+                       "  this.mxmldd;\n" +
+                       "  \n" +
+                       "  /**\n" +
+                       "   * @private\n" +
+                       "   * @type {Array}\n" +
+                       "   */\n" +
+                       "  this.mxmldp;\n" +
+                       "\n" +
+                       "  this.generateMXMLAttributes([\n" +
+                       "    1,\n" +
+                       "    'beads',\n" +
+                               "    null,\n" +
+                               "    [\n" +
+                               "      
org.apache.royale.charts.beads.DataTipBead,\n" +
+                               "      2,\n" +
+                               "      '_id',\n" +
+                               "      true,\n" +
+                               "      '$ID0',\n" +
+                               "      'labelFunction',\n" +
+                               "      true,\n" +
+                               "      AppName.fn_test,\n" +
+                               "      0,\n" +
+                               "      0,\n" +
+                               "      null\n" +
+                               "    ],\n" +
+                       "    0,\n" +
+                       "    0\n" +
+                       "  ]);\n" +
+                       "  \n" +
+                       "};\n" +
+                       "goog.inherits(AppName, 
org.apache.royale.core.Application);\n" +
+                       "\n" +
+                       "\n" +
+                       "/**\n" +
+                       " * Prevent renaming of class. Needed for 
reflection.\n" +
+                       " */\n" +
+                       "goog.exportSymbol('AppName', AppName);\n" +
+                       "\n" +
+                       "\n" +
+                               "\n" +
+                       "/**\n" +
+                       " * @export\n" +
+                       " * @param {string} foo\n" +
+                       " */\n" +
+                       "AppName.fn_test = function(foo) {\n" +
+                       "};" +
+                       "\n" +
+                       "\n" +
+                       "\n" +
+                       "/**\n" +
+                       " * Metadata\n" +
+                       " *\n" +
+                       " * @type {Object.<string, Array.<Object>>}\n" +
+                       " */\n" +
+                       "AppName.prototype.ROYALE_CLASS_INFO = { names: [{ 
name: 'AppName', qName: 'AppName', kind: 'class'  }] };\n" +
+                       "\n" +
+                       "\n" +
+                       "\n" +
+                       "/**\n" +
+                       " * Reflection\n" +
+                       " *\n" +
+                       " * @return {Object.<string, Function>}\n" +
+                       " */\n" +
+                       "AppName.prototype.ROYALE_REFLECTION_INFO = function () 
{\n" +
+                       "  return {\n" +
+                       "    methods: function () {\n" +
+                       "      return {\n" +
+                               "        '|fn_test': { type: 'void', 
declaredBy: 'AppName', parameters: function () { return [ 'String', false ]; 
}},\n"+
+                               "        'AppName': { type: '', declaredBy: 
'AppName'}\n"+
+                       "      };\n" +
+                       "    }\n" +
+                       "  };\n" +
+                       "};\n" +
+                       "/**\n" +
+                       " * @const\n" +
+                       " * @type {number}\n" +
+                       " */\n" +
+                       "AppName.prototype.ROYALE_COMPILE_FLAGS = 9;\n" +
+                       "/**\n" +
+                       " * Provide reflection support for distinguishing 
dynamic fields on class object (static)\n" +
+                       " * @const\n" +
+                       " * @type {Array<string>}\n" +
+                       " */\n" +
+                       "AppName.prototype.ROYALE_INITIAL_STATICS = 
Object.keys(AppName);";
+
+        assertOutMXMLPostProcess(outTemplate.replaceAll("AppName", appName), 
true);
+    }
+
+    @Test
     public void testFXComponentPrivateFunctionAttribute()
     {
         String code = "<basic:Application 
xmlns:fx=\"http://ns.adobe.com/mxml/2009\"; 
xmlns:basic=\"library://ns.apache.org/royale/basic\">"

Reply via email to