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 0118c36  JSRoyaleEmitter: fixed issue where name of private method 
passed to Language.closure() was incorrectly changed (closes #105)
0118c36 is described below

commit 0118c36ffb63b1c8807577d76bc95acb1d02a2ba
Author: Josh Tynjala <[email protected]>
AuthorDate: Wed Feb 19 15:04:32 2020 -0800

    JSRoyaleEmitter: fixed issue where name of private method passed to 
Language.closure() was incorrectly changed (closes #105)
---
 .../codegen/js/royale/JSRoyaleEmitter.java         | 50 ++++++++++++++++------
 .../codegen/js/royale/TestRoyaleExpressions.java   | 11 +++++
 2 files changed, 47 insertions(+), 14 deletions(-)

diff --git 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleEmitter.java
 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleEmitter.java
index d73dfac..6e9d7ed 100644
--- 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleEmitter.java
+++ 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleEmitter.java
@@ -38,6 +38,7 @@ import 
org.apache.royale.compiler.definitions.IClassDefinition;
 import org.apache.royale.compiler.definitions.IDefinition;
 import org.apache.royale.compiler.definitions.INamespaceDefinition;
 import org.apache.royale.compiler.definitions.IPackageDefinition;
+import org.apache.royale.compiler.definitions.IParameterDefinition;
 import org.apache.royale.compiler.definitions.ITypeDefinition;
 import org.apache.royale.compiler.definitions.IVariableDefinition;
 import org.apache.royale.compiler.definitions.metadata.IMetaTagAttribute;
@@ -1147,21 +1148,40 @@ public class JSRoyaleEmitter extends JSGoogEmitter 
implements IJSRoyaleEmitter
         if (getDocEmitter() instanceof JSRoyaleDocEmitter && 
((JSRoyaleDocEmitter) getDocEmitter()).getSuppressClosure()) return;
        write(ASEmitterTokens.COMMA);
        write(ASEmitterTokens.SPACE);
-       write(ASEmitterTokens.SINGLE_QUOTE);
+        write(ASEmitterTokens.SINGLE_QUOTE);
+        
+        IIdentifierNode identifierNode = null;
        if (node.getNodeID() == ASTNodeID.IdentifierID)
        {
-               if (nodeDef instanceof FunctionDefinition &&
+            identifierNode = (IIdentifierNode) node;
+       }
+        else if (node.getNodeID() == ASTNodeID.MemberAccessExpressionID)
+        {
+            identifierNode = getChainedIdentifierNode(node);
+        }
+        if (identifierNode == null)
+        {
+            System.out.println("unexpected node in emitClosureEnd");
+        }
+        else
+        {
+            if (!node.equals(identifierNode))
+            {
+                nodeDef = identifierNode.resolve(getWalker().getProject());
+            }
+
+            if (nodeDef instanceof FunctionDefinition &&
                                isCustomNamespace((FunctionDefinition)nodeDef))
                {
                String ns = 
((INamespaceResolvedReference)((FunctionDefinition)nodeDef).getNamespaceReference()).resolveAETNamespace(getWalker().getProject()).getName();
                write(ns + "::");
-               }
-               write(nodeDef.getBaseName());
-       }
-       else if (node.getNodeID() == ASTNodeID.MemberAccessExpressionID)
-               writeChainName(node);
-       else
-               System.out.println("unexpected node in emitClosureEnd");
+            }
+
+            String qname = nodeDef.getBaseName();
+            if (nodeDef != null && !nodeDef.isStatic() && (!(nodeDef 
instanceof IParameterDefinition)) && nodeDef.isPrivate() && 
getWalker().getProject().getAllowPrivateNameConflicts())
+                qname = 
formatPrivateName(nodeDef.getParent().getQualifiedName(), qname);
+               write(qname);
+        }
        write(ASEmitterTokens.SINGLE_QUOTE);
         write(ASEmitterTokens.PAREN_CLOSE);
     }
@@ -1183,16 +1203,18 @@ public class JSRoyaleEmitter extends JSGoogEmitter 
implements IJSRoyaleEmitter
        }
        super.emitStatement(node);
     }
-    private void writeChainName(IASNode node)
+
+    private IIdentifierNode getChainedIdentifierNode(IASNode node)
     {
        while (node.getNodeID() == ASTNodeID.MemberAccessExpressionID)
        {
                node = 
((IMemberAccessExpressionNode)node).getRightOperandNode();
        }
-       if (node.getNodeID() == ASTNodeID.IdentifierID)
-               write(((IdentifierNode)node).getName());
-       else
-               System.out.println("unexpected node in emitClosureEnd");
+        if (node.getNodeID() == ASTNodeID.IdentifierID)
+        {
+            return (IIdentifierNode) node;
+        }
+        return null;
     }
 
     @Override
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 22c05ae..2999843 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
@@ -1343,6 +1343,17 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
         asBlockWalker.visitFunction(node);
         assertOut("/**\n * @export\n */\nfoo.bar.B.prototype.b = function() 
{\n  goog.bind(org.apache.royale.utils.Language.closure(this.b, this, 'b'), 
this);\n}");
     }
+    
+    @Test
+    public void testFunctionCallFullyQualifiedPrivate()
+    {
+        project.setAllowPrivateNameConflicts(true);
+        IFunctionNode node = (IFunctionNode) getNode(
+                "import goog.bind; public class B {private function b() { 
goog.bind(b, this); }}",
+                IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
+        asBlockWalker.visitFunction(node);
+        assertOut("/**\n * @private\n */\nfoo.bar.B.prototype.foo_bar_B_b = 
function() {\n  
goog.bind(org.apache.royale.utils.Language.closure(this.foo_bar_B_b, this, 
'foo_bar_B_b'), this);\n}");
+    }
 
     @Test
     public void testFunctionCallCustomNamespace()

Reply via email to