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 4d4a9d0 support private labelFunctions
4d4a9d0 is described below
commit 4d4a9d0376253f056297d587f38dc2cfa7a10a82
Author: Alex Harui <[email protected]>
AuthorDate: Wed Oct 30 10:15:49 2019 -0700
support private labelFunctions
---
.../codegen/mxml/royale/MXMLRoyaleEmitter.java | 13 ++-
.../mxml/royale/TestRoyaleMXMLApplication.java | 116 +++++++++++++++++++++
2 files changed, 126 insertions(+), 3 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 7290267..306504b 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
@@ -48,6 +48,7 @@ import
org.apache.royale.compiler.constants.IASKeywordConstants;
import org.apache.royale.compiler.constants.IASLanguageConstants;
import org.apache.royale.compiler.definitions.IClassDefinition;
import org.apache.royale.compiler.definitions.IDefinition;
+import org.apache.royale.compiler.definitions.IFunctionDefinition;
import org.apache.royale.compiler.definitions.ITypeDefinition;
import org.apache.royale.compiler.internal.as.codegen.InstructionListNode;
import org.apache.royale.compiler.internal.codegen.as.ASEmitterTokens;
@@ -2192,13 +2193,19 @@ public class MXMLRoyaleEmitter extends MXMLEmitter
implements
{
RoyaleJSProject project = (RoyaleJSProject)
getMXMLWalker().getProject();
project.needLanguage = true;
+ IFunctionDefinition fdef =
((MXMLFunctionNode)node).getValue(project);
+ 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() +
-
((MXMLFunctionNode)node).getValue((ICompilerProject)
getMXMLWalker().getProject()).getBaseName() +
+ 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() + "__" +
-
((MXMLFunctionNode)node).getValue((ICompilerProject)
getMXMLWalker().getProject()).getBaseName() +
+ "__" +
JSRoyaleEmitterTokens.CLOSURE_FUNCTION_NAME.getToken() + "__" +
fdef.getBaseName() +
ASEmitterTokens.SINGLE_QUOTE.getToken()
+ ASEmitterTokens.PAREN_CLOSE.getToken();
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 882621f..ce53368 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
@@ -1603,6 +1603,122 @@ public class TestRoyaleMXMLApplication extends
RoyaleTestBase
}
@Test
+ public void testFXComponentPrivateFunctionAttribute()
+ {
+ String code = "<basic:Application
xmlns:fx=\"http://ns.adobe.com/mxml/2009\"
xmlns:basic=\"library://ns.apache.org/royale/basic\">"
+ + "<fx:Script><![CDATA[private 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);
+
+ RoyaleJSProject project =
(RoyaleJSProject)mxmlBlockWalker.getProject();
+ project.setAllowPrivateNameConflicts(true);
+
((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, [org.apache.royale.charts.beads.DataTipBead, 2,
'_id', true, '$ID0', 'labelFunction', true,
org.apache.royale.utils.Language.closure(this.AppName_fn_test, this,
'__org.apache.royale.utils.Language.closure__fn_test'), 0, 0, null],\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" +
+ " * @private\n" +
+ " * @param {string} foo\n" +
+ " */\n" +
+ "AppName.prototype.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" +
+ " 'AppName': { type: '', declaredBy:
'AppName'}\n"+
+ " };\n" +
+ " }\n" +
+ " };\n" +
+ "};\n" +
+ "/**\n" +
+ " * @const\n" +
+ " * @type {number}\n" +
+ " */\n" +
+ "AppName.prototype.ROYALE_REFLECTION_INFO.compileFlags
= 9;";
+
+ assertOutMXMLPostProcess(outTemplate.replaceAll("AppName", appName),
true);
+ }
+
+ @Test
public void testRoyaleMainFileDual()
{
MXMLJSC mxmlc = new MXMLJSC();