This is an automated email from the ASF dual-hosted git repository.
joshtynjala 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 b533c38 PackageFooterEmitter: added missing ROYALE_REFLECTION_INFO
for file-internal classes
b533c38 is described below
commit b533c389d9335ce1a17b2fd1241dc1e5e6016bda
Author: Josh Tynjala <[email protected]>
AuthorDate: Wed May 22 14:04:27 2019 -0700
PackageFooterEmitter: added missing ROYALE_REFLECTION_INFO for
file-internal classes
Fixes issue where describeType() could not be used on file-internal classes
because the reflection info was missing
---
.../codegen/js/jx/PackageFooterEmitter.java | 19 ++-
.../codegen/js/royale/TestRoyalePackage.java | 156 ++++++++++++++++++++-
.../royale/projects/internal/MainClass_result.js | 29 ++++
3 files changed, 188 insertions(+), 16 deletions(-)
diff --git
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/PackageFooterEmitter.java
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/PackageFooterEmitter.java
index fec56eb..7c151ac 100644
---
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/PackageFooterEmitter.java
+++
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/PackageFooterEmitter.java
@@ -80,7 +80,6 @@ public class PackageFooterEmitter extends JSSubEmitter
implements
{
boolean isInterface = tnode instanceof IInterfaceNode;
boolean isDynamic = tnode instanceof IClassNode &&
tnode.hasModifier(ASModifier.DYNAMIC);
- boolean isInternalClass = !isInterface && tnode instanceof
IClassNode && getEmitter().getModel().isInternalClass(tnode.getQualifiedName());
/*
* Metadata
*
@@ -199,17 +198,15 @@ public class PackageFooterEmitter extends JSSubEmitter
implements
String typeName =
getEmitter().formatQualifiedName(tnode.getQualifiedName());
- if (!isInternalClass) {
- emitReflectionData(
- typeName,
- reflectionKind,
- varData,
- accessorData,
- methodData,
- metadata);
- }
+ emitReflectionData(
+ typeName,
+ reflectionKind,
+ varData,
+ accessorData,
+ methodData,
+ metadata);
- if (!isInterface && !isInternalClass) {
+ if (!isInterface) {
emitReflectionRegisterInitialStaticFields(typeName,
(ClassDefinition) tnode.getDefinition());
}
diff --git
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyalePackage.java
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyalePackage.java
index 488954a..2d9166c 100644
---
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyalePackage.java
+++
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyalePackage.java
@@ -531,7 +531,32 @@ public class TestRoyalePackage extends TestGoogPackage
" *\n" +
" * @type {Object.<string, Array.<Object>>}\n" +
" */\n" +
-
"foo.bar.baz.A.InternalClass.prototype.ROYALE_CLASS_INFO = { names: [{ name:
'InternalClass', qName: 'foo.bar.baz.A.InternalClass', kind: 'class' }] };"
+
"foo.bar.baz.A.InternalClass.prototype.ROYALE_CLASS_INFO = { names: [{ name:
'InternalClass', qName: 'foo.bar.baz.A.InternalClass', kind: 'class' }] };\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Reflection\n" +
+ " *\n" +
+ " * @return {Object.<string, Function>}\n" +
+ " */\n" +
+
"foo.bar.baz.A.InternalClass.prototype.ROYALE_REFLECTION_INFO = function ()
{\n" +
+ " return {\n" +
+ " variables: function () {return {};},\n" +
+ " accessors: function () {return {};},\n" +
+ " methods: function () {\n" +
+ " return {\n" +
+ " 'InternalClass': { type: '',
declaredBy: 'foo.bar.baz.A.InternalClass'}\n" +
+ " };\n" +
+ " }\n" +
+ " };\n" +
+ "};\n" +
+ "/**\n" +
+ " * @export\n" +
+ " * @const\n" +
+ " * @type {number}\n" +
+ " */\n" +
+
"foo.bar.baz.A.InternalClass.prototype.ROYALE_REFLECTION_INFO.compileFlags =
15;\n"
);
}
@@ -815,7 +840,45 @@ public class TestRoyalePackage extends TestGoogPackage
" *\n" +
" * @type {Object.<string, Array.<Object>>}\n" +
" */\n" +
-
"foo.bar.baz.A.InternalClass.prototype.ROYALE_CLASS_INFO = { names: [{ name:
'InternalClass', qName: 'foo.bar.baz.A.InternalClass', kind: 'class' }] };"
+
"foo.bar.baz.A.InternalClass.prototype.ROYALE_CLASS_INFO = { names: [{ name:
'InternalClass', qName: 'foo.bar.baz.A.InternalClass', kind: 'class' }] };\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Reflection\n" +
+ " *\n" +
+ " * @return {Object.<string, Function>}\n" +
+ " */\n" +
+
"foo.bar.baz.A.InternalClass.prototype.ROYALE_REFLECTION_INFO = function ()
{\n" +
+ " return {\n" +
+ " variables: function () {\n" +
+ " return {\n" +
+ " '|someString': { type: 'String',
get_set: function (/** * */ v) {return v !== undefined ?
foo.bar.baz.A.InternalClass.someString = v :
foo.bar.baz.A.InternalClass.someString;}}\n" +
+ " };\n" +
+ " },\n" +
+ " accessors: function () {return {};},\n" +
+ " methods: function () {\n" +
+ " return {\n" +
+ " 'InternalClass': { type: '',
declaredBy: 'foo.bar.baz.A.InternalClass'},\n" +
+ " '|someStaticFunction': { type:
'String', declaredBy: 'foo.bar.baz.A.InternalClass'},\n" +
+ " 'someMethod': { type: 'String',
declaredBy: 'foo.bar.baz.A.InternalClass'}\n" +
+ " };\n" +
+ " }\n" +
+ " };\n" +
+ "};\n" +
+ "/**\n" +
+ " * @export\n" +
+ " * @const\n" +
+ " * @type {number}\n" +
+ " */\n" +
+
"foo.bar.baz.A.InternalClass.prototype.ROYALE_REFLECTION_INFO.compileFlags =
15;\n" +
+ "/**\n" +
+ " * Provide reflection support for
distinguishing dynamic fields on class object (static)\n" +
+ " * @export\n" +
+ " * @const\n" +
+ " * @type {Array<string>}\n" +
+ " */\n" +
+
"foo.bar.baz.A.InternalClass.prototype.ROYALE_REFLECTION_INFO.statics =
Object.keys(foo.bar.baz.A.InternalClass);\n"
);
}
@@ -966,7 +1029,36 @@ public class TestRoyalePackage extends TestGoogPackage
" *\n" +
" * @type {Object.<string, Array.<Object>>}\n" +
" */\n" +
-
"foo.bar.baz.A.InternalClass.prototype.ROYALE_CLASS_INFO = { names: [{ name:
'InternalClass', qName: 'foo.bar.baz.A.InternalClass', kind: 'class' }] };"
+
"foo.bar.baz.A.InternalClass.prototype.ROYALE_CLASS_INFO = { names: [{ name:
'InternalClass', qName: 'foo.bar.baz.A.InternalClass', kind: 'class' }] };\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Reflection\n" +
+ " *\n" +
+ " * @return {Object.<string, Function>}\n" +
+ " */\n" +
+
"foo.bar.baz.A.InternalClass.prototype.ROYALE_REFLECTION_INFO = function ()
{\n" +
+ " return {\n" +
+ " variables: function () {return {};},\n" +
+ " accessors: function () {\n" +
+ " return {\n" +
+ " 'someString': { type: 'String',
access: 'readwrite', declaredBy: 'foo.bar.baz.A.InternalClass'}\n" +
+ " };\n" +
+ " },\n" +
+ " methods: function () {\n" +
+ " return {\n" +
+ " 'InternalClass': { type: '',
declaredBy: 'foo.bar.baz.A.InternalClass'}\n" +
+ " };\n" +
+ " }\n" +
+ " };\n" +
+ "};\n" +
+ "/**\n" +
+ " * @export\n" +
+ " * @const\n" +
+ " * @type {number}\n" +
+ " */\n" +
+
"foo.bar.baz.A.InternalClass.prototype.ROYALE_REFLECTION_INFO.compileFlags =
15;\n"
);
}
@@ -1126,7 +1218,33 @@ public class TestRoyalePackage extends TestGoogPackage
" *\n" +
" * @type {Object.<string, Array.<Object>>}\n" +
" */\n" +
-
"foo.bar.baz.A.InternalClass.prototype.ROYALE_CLASS_INFO = { names: [{ name:
'InternalClass', qName: 'foo.bar.baz.A.InternalClass', kind: 'class' }],
interfaces: [foo.bar.baz.A.ITestInterface] };"
+
"foo.bar.baz.A.InternalClass.prototype.ROYALE_CLASS_INFO = { names: [{ name:
'InternalClass', qName: 'foo.bar.baz.A.InternalClass', kind: 'class' }],
interfaces: [foo.bar.baz.A.ITestInterface] };\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Reflection\n" +
+ " *\n" +
+ " * @return {Object.<string, Function>}\n" +
+ " */\n" +
+
"foo.bar.baz.A.InternalClass.prototype.ROYALE_REFLECTION_INFO = function ()
{\n" +
+ " return {\n" +
+ " variables: function () {return {};},\n" +
+ " accessors: function () {return {};},\n" +
+ " methods: function () {\n" +
+ " return {\n" +
+ " 'InternalClass': { type: '',
declaredBy: 'foo.bar.baz.A.InternalClass'},\n" +
+ " 'test': { type: 'void', declaredBy:
'foo.bar.baz.A.InternalClass'}\n" +
+ " };\n" +
+ " }\n" +
+ " };\n" +
+ "};\n" +
+ "/**\n" +
+ " * @export\n" +
+ " * @const\n" +
+ " * @type {number}\n" +
+ " */\n" +
+
"foo.bar.baz.A.InternalClass.prototype.ROYALE_REFLECTION_INFO.compileFlags =
15;\n"
);
}
@@ -1189,7 +1307,35 @@ public class TestRoyalePackage extends TestGoogPackage
" *\n" +
" * @type {Object.<string, Array.<Object>>}\n" +
" */\n" +
- "foo.bar.A.Internal.prototype.ROYALE_CLASS_INFO
= { names: [{ name: 'Internal', qName: 'foo.bar.A.Internal', kind: 'class' }]
};"
+ "foo.bar.A.Internal.prototype.ROYALE_CLASS_INFO
= { names: [{ name: 'Internal', qName: 'foo.bar.A.Internal', kind: 'class' }]
};\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Reflection\n" +
+ " *\n" +
+ " * @return {Object.<string, Function>}\n" +
+ " */\n" +
+
"foo.bar.A.Internal.prototype.ROYALE_REFLECTION_INFO = function () {\n" +
+ " return {\n" +
+ " variables: function () {return {};},\n" +
+ " accessors: function () {return {};},\n" +
+ " methods: function () {return {};}\n" +
+ " };\n" +
+ "};\n" +
+ "/**\n" +
+ " * @export\n" +
+ " * @const\n" +
+ " * @type {number}\n" +
+ " */\n" +
+
"foo.bar.A.Internal.prototype.ROYALE_REFLECTION_INFO.compileFlags = 15;\n" +
+ "/**\n" +
+ " * Provide reflection support for
distinguishing dynamic fields on class object (static)\n" +
+ " * @export\n" +
+ " * @const\n" +
+ " * @type {Array<string>}\n" +
+ " */\n" +
+
"foo.bar.A.Internal.prototype.ROYALE_REFLECTION_INFO.statics =
Object.keys(foo.bar.A.Internal);\n"
);
}
diff --git
a/compiler-jx/src/test/resources/royale/projects/internal/MainClass_result.js
b/compiler-jx/src/test/resources/royale/projects/internal/MainClass_result.js
index f2bff9f..d403d5f 100644
---
a/compiler-jx/src/test/resources/royale/projects/internal/MainClass_result.js
+++
b/compiler-jx/src/test/resources/royale/projects/internal/MainClass_result.js
@@ -100,3 +100,32 @@ MainClass.InternalClass.prototype.foo = null;
* @type {Object.<string, Array.<Object>>}
*/
MainClass.InternalClass.prototype.ROYALE_CLASS_INFO = { names: [{ name:
'InternalClass', qName: 'MainClass.InternalClass', kind: 'class' }] };
+
+
+
+/**
+ * Reflection
+ *
+ * @return {Object.<string, Function>}
+ */
+MainClass.InternalClass.prototype.ROYALE_REFLECTION_INFO = function () {
+ return {
+ variables: function () {
+ return {
+ 'foo': { type: 'OtherClass', get_set: function (/**
MainClass.InternalClass */ inst, /** * */ v) {return v !== undefined ? inst.foo
= v : inst.foo;}}
+ };
+ },
+ accessors: function () {return {};},
+ methods: function () {
+ return {
+ 'InternalClass': { type: '', declaredBy: 'MainClass.InternalClass'}
+ };
+ }
+ };
+};
+/**
+ * @export
+ * @const
+ * @type {number}
+ */
+MainClass.InternalClass.prototype.ROYALE_REFLECTION_INFO.compileFlags = 9;
\ No newline at end of file