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 63cd0eaf2 BinaryOperatorEmitter, UnaryOperatorEmitter, 
DynamicAccessEmitter: followup to ensure matching closing parentheses for 
JSDynamicAccessOverride
63cd0eaf2 is described below

commit 63cd0eaf2d8b4fc5d909d0dc79c94bfc84181efb
Author: Josh Tynjala <[email protected]>
AuthorDate: Thu Aug 13 10:19:15 2026 -0700

    BinaryOperatorEmitter, UnaryOperatorEmitter, DynamicAccessEmitter: followup 
to ensure matching closing parentheses for JSDynamicAccessOverride
    
    Also added tests for parentheses to avoid future regressions.
    
    Followup to commit 308d8867b923c0edff4bf814fa89a175123dcf37
---
 .../codegen/js/jx/BinaryOperatorEmitter.java       |  4 ++
 .../codegen/js/jx/DynamicAccessEmitter.java        |  2 +
 .../codegen/js/jx/UnaryOperatorEmitter.java        |  2 +
 .../js/royale/TestRoyaleJSDynamicOverrides.java    | 72 ++++++++++++++++++++++
 4 files changed, 80 insertions(+)

diff --git 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
index 4e93c37d6..24bb4ba56 100644
--- 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
+++ 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
@@ -757,6 +757,8 @@ public class BinaryOperatorEmitter extends JSSubEmitter 
implements
                                        if (setMethod != null)
                                        {
                                                
emitAssignmentWithDynamicAccessOverride(node, dynamicAccessNode, setMethod, 
dynamicOverrideMeta);
+                                               if 
(ASNodeUtils.hasParenClose(node))
+                                                       
write(ASEmitterTokens.PAREN_CLOSE);
                                                return;
                                        }
                                }
@@ -772,6 +774,8 @@ public class BinaryOperatorEmitter extends JSSubEmitter 
implements
                                        if (inMethod != null)
                                        {
                                                
emitInWithDynamicAccessOverride(node, inMethod);
+                                               if 
(ASNodeUtils.hasParenClose(node))
+                                                       
write(ASEmitterTokens.PAREN_CLOSE);
                                                return;
                                        }
                                }
diff --git 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/DynamicAccessEmitter.java
 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/DynamicAccessEmitter.java
index 7fbac28f1..bd2b44d56 100644
--- 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/DynamicAccessEmitter.java
+++ 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/DynamicAccessEmitter.java
@@ -109,6 +109,8 @@ public class DynamicAccessEmitter extends JSSubEmitter 
implements
                                                
write(ASEmitterTokens.PAREN_OPEN);
                                                
getWalker().walk(rightOperandNode);
                                                
write(ASEmitterTokens.PAREN_CLOSE);
+                                               if 
(ASNodeUtils.hasParenClose(node))
+                                                       
write(ASEmitterTokens.PAREN_CLOSE);
                                                return;
                                        }
                                }
diff --git 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/UnaryOperatorEmitter.java
 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/UnaryOperatorEmitter.java
index 5a374c4c7..32bc81793 100644
--- 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/UnaryOperatorEmitter.java
+++ 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/UnaryOperatorEmitter.java
@@ -114,6 +114,8 @@ public class UnaryOperatorEmitter extends JSSubEmitter 
implements
                         // BEFORE: abc[xyz]++
                         // AFTER:  abc.set(xyz, abc.get(xyz) + 1)
                         emitAssignmentWithDynamicAccessOverride(node, 
dynamicAccessNode, getMethod, setMethod, dynamicOverrideMeta);
+                        if (ASNodeUtils.hasParenClose(node))
+                            write(ASEmitterTokens.PAREN_CLOSE);
                         return;
                     }
                 }
diff --git 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleJSDynamicOverrides.java
 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleJSDynamicOverrides.java
index d41965656..e9afb3ddb 100644
--- 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleJSDynamicOverrides.java
+++ 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleJSDynamicOverrides.java
@@ -47,6 +47,15 @@ public class TestRoyaleJSDynamicOverrides extends ASTestBase
         assertOut("/**\n * @constructor\n */\nA = function() {\n  var /** 
@type {*} */ a = this.get(0);\n};");
     }
     
+    @Test
+    public void testDynamicOverride_getMethod_parentheses()
+    {
+        IClassNode node = (IClassNode) 
getNode("[JSDynamicOverride(getMethod=\"get\")] class A { public function A() { 
var a = (this[0]); } }",
+                       IClassNode.class, WRAP_LEVEL_NONE);
+        asBlockWalker.visitClass(node);
+        assertOut("/**\n * @constructor\n */\nA = function() {\n  var /** 
@type {*} */ a = (this.get(0));\n};");
+    }
+    
     @Test
     public void testDynamicOverride_getMethod_subclass()
     {
@@ -74,6 +83,15 @@ public class TestRoyaleJSDynamicOverrides extends ASTestBase
         assertOut("/**\n * @constructor\n */\nA = function() {\n  this.set(0, 
123.4);\n};");
     }
     
