This is an automated email from the ASF dual-hosted git repository.

gregdove 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 dd13c42  (JX) Fix for various code output scenarios that can be 
missing closing parenthesis. Closes #198
dd13c42 is described below

commit dd13c421a196497be327453a083e643df19c971a
Author: greg-dove <[email protected]>
AuthorDate: Mon Nov 29 12:41:33 2021 +1300

    (JX) Fix for various code output scenarios that can be missing closing 
parenthesis. Closes #198
---
 .../codegen/js/jx/DynamicAccessEmitter.java        | 21 ++++++++++++---
 .../codegen/js/jx/MemberAccessEmitter.java         |  4 +++
 .../codegen/js/royale/TestRoyaleExpressions.java   | 30 ++++++++++++++--------
 3 files changed, 42 insertions(+), 13 deletions(-)

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 878b69a..fb5b1cb 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
@@ -42,6 +42,7 @@ import org.apache.royale.compiler.tree.as.IDynamicAccessNode;
 import org.apache.royale.compiler.tree.as.IExpressionNode;
 import org.apache.royale.compiler.tree.as.ILiteralNode;
 import org.apache.royale.compiler.tree.as.IOperatorNode.OperatorType;
+import org.apache.royale.compiler.utils.ASNodeUtils;
 import org.apache.royale.compiler.utils.NativeUtils;
 
 public class DynamicAccessEmitter extends JSSubEmitter implements
@@ -55,6 +56,9 @@ public class DynamicAccessEmitter extends JSSubEmitter 
implements
     @Override
     public void emit(IDynamicAccessNode node)
     {
+               if (ASNodeUtils.hasParenOpen(node))
+                       write(ASEmitterTokens.PAREN_OPEN);
+
         IExpressionNode leftOperandNode = node.getLeftOperandNode();
         getWalker().walk(leftOperandNode);
         if (leftOperandNode.getNodeID() == ASTNodeID.Op_AtID)
@@ -86,6 +90,8 @@ public class DynamicAccessEmitter extends JSSubEmitter 
implements
                                        write(".child('' +");
                                                
getWalker().walk(rightOperandNode);
                                        write(")");
+                                       if (ASNodeUtils.hasParenClose(node))
+                                               
write(ASEmitterTokens.PAREN_CLOSE);
                                        return;
                                }
                                if (type.isInstanceOf("String", getProject()))
@@ -98,24 +104,30 @@ public class DynamicAccessEmitter extends JSSubEmitter 
implements
                                        }
                                        else
                                                write(".child(" + field + ")");
+                                       if (ASNodeUtils.hasParenClose(node))
+                                               
write(ASEmitterTokens.PAREN_CLOSE);
                                        return;
                                }
                                else if (type.isInstanceOf("QName", 
getProject()))
                                {
                                        String field = 
fjs.stringifyNode(rightOperandNode);                                     
                                        write(".child(" + field + ")");
+                                       if (ASNodeUtils.hasParenClose(node))
+                                               
write(ASEmitterTokens.PAREN_CLOSE);
                                        return;
                                }
                }
                else if (isProxy)
                {
-                       boolean isLiteral = rightOperandNode instanceof 
ILiteralNode;
+                       boolean isNonStringLiteral = rightOperandNode 
instanceof ILiteralNode && ((ILiteralNode) rightOperandNode).getLiteralType() 
!= ILiteralNode.LiteralType.STRING;
                        write(".getProperty(");
-                       if (isLiteral) write("'");
+                       if (isNonStringLiteral) write("'");
                        String s = fjs.stringifyNode(rightOperandNode);
                        write(s);
-                       if (isLiteral) write("'");
+                       if (isNonStringLiteral) write("'");
                        write(")");
+                               if (ASNodeUtils.hasParenClose(node))
+                                       write(ASEmitterTokens.PAREN_CLOSE);
                        return;
                }
        }
@@ -174,5 +186,8 @@ public class DynamicAccessEmitter extends JSSubEmitter 
implements
         startMapping(node, rightOperandNode);
         write(ASEmitterTokens.SQUARE_CLOSE);
         endMapping(node);
