fix some bugs around fx:Array, fx:Object, fx:Number, etc in fx:Declarations. Should fix apache/royale-asjs#1007 and apache/royale-asjs#999
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 820d26a..f211c8f 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
@@ -3052,6 +3052,50 @@
}
@Override
+ public void emitBoolean(IMXMLBooleanNode node)
+ {
+ if (node.getParent().getNodeID() == ASTNodeID.MXMLDeclarationsID)
+ {
+ primitiveDeclarationNodes.add(node);
+ return;
+ }
+ super.emitBoolean(node);
+ }
+
+ @Override
+ public void emitNumber(IMXMLNumberNode node)
+ {
+ if (node.getParent().getNodeID() == ASTNodeID.MXMLDeclarationsID)
+ {
+ primitiveDeclarationNodes.add(node);
+ return;
+ }
+ super.emitNumber(node);
+ }
+
+ @Override
+ public void emitInt(IMXMLIntNode node)
+ {
+ if (node.getParent().getNodeID() == ASTNodeID.MXMLDeclarationsID)
+ {
+ primitiveDeclarationNodes.add(node);
+ return;
+ }
+ super.emitInt(node);
+ }
+
+ @Override
+ public void emitUint(IMXMLUintNode node)
+ {
+ if (node.getParent().getNodeID() == ASTNodeID.MXMLDeclarationsID)
+ {
+ primitiveDeclarationNodes.add(node);
+ return;
+ }
+ super.emitUint(node);
+ }
+
+ @Override
public void emitString(IMXMLStringNode node)
{
if (node.getParent().getNodeID() == ASTNodeID.MXMLDeclarationsID)
@@ -3566,6 +3610,26 @@
}
break;
}
+ case MXMLBooleanID:
+ case MXMLNumberID:
+ case MXMLIntID:
+ case MXMLUintID:
+ {
+ IMXMLExpressionNode scalarNode = (IMXMLExpressionNode)declNode;
+ varname = scalarNode.getEffectiveID();
+ writeNewline();
+ write(ASEmitterTokens.THIS);
+ write(ASEmitterTokens.MEMBER_ACCESS);
+ write(varname);
+ write(ASEmitterTokens.SPACE);
+ writeToken(ASEmitterTokens.EQUAL);
+ IMXMLLiteralNode valueNode = (IMXMLLiteralNode)(scalarNode.getExpressionNode());
+ Object value = valueNode.getValue();
+ write(value.toString());
+ write(ASEmitterTokens.SEMICOLON);
+ break;
+ }
+
}
}
}
@@ -3596,6 +3660,60 @@
else
return "''";
}
+ else if (instanceNode instanceof IMXMLObjectNode)
+ {
+ IMXMLObjectNode objectNode = (IMXMLObjectNode)instanceNode;
+ StringBuilder sb = new StringBuilder();
+ sb.append("{");
+ int m = objectNode.getChildCount();
+ boolean firstOne = true;
+ for (int j = 0; j < m; j++)
+ {
+ if (firstOne)
+ firstOne = false;
+ else
+ sb.append(", ");
+ IMXMLPropertySpecifierNode propName = (IMXMLPropertySpecifierNode)objectNode.getChild(j);
+ sb.append(propName.getName() + ": ");
+ IMXMLInstanceNode valueNode = propName.getInstanceNode();
+ sb.append(instanceToString(valueNode));
+ }
+ sb.append("}");
+ return sb.toString();
+ }
+ else if (instanceNode instanceof IMXMLArrayNode)
+ {
+ IMXMLArrayNode arrayNode = (IMXMLArrayNode)instanceNode;
+ StringBuilder sb = new StringBuilder();
+ sb.append("[");
+ int m = arrayNode.getChildCount();
+ boolean firstOne = true;
+ for (int j = 0; j < m; j++)
+ {
+ IMXMLInstanceNode valueNode = (IMXMLInstanceNode)(arrayNode.getChild(j));
+ if (firstOne)
+ firstOne = false;
+ else
+ sb.append(", ");
+ sb.append(instanceToString(valueNode));
+ }
+ sb.append("]");
+ return sb.toString();
+ }
+ else if ((instanceNode instanceof IMXMLIntNode) ||
+ (instanceNode instanceof IMXMLUintNode) ||
+ (instanceNode instanceof IMXMLNumberNode) ||
+ (instanceNode instanceof IMXMLBooleanNode))
+ {
+ IMXMLExpressionNode scalarNode = (IMXMLExpressionNode)instanceNode;
+ IASNode vNode = scalarNode.getExpressionNode();
+ if (vNode instanceof IMXMLLiteralNode)
+ {
+ IMXMLLiteralNode valueNode = (IMXMLLiteralNode)vNode;
+ Object value = valueNode.getValue();
+ return value.toString();
+ }
+ }
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 ea09b72..b88bb01 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
@@ -1260,6 +1260,426 @@
}
@Test
+ public void testFXNumberDeclaration()
+ {
+ String code = "<basic:Application xmlns:fx=\"http://ns.adobe.com/mxml/2009\" xmlns:basic=\"library://ns.apache.org/royale/basic\">"
+ + "<fx:Declarations><fx:Number id=\"foo\">20.19</fx:Number>"
+ + "</fx:Declarations><basic:initialView><basic:View><basic:DropDownList dataProvider=\"['Hello', 'World']\"/></basic:View></basic:initialView></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.core.View');\n" +
+ "goog.require('org.apache.royale.html.DropDownList');\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @constructor\n" +
+ " * @extends {org.apache.royale.core.Application}\n" +
+ " */\n" +
+ "AppName = function() {\n" +
+ " AppName.base(this, 'constructor');\n" +
+ " \n" +
+ " this.foo = 20.19;\n" +
+ " /**\n" +
+ " * @private\n" +
+ " * @type {org.apache.royale.core.View}\n" +
+ " */\n" +
+ " this.$ID_8_1;\n" +
+ " \n" +
+ " /**\n" +
+ " * @private\n" +
+ " * @type {org.apache.royale.html.DropDownList}\n" +
+ " */\n" +
+ " this.$ID_8_0;\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" +
+ " 'initialView',\n" +
+ " false,\n" +
+ " [\n" +
+ " org.apache.royale.core.View,\n" +
+ " 1,\n" +
+ " '_id',\n" +
+ " true,\n" +
+ " '$ID_8_1',\n" +
+ " 0,\n" +
+ " 0,\n" +
+ " [\n" +
+ " org.apache.royale.html.DropDownList,\n" +
+ " 2,\n" +
+ " '_id',\n" +
+ " true,\n" +
+ " '$ID_8_0',\n" +
+ " 'dataProvider',\n" +
+ " true,\n" +
+ " ['Hello','World'],\n" +
+ " 0,\n" +
+ " 0,\n" +
+ " null\n" +
+ " ]\n" +
+ " ],\n" +
+ " 0,\n" +
+ " 0\n" +
+ " ]);\n" +
+ " \n" +
+ "};\n" +
+ "goog.inherits(AppName, org.apache.royale.core.Application);\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @export\n" +
+ " * @type {number}\n" +
+ " */\n" +
+ "AppName.prototype.foo;\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" +
+ " variables: function () {\n" +
+ " return {\n" +
+ " 'foo': { type: 'Number', get_set: function (/** AppName */ inst, /** * */ v) {return v !== undefined ? inst.foo = v : inst.foo;}}\n" +
+ " };\n" +
+ " },\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 testFXBooleanDeclaration()
+ {
+ String code = "<basic:Application xmlns:fx=\"http://ns.adobe.com/mxml/2009\" xmlns:basic=\"library://ns.apache.org/royale/basic\">"
+ + "<fx:Declarations><fx:Boolean id=\"foo\">true</fx:Boolean>"
+ + "</fx:Declarations><basic:initialView><basic:View><basic:DropDownList dataProvider=\"['Hello', 'World']\"/></basic:View></basic:initialView></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.core.View');\n" +
+ "goog.require('org.apache.royale.html.DropDownList');\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @constructor\n" +
+ " * @extends {org.apache.royale.core.Application}\n" +
+ " */\n" +
+ "AppName = function() {\n" +
+ " AppName.base(this, 'constructor');\n" +
+ " \n" +
+ " this.foo = true;\n" +
+ " /**\n" +
+ " * @private\n" +
+ " * @type {org.apache.royale.core.View}\n" +
+ " */\n" +
+ " this.$ID_8_1;\n" +
+ " \n" +
+ " /**\n" +
+ " * @private\n" +
+ " * @type {org.apache.royale.html.DropDownList}\n" +
+ " */\n" +
+ " this.$ID_8_0;\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" +
+ " 'initialView',\n" +
+ " false,\n" +
+ " [\n" +
+ " org.apache.royale.core.View,\n" +
+ " 1,\n" +
+ " '_id',\n" +
+ " true,\n" +
+ " '$ID_8_1',\n" +
+ " 0,\n" +
+ " 0,\n" +
+ " [\n" +
+ " org.apache.royale.html.DropDownList,\n" +
+ " 2,\n" +
+ " '_id',\n" +
+ " true,\n" +
+ " '$ID_8_0',\n" +
+ " 'dataProvider',\n" +
+ " true,\n" +
+ " ['Hello','World'],\n" +
+ " 0,\n" +
+ " 0,\n" +
+ " null\n" +
+ " ]\n" +
+ " ],\n" +
+ " 0,\n" +
+ " 0\n" +
+ " ]);\n" +
+ " \n" +
+ "};\n" +
+ "goog.inherits(AppName, org.apache.royale.core.Application);\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @export\n" +
+ " * @type {boolean}\n" +
+ " */\n" +
+ "AppName.prototype.foo;\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" +
+ " variables: function () {\n" +
+ " return {\n" +
+ " 'foo': { type: 'Boolean', get_set: function (/** AppName */ inst, /** * */ v) {return v !== undefined ? inst.foo = v : inst.foo;}}\n" +
+ " };\n" +
+ " },\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 testFXIntDeclaration()
+ {
+ String code = "<basic:Application xmlns:fx=\"http://ns.adobe.com/mxml/2009\" xmlns:basic=\"library://ns.apache.org/royale/basic\">"
+ + "<fx:Declarations><fx:int id=\"foo\">2020</fx:int>"
+ + "</fx:Declarations><basic:initialView><basic:View><basic:DropDownList dataProvider=\"['Hello', 'World']\"/></basic:View></basic:initialView></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.core.View');\n" +
+ "goog.require('org.apache.royale.html.DropDownList');\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @constructor\n" +
+ " * @extends {org.apache.royale.core.Application}\n" +
+ " */\n" +
+ "AppName = function() {\n" +
+ " AppName.base(this, 'constructor');\n" +
+ " \n" +
+ " this.foo = 2020;\n" +
+ " /**\n" +
+ " * @private\n" +
+ " * @type {org.apache.royale.core.View}\n" +
+ " */\n" +
+ " this.$ID_8_1;\n" +
+ " \n" +
+ " /**\n" +
+ " * @private\n" +
+ " * @type {org.apache.royale.html.DropDownList}\n" +
+ " */\n" +
+ " this.$ID_8_0;\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" +
+ " 'initialView',\n" +
+ " false,\n" +
+ " [\n" +
+ " org.apache.royale.core.View,\n" +
+ " 1,\n" +
+ " '_id',\n" +
+ " true,\n" +
+ " '$ID_8_1',\n" +
+ " 0,\n" +
+ " 0,\n" +
+ " [\n" +
+ " org.apache.royale.html.DropDownList,\n" +
+ " 2,\n" +
+ " '_id',\n" +
+ " true,\n" +
+ " '$ID_8_0',\n" +
+ " 'dataProvider',\n" +
+ " true,\n" +
+ " ['Hello','World'],\n" +
+ " 0,\n" +
+ " 0,\n" +
+ " null\n" +
+ " ]\n" +
+ " ],\n" +
+ " 0,\n" +
+ " 0\n" +
+ " ]);\n" +
+ " \n" +
+ "};\n" +
+ "goog.inherits(AppName, org.apache.royale.core.Application);\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @export\n" +
+ " * @type {number}\n" +
+ " */\n" +
+ "AppName.prototype.foo;\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" +
+ " variables: function () {\n" +
+ " return {\n" +
+ " 'foo': { type: 'int', get_set: function (/** AppName */ inst, /** * */ v) {return v !== undefined ? inst.foo = v : inst.foo;}}\n" +
+ " };\n" +
+ " },\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 testFXArrayDeclaration()
{
String code = "<basic:Application xmlns:fx=\"http://ns.adobe.com/mxml/2009\" xmlns:basic=\"library://ns.apache.org/royale/basic\">"
@@ -1400,6 +1820,146 @@
}
@Test
+ public void testFXArrayOfObjectsDeclaration()
+ {
+ String code = "<basic:Application xmlns:fx=\"http://ns.adobe.com/mxml/2009\" xmlns:basic=\"library://ns.apache.org/royale/basic\">"
+ + "<fx:Declarations><fx:Array id=\"foo\"><fx:Object stringProp=\"A String\" intProp=\"2000\" numProp=\"20.19\" boolProp=\"true\"/><fx:Object stringProp=\"Another String\" intProp=\"2021\" numProp=\"20.21\" boolProp=\"false\"/></fx:Array>"
+ + "</fx:Declarations><basic:initialView><basic:View><basic:DropDownList dataProvider=\"['Hello', 'World']\"/></basic:View></basic:initialView></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.core.View');\n" +
+ "goog.require('org.apache.royale.html.DropDownList');\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @constructor\n" +
+ " * @extends {org.apache.royale.core.Application}\n" +
+ " */\n" +
+ "AppName = function() {\n" +
+ " AppName.base(this, 'constructor');\n" +
+ " \n" +
+ " this.foo = [{stringProp: 'A String', intProp: 2000, numProp: 20.19, boolProp: true}, {stringProp: 'Another String', intProp: 2021, numProp: 20.21, boolProp: false}];\n" +
+ " /**\n" +
+ " * @private\n" +
+ " * @type {org.apache.royale.core.View}\n" +
+ " */\n" +
+ " this.$ID_8_3;\n" +
+ " \n" +
+ " /**\n" +
+ " * @private\n" +
+ " * @type {org.apache.royale.html.DropDownList}\n" +
+ " */\n" +
+ " this.$ID_8_2;\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" +
+ " 'initialView',\n" +
+ " false,\n" +
+ " [\n" +
+ " org.apache.royale.core.View,\n" +
+ " 1,\n" +
+ " '_id',\n" +
+ " true,\n" +
+ " '$ID_8_3',\n" +
+ " 0,\n" +
+ " 0,\n" +
+ " [\n" +
+ " org.apache.royale.html.DropDownList,\n" +
+ " 2,\n" +
+ " '_id',\n" +
+ " true,\n" +
+ " '$ID_8_2',\n" +
+ " 'dataProvider',\n" +
+ " true,\n" +
+ " ['Hello','World'],\n" +
+ " 0,\n" +
+ " 0,\n" +
+ " null\n" +
+ " ]\n" +
+ " ],\n" +
+ " 0,\n" +
+ " 0\n" +
+ " ]);\n" +
+ " \n" +
+ "};\n" +
+ "goog.inherits(AppName, org.apache.royale.core.Application);\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @export\n" +
+ " * @type {Array}\n" +
+ " */\n" +
+ "AppName.prototype.foo;\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" +
+ " variables: function () {\n" +
+ " return {\n" +
+ " 'foo': { type: 'Array', get_set: function (/** AppName */ inst, /** * */ v) {return v !== undefined ? inst.foo = v : inst.foo;}}\n" +
+ " };\n" +
+ " },\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 testFXXMLDeclaration()
{
String code = "<basic:Application xmlns:fx=\"http://ns.adobe.com/mxml/2009\" xmlns:basic=\"library://ns.apache.org/royale/basic\">"