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 2019/02/20 23:26:36 UTC

[royale-compiler] 02/02: compiler-jx: moved one use Language.closure() to the same place as another because they both should be there

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

commit 06ba69dbe0c198422db72b5b5eea71c022143c66
Author: Josh Tynjala <jo...@apache.org>
AuthorDate: Wed Feb 20 15:26:23 2019 -0800

    compiler-jx: moved one use Language.closure() to the same place as another because they both should be there
---
 .../internal/codegen/js/goog/JSGoogEmitter.java    | 17 +-----------
 .../codegen/js/jx/MemberAccessEmitter.java         | 32 ++++++++++++++++++++++
 2 files changed, 33 insertions(+), 16 deletions(-)

diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/goog/JSGoogEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/goog/JSGoogEmitter.java
index 341c9c7..693c476 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/goog/JSGoogEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/goog/JSGoogEmitter.java
@@ -957,22 +957,7 @@ public class JSGoogEmitter extends JSEmitter implements IJSGoogEmitter
         }
         else
         {
-            // AJH need Language.bind here and maybe not require
-            // that the node is a MemberAccessExpression
-            if (definition instanceof FunctionDefinition &&
-                    !((FunctionDefinition)definition).isStatic() &&
-                    (!(definition instanceof AccessorDefinition)) &&
-                    node instanceof MemberAccessExpressionNode &&
-                    ((MemberAccessExpressionNode)node).getLeftOperandNode().getNodeID() != ASTNodeID.SuperID)
-            {
-                emitClosureStart();
-                getWalker().walk(node);
-                writeToken(ASEmitterTokens.COMMA);
-                getWalker().walk(((MemberAccessExpressionNode)node).getLeftOperandNode());
-                emitClosureEnd(((MemberAccessExpressionNode)node).getLeftOperandNode(), definition);
-            }
-            else
-                getWalker().walk(node);
+            getWalker().walk(node);
         }
     }
 
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 009e783..23e5ec0 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
@@ -216,6 +216,27 @@ public class MemberAccessEmitter extends JSSubEmitter implements
 		}
     	else if (rightNode instanceof NamespaceAccessExpressionNode)
     	{
+			boolean isStatic = false;
+			if (def != null && def.isStatic())
+				isStatic = true;
+			boolean needClosure = false;
+			if (def instanceof FunctionDefinition && (!(def instanceof AccessorDefinition))
+					&& !def.getBaseName().equals("constructor")) // don't wrap references to obj.constructor
+			{
+				IASNode parentNode = node.getParent();
+				if (parentNode != null)
+				{
+					ASTNodeID parentNodeId = parentNode.getNodeID();
+					// we need a closure if this MAE is the top-level in a chain
+					// of MAE and not in a function call.
+					needClosure = !isStatic && parentNodeId != ASTNodeID.FunctionCallID &&
+								parentNodeId != ASTNodeID.MemberAccessExpressionID &&
+								parentNodeId != ASTNodeID.ArrayIndexExpressionID;
+				}
+			}
+        	if (needClosure)
+        		getEmitter().emitClosureStart();
+
     		NamespaceAccessExpressionNode naen = (NamespaceAccessExpressionNode)rightNode;
     		IDefinition d = naen.getLeftOperandNode().resolve(getProject());
     		IdentifierNode r = (IdentifierNode)(naen.getRightOperandNode());
@@ -243,6 +264,17 @@ public class MemberAccessEmitter extends JSSubEmitter implements
                 write(node.getOperator().getOperatorText());
 	    		write(r.getName());    			
     		}
+        
+			if (needClosure)
+			{
+				write(ASEmitterTokens.COMMA);
+				write(ASEmitterTokens.SPACE);
+				if (leftNode.getNodeID() == ASTNodeID.SuperID)
+					write(ASEmitterTokens.THIS);
+				else
+					writeLeftSide(node, leftNode, rightNode);
+				getEmitter().emitClosureEnd(leftNode, def);
+			}
     		return;
     	}
         boolean isCustomNamespace = false;