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\">"