+    @Test
+    public void testDynamicOverride_setMethod_parentheses()
+    {
+        IClassNode node = (IClassNode) 
getNode("[JSDynamicOverride(setMethod=\"set\")] class A { public function A() { 
(this[0] = 123.4); } }",
+                       IClassNode.class, WRAP_LEVEL_NONE);
+        asBlockWalker.visitClass(node);
+        assertOut("/**\n * @constructor\n */\nA = function() {\n  (this.set(0, 
123.4));\n};");
+    }
+    
     @Test
     public void testDynamicOverride_setMethod_reversedTrue()
     {
@@ -119,6 +137,15 @@ public class TestRoyaleJSDynamicOverrides extends 
ASTestBase
         assertOut("/**\n * @constructor\n */\nA = function() {\n  
this.del(0);\n};");
     }
     
+    @Test
+    public void testDynamicOverride_deleteMethod_parentheses()
+    {
+        IClassNode node = (IClassNode) 
getNode("[JSDynamicOverride(deleteMethod=\"del\")] class A { public function 
A() { (delete this[0]); } }",
+                       IClassNode.class, WRAP_LEVEL_NONE);
+        asBlockWalker.visitClass(node);
+        assertOut("/**\n * @constructor\n */\nA = function() {\n  
(this.del(0));\n};");
+    }
+    
     @Test
     public void testDynamicOverride_deleteMethod_subclass()
     {
@@ -146,6 +173,15 @@ public class TestRoyaleJSDynamicOverrides extends 
ASTestBase
         assertOut("/**\n * @constructor\n */\nA = function() {\n  
this.exists(0);\n};");
     }
     
+    @Test
+    public void testDynamicOverride_inMethod_parentheses()
+    {
+        IClassNode node = (IClassNode) 
getNode("[JSDynamicOverride(inMethod=\"exists\")] class A { public function A() 
{ (0 in this); } }",
+                       IClassNode.class, WRAP_LEVEL_NONE);
+        asBlockWalker.visitClass(node);
+        assertOut("/**\n * @constructor\n */\nA = function() {\n  
(this.exists(0));\n};");
+    }
+    
     @Test
     public void testDynamicOverride_inMethod_subclass()
     {
@@ -163,6 +199,42 @@ public class TestRoyaleJSDynamicOverrides extends 
ASTestBase
         asBlockWalker.visitClass(node);
         assertOut("/**\n * @constructor\n * @implements {A}\n */\nB = 
function() {\n  this.exists(0);\n};");
     }
+    
+    @Test
+    public void testDynamicOverride_getMethod_setMethod_postIncrement()
+    {
+        IClassNode node = (IClassNode) 
getNode("[JSDynamicOverride(getMethod=\"get\",setMethod=\"set\")] class A { 
public function A() { this[0]++; } }",
+                       IClassNode.class, WRAP_LEVEL_NONE);
+        asBlockWalker.visitClass(node);
+        assertOut("/**\n * @constructor\n */\nA = function() {\n  this.set(0, 
this.get(0) + 1);\n};");
+    }
+    
+    @Test
+    public void 
testDynamicOverride_getMethod_setMethod_postIncrement_parentheses()
+    {
+        IClassNode node = (IClassNode) 
getNode("[JSDynamicOverride(getMethod=\"get\",setMethod=\"set\")] class A { 
public function A() { (this[0]++); } }",
+                       IClassNode.class, WRAP_LEVEL_NONE);
+        asBlockWalker.visitClass(node);
+        assertOut("/**\n * @constructor\n */\nA = function() {\n  (this.set(0, 
this.get(0) + 1));\n};");
+    }
+    
+    @Test
+    public void testDynamicOverride_getMethod_setMethod_postDecrement()
+    {
+        IClassNode node = (IClassNode) 
getNode("[JSDynamicOverride(getMethod=\"get\",setMethod=\"set\")] class A { 
public function A() { this[0]--; } }",
+                       IClassNode.class, WRAP_LEVEL_NONE);
+        asBlockWalker.visitClass(node);
+        assertOut("/**\n * @constructor\n */\nA = function() {\n  this.set(0, 
this.get(0) - 1);\n};");
+    }
+    
+    @Test
+    public void 
testDynamicOverride_getMethod_setMethod_postDecrement_parentheses()
+    {
+        IClassNode node = (IClassNode) 
getNode("[JSDynamicOverride(getMethod=\"get\",setMethod=\"set\")] class A { 
public function A() { (this[0]--); } }",
+                       IClassNode.class, WRAP_LEVEL_NONE);
+        asBlockWalker.visitClass(node);
+        assertOut("/**\n * @constructor\n */\nA = function() {\n  (this.set(0, 
this.get(0) - 1));\n};");
+    }
 
     @Override
     protected IBackend createBackend()

Reply via email to