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()

Reply via email to