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
commit b6c05230ba98f8fff1f6dbe6525d568be4c2042a Author: Josh Tynjala <[email protected]> AuthorDate: Tue Jan 20 14:22:02 2026 -0800 AsIsEmitter: fix implicit cast to vector when using js-vector-emulation-class option --- .../compiler/internal/codegen/js/JSEmitter.java | 49 +++++++++++++++------- .../codegen/js/royale/TestRoyaleExpressions.java | 21 ++++++++++ 2 files changed, 56 insertions(+), 14 deletions(-) diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/JSEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/JSEmitter.java index 03dbe93a6..dffea52bc 100644 --- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/JSEmitter.java +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/JSEmitter.java @@ -896,25 +896,46 @@ public class JSEmitter extends ASEmitter implements IJSEmitter + ASEmitterTokens.PAREN_OPEN.getToken(); String coercionTypeString = formatQualifiedName(definition.getQualifiedName()); if (NativeUtils.isSyntheticJSType(coercionTypeString)) { - String synthCall; - String synthethicType; if (NativeUtils.isVector(coercionTypeString)) { - synthCall = formatQualifiedName(JSRoyaleEmitterTokens.LANGUAGE_QNAME.getToken()) - + ASEmitterTokens.MEMBER_ACCESS.getToken() - + JSRoyaleEmitterTokens.SYNTH_VECTOR.getToken(); - synthethicType = formatQualifiedName(coercionTypeString.substring(8, coercionTypeString.length() -1)); + String vectorEmulationClass = null; + if (project instanceof RoyaleJSProject) + { + RoyaleJSProject royaleProject = (RoyaleJSProject) project; + if (royaleProject.config != null) + { + vectorEmulationClass = royaleProject.config.getJsVectorEmulationClass(); + } + } + if (vectorEmulationClass != null) + { + coercionTypeString = vectorEmulationClass; + } + else + { + String synthCall = formatQualifiedName(JSRoyaleEmitterTokens.LANGUAGE_QNAME.getToken()) + + ASEmitterTokens.MEMBER_ACCESS.getToken() + + JSRoyaleEmitterTokens.SYNTH_VECTOR.getToken(); + String synthethicType = formatQualifiedName(coercionTypeString.substring(8, coercionTypeString.length() -1)); + coercionTypeString = synthCall + + ASEmitterTokens.PAREN_OPEN.getToken() + + ASEmitterTokens.SINGLE_QUOTE.getToken() + + synthethicType + + ASEmitterTokens.SINGLE_QUOTE.getToken() + + ASEmitterTokens.PAREN_CLOSE.getToken(); + } } else { - synthCall = formatQualifiedName(JSRoyaleEmitterTokens.LANGUAGE_QNAME.getToken()) + //non-vector, e.g. int/uint + String synthCall = formatQualifiedName(JSRoyaleEmitterTokens.LANGUAGE_QNAME.getToken()) + ASEmitterTokens.MEMBER_ACCESS.getToken() + JSRoyaleEmitterTokens.SYNTH_TYPE.getToken(); - synthethicType = coercionTypeString; + String synthethicType = coercionTypeString; + coercionTypeString = synthCall + + ASEmitterTokens.PAREN_OPEN.getToken() + + ASEmitterTokens.SINGLE_QUOTE.getToken() + + synthethicType + + ASEmitterTokens.SINGLE_QUOTE.getToken() + + ASEmitterTokens.PAREN_CLOSE.getToken(); } - coercionTypeString = synthCall - + ASEmitterTokens.PAREN_OPEN.getToken() - + ASEmitterTokens.SINGLE_QUOTE.getToken() - + synthethicType - + ASEmitterTokens.SINGLE_QUOTE.getToken() - + ASEmitterTokens.PAREN_CLOSE.getToken(); } coercionEnd = ASEmitterTokens.COMMA.getToken() diff --git a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleExpressions.java b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleExpressions.java index 8e7ebac11..4735b2008 100644 --- a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleExpressions.java +++ b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleExpressions.java @@ -1662,6 +1662,27 @@ public class TestRoyaleExpressions extends TestExpressions asBlockWalker.visitFunction(node); assertOut("/**\n * @royalesuppresscompleximplicitcoercion false\n * @param {Object} o\n * @return {number}\n */\nfoo.bar.B.prototype.b = function(o) {\n var /** @type {foo.bar.B} */ a = null;\n a = /* implicit cast */ org.apache.royale.utils.Language.as(org.apache.royale.utils.Language.as(o, this.memberVar), foo.bar.B, true);\n}"); } + + @Test + public void testVisitAsVectorImplicit() + { + IFunctionNode node = (IFunctionNode) getNode( + "public class B {public function b() { var a:*; var b:Vector.<String> = a; }}", + IFunctionNode.class, WRAP_LEVEL_PACKAGE); + asBlockWalker.visitFunction(node); + assertOut("/**\n */\nB.prototype.b = function() {\n var /** @type {*} */ a;\n var /** @type {Array.<string>} */ b = /* implicit cast */ org.apache.royale.utils.Language.as(a, org.apache.royale.utils.Language.synthVector('String'), true);\n}"); + } + + @Test + public void testVisitAsVectorImplicitEmulationClass() + { + project.config.setJsVectorEmulationClass(null, "CustomVector"); + IFunctionNode node = (IFunctionNode) getNode( + "public class B {public function b() { var a:*; var b:Vector.<String> = a; }}", + IFunctionNode.class, WRAP_LEVEL_PACKAGE); + asBlockWalker.visitFunction(node); + assertOut("/**\n */\nB.prototype.b = function() {\n var /** @type {*} */ a;\n var /** @type {CustomVector} */ b = /* implicit cast */ org.apache.royale.utils.Language.as(a, CustomVector, true);\n}"); + } @Test public void testVisitJSDoc()
