You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by jo...@apache.org on 2026/01/21 00:07:49 UTC
(royale-compiler) 02/04: AsIsEmitter: fix implicit cast to vector when using js-vector-emulation-class option
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 <jo...@apache.org>
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()