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/08/11 22:15:53 UTC

(royale-compiler) branch develop updated: UnaryOperatorEmitter: followup to adding new JSDynamicAccess metadata to also support ++ and -- operators

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 b939a18ed UnaryOperatorEmitter: followup to adding new JSDynamicAccess metadata to also support ++ and -- operators
b939a18ed is described below

commit b939a18ed7d101a505eda9c1aba5ec7b746d63d2
Author: Josh Tynjala <jo...@apache.org>
AuthorDate: Tue Aug 11 15:06:32 2026 -0700

    UnaryOperatorEmitter: followup to adding new JSDynamicAccess metadata to also support ++ and -- operators
    
    Followup to commit 308d8867b923c0edff4bf814fa89a175123dcf37
---
 .../codegen/js/jx/UnaryOperatorEmitter.java        | 71 ++++++++++++++++++++++
 1 file changed, 71 insertions(+)

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 5b0171ded..8de4c800c 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
@@ -31,6 +31,7 @@ import org.apache.royale.compiler.internal.codegen.js.royale.JSRoyaleEmitterToke
 import org.apache.royale.compiler.internal.definitions.AppliedVectorDefinition;
 import org.apache.royale.compiler.internal.projects.RoyaleJSProject;
 import org.apache.royale.compiler.internal.tree.as.*;
+import org.apache.royale.compiler.tree.as.IOperatorNode.OperatorType;
 import org.apache.royale.compiler.tree.ASTNodeID;
 import org.apache.royale.compiler.tree.as.IDynamicAccessNode;
 import org.apache.royale.compiler.tree.as.IExpressionNode;
@@ -88,6 +89,76 @@ public class UnaryOperatorEmitter extends JSSubEmitter implements
             ((MemberAccessExpressionNode) node.getOperandNode()).setLeftOperandNode(patchedVectorReference);
         }
 
+        if (isAssignment && node.getOperandNode() instanceof IDynamicAccessNode)
+        {
+            IDynamicAccessNode dynamicAccessNode = (IDynamicAccessNode) node.getOperandNode();
+            IExpressionNode leftOperandNode = dynamicAccessNode.getLeftOperandNode();
+            ITypeDefinition leftType = leftOperandNode.resolveType(getProject());
+            if (leftType != null)
+            {
+                IMetaTag dynamicOverrideMeta = null;
+                for (ITypeDefinition currentType : leftType.typeIteratable(getProject(), false))
+                {
+                    dynamicOverrideMeta = currentType.getMetaTagByName(IJSMetaAttributeConstants.ATTRIBUTE_DYNAMIC_OVERRIDE);
+                    if (dynamicOverrideMeta != null)
+                    {
+                        break;
+                    }
+                }
+                if (dynamicOverrideMeta != null)
+                {
+                    String getMethod = dynamicOverrideMeta.getAttributeValue(IJSMetaAttributeConstants.NAME_DYNAMIC_OVERRIDE_GET_METHOD);
+                    String setMethod = dynamicOverrideMeta.getAttributeValue(IJSMetaAttributeConstants.NAME_DYNAMIC_OVERRIDE_SET_METHOD);
+                    if (getMethod != null && setMethod != null)
+                    {
+                        // BEFORE: abc[xyz]++
+                        // AFTER:  abc.set(xyz, abc.get(xyz) + 1)
+
+                        getWalker().walk(dynamicAccessNode.getLeftOperandNode());
+                        startMapping(node);
+                        write(ASEmitterTokens.MEMBER_ACCESS);
+                        write(setMethod);
+                        write(ASEmitterTokens.PAREN_OPEN);
+                        endMapping(node);
+                        getWalker().walk(dynamicAccessNode.getRightOperandNode());
+                        writeToken(ASEmitterTokens.COMMA);
+
+                        getWalker().walk(dynamicAccessNode.getLeftOperandNode());
+                        startMapping(node);
+                        write(ASEmitterTokens.MEMBER_ACCESS);
+                        write(getMethod);
+                        write(ASEmitterTokens.PAREN_OPEN);
+                        endMapping(node);
+                        getWalker().walk(dynamicAccessNode.getRightOperandNode());
+                        startMapping(node);
+                        write(ASEmitterTokens.PAREN_CLOSE);
+                        endMapping(node);
+                        startMapping(node, dynamicAccessNode);
+                        if (node.getNodeID() == ASTNodeID.Op_PreIncrID
+                                || node.getNodeID() == ASTNodeID.Op_PostIncrID)
+                        {
+                            write(ASEmitterTokens.SPACE);
+                            write(OperatorType.PLUS.getOperatorText());
+                            write(ASEmitterTokens.SPACE);
+                            write("1");
+                        }
+                        else // decrement
+                        {
+                            write(ASEmitterTokens.SPACE);
+                            write(OperatorType.MINUS.getOperatorText());
+                            write(ASEmitterTokens.SPACE);
+                            write("1");
+                        }
+                        endMapping(node);
+                        startMapping(node);
+                        write(ASEmitterTokens.PAREN_CLOSE);
+                        endMapping(node);
+                        return;
+                    }
+                }
+            }
+        }
+
         if (node.getNodeID() == ASTNodeID.Op_PreIncrID
                 || node.getNodeID() == ASTNodeID.Op_PreDecrID
                 || node.getNodeID() == ASTNodeID.Op_BitwiseNotID