+
+               if (ASNodeUtils.hasParenClose(node))
+                       write(ASEmitterTokens.PAREN_CLOSE);
     }
 }
diff --git 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
index 19c57db..2137004 100644
--- 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
+++ 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
@@ -83,6 +83,8 @@ public class MemberAccessEmitter extends JSSubEmitter 
implements
             write(propGetter.getFunctionName());
             write(ASEmitterTokens.PAREN_OPEN);
             write(ASEmitterTokens.PAREN_CLOSE);
+                       if (ASNodeUtils.hasParenClose(node))
+                               write(ASEmitterTokens.PAREN_CLOSE);
                return;
         }
         IDefinition def = node.resolve(getProject());
@@ -253,6 +255,8 @@ public class MemberAccessEmitter extends JSSubEmitter 
implements
                                                write(s);
                                                write(closeMethodCall);
                                        }
+                                       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/TestRoyaleExpressions.java
 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleExpressions.java
index 8f7ba31..388c1ec 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
@@ -30,16 +30,7 @@ import 
org.apache.royale.compiler.internal.projects.RoyaleJSProject;
 import org.apache.royale.compiler.internal.tree.as.ClassNode;
 import org.apache.royale.compiler.internal.tree.as.LiteralNode;
 import org.apache.royale.compiler.internal.tree.as.NodeBase;
-import org.apache.royale.compiler.tree.as.IBinaryOperatorNode;
-import org.apache.royale.compiler.tree.as.IClassNode;
-import org.apache.royale.compiler.tree.as.IDynamicAccessNode;
-import org.apache.royale.compiler.tree.as.IFileNode;
-import org.apache.royale.compiler.tree.as.IFunctionCallNode;
-import org.apache.royale.compiler.tree.as.IFunctionNode;
-import org.apache.royale.compiler.tree.as.IMemberAccessExpressionNode;
-import org.apache.royale.compiler.tree.as.INamespaceAccessExpressionNode;
-import org.apache.royale.compiler.tree.as.IReturnNode;
-import org.apache.royale.compiler.tree.as.IVariableNode;
+import org.apache.royale.compiler.tree.as.*;
 import org.junit.Ignore;
 import org.junit.Test;
 
@@ -53,6 +44,7 @@ public class TestRoyaleExpressions extends TestGoogExpressions
     {
         backend = createBackend();
         project = new RoyaleJSProject(workspace, backend);
+        project.setProxyBaseClass("custom.TestProxy");
         workspace.setASDocDelegate(new RoyaleASDocDelegate());
        JSGoogConfiguration config = new JSGoogConfiguration();
        try {
@@ -2191,6 +2183,24 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
         assertOut("foo.bar.RoyaleTest_A.prototype.foo = function() {\n  
this.http_$$ns_apache_org$2017$custom$namespace__b;\n}");
     }
 
+     @Test
+     public void testSpecialMemberAccessWithEnclosingParentheses()
+     {
+         IUnaryOperatorNode node = (IUnaryOperatorNode) getNode(
+                 "public class TestDateNegate { public function 
TestDateNegate() { var d:Date = new Date();var n:Number = -(d.date); } }", 
IUnaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
+         asBlockWalker.visitUnaryOperator(node);
+         assertOut("-(d.getDate())");
+     }
+
+     @Test
+     public void testProxyMemberAccessWithEnclosingParentheses()
+     { //also with dynamic string literal access and implicit int coercion
+         IVariableNode node = (IVariableNode) getNode(
+                 "import custom.TestProxy; public class TestProxyMemberNegate 
{ public function TestProxyMemberNegate() { var p:TestProxy = new 
TestProxy();var n:int = -(p['something']); } }", IUnaryOperatorNode.class, 
WRAP_LEVEL_PACKAGE).getParent();
+         asBlockWalker.visitVariable(node);
+         assertOut("var /** @type {number} */ n = 
(-(p.getProperty('something'))) >> 0");
+     }
+
     protected IBackend createBackend()
     {
         return new RoyaleBackend();

Reply via email to