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