Repository: flex-falcon
Updated Branches:
  refs/heads/develop 148fa8b31 -> 263918bfe


try to fix XML handling


Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/263918bf
Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/263918bf
Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/263918bf

Branch: refs/heads/develop
Commit: 263918bfe12d8369523644f2c26d1f00fb8aab99
Parents: 148fa8b
Author: Alex Harui <[email protected]>
Authored: Mon Jul 11 22:56:04 2016 -0700
Committer: Alex Harui <[email protected]>
Committed: Mon Jul 11 22:56:04 2016 -0700

----------------------------------------------------------------------
 .../codegen/js/flexjs/JSFlexJSEmitter.java      | 33 ++++++++++++++++++--
 .../codegen/js/jx/MemberAccessEmitter.java      |  2 +-
 .../js/flexjs/TestFlexJSGlobalClasses.java      | 11 +++++++
 3 files changed, 43 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/263918bf/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
----------------------------------------------------------------------
diff --git 
a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
 
b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
index d34b224..2c06fef 100644
--- 
a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
+++ 
b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
@@ -893,6 +893,10 @@ public class JSFlexJSEmitter extends JSGoogEmitter 
implements IJSFlexJSEmitter
      * (see IdentiferNode.resolveType).
      * So, we have to walk the tree ourselves and resolve
      * individual pieces.
+     * We want to know not just whether the node is of type XML,
+     * but whether it is a property of a property of type XML.
+     * For example, this.foo might be XML or XMLList, but since
+     * 'this' isn't also XML, we return false.
      * @param obj
      * @return
      */
@@ -905,8 +909,21 @@ public class JSFlexJSEmitter extends JSGoogEmitter 
implements IJSFlexJSEmitter
                {
                        IDefinition rightDef = 
rightNode.resolveType(getWalker().getProject());
                        if (rightDef != null)
-                               return IdentifierNode.isXMLish(rightDef, 
getWalker().getProject());
+                       {
+                               if (IdentifierNode.isXMLish(rightDef, 
getWalker().getProject()))
+                               {
+                                       return isLeftNodeXMLish(leftNode);
+                               }
+                       }
+                       return isLeftNodeXMLish(leftNode);
                }
+               else if (rightID == ASTNodeID.Op_AtID)
+                       return true;
+               return false;
+    }
+    
+    public boolean isLeftNodeXMLish(IExpressionNode leftNode)
+    {
        ASTNodeID leftID = leftNode.getNodeID();
                if (leftID == ASTNodeID.IdentifierID)
                {
@@ -916,7 +933,19 @@ public class JSFlexJSEmitter extends JSGoogEmitter 
implements IJSFlexJSEmitter
                }
                else if (leftID == ASTNodeID.MemberAccessExpressionID)
                {
-                       return isXMLList((MemberAccessExpressionNode)leftNode);
+                       MemberAccessExpressionNode maen = 
(MemberAccessExpressionNode)leftNode;
+               IExpressionNode rightNode = maen.getRightOperandNode();
+               ASTNodeID rightID = rightNode.getNodeID();
+                       if (rightID == ASTNodeID.IdentifierID)
+                       {
+                               IDefinition rightDef = 
rightNode.resolveType(getWalker().getProject());
+                               if (rightDef != null)
+                               {
+                                       return 
IdentifierNode.isXMLish(rightDef, getWalker().getProject());
+                               }
+                       }
+                       leftNode = maen.getLeftOperandNode();
+                       return isLeftNodeXMLish(leftNode);
                }
                else if (leftID == ASTNodeID.FunctionCallID)
                {

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/263918bf/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
----------------------------------------------------------------------
diff --git 
a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
 
b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
index 7088431..f831b74 100644
--- 
a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
+++ 
b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
@@ -73,7 +73,7 @@ public class MemberAccessEmitter extends JSSubEmitter 
implements
                boolean isXML = false;
                boolean isProxy = false;
                if (leftNode instanceof MemberAccessExpressionNode)
-                       isXML = 
fjs.isXMLList((MemberAccessExpressionNode)leftNode);
+                       isXML = 
fjs.isLeftNodeXMLish((MemberAccessExpressionNode)leftNode);
                else if (leftNode instanceof IExpressionNode)
                        isXML = fjs.isXML((IExpressionNode)leftNode);
                if (leftNode instanceof MemberAccessExpressionNode)

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/263918bf/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
----------------------------------------------------------------------
diff --git 
a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
 
b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
index 07f72a3..3da2876 100644
--- 
a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
+++ 
b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
@@ -24,6 +24,7 @@ import 
org.apache.flex.compiler.internal.codegen.js.goog.TestGoogGlobalClasses;
 import org.apache.flex.compiler.internal.driver.js.flexjs.FlexJSBackend;
 import org.apache.flex.compiler.internal.driver.js.goog.JSGoogConfiguration;
 import org.apache.flex.compiler.internal.projects.FlexJSProject;
+import org.apache.flex.compiler.internal.tree.as.BinaryOperatorAssignmentNode;
 import org.apache.flex.compiler.internal.tree.as.VariableNode;
 import org.apache.flex.compiler.tree.as.IASNode;
 import org.apache.flex.compiler.tree.as.IBinaryOperatorNode;
@@ -573,6 +574,16 @@ public class TestFlexJSGlobalClasses extends 
TestGoogGlobalClasses
     }
     
     @Test
+    public void testXMLSetChildToObjectMember()
+    {
+       BinaryOperatorAssignmentNode node = (BinaryOperatorAssignmentNode) 
getNode(
+                "public class B {public var someProp:XML; public function B() 
{ var a:XML; var b:B; b.someProp = a.child; }}",
+                BinaryOperatorAssignmentNode.class, WRAP_LEVEL_PACKAGE, true);
+        asBlockWalker.visitBinaryOperator(node);
+        assertOut("b.someProp = a.child('child')");
+    }
+    
+    @Test
     public void testXMLListConcat()
     {
         IBinaryOperatorNode node = getBinaryNode("var a:XML = new XML(\"<top 
attr1='cat'><child attr2='dog'><grandchild 
attr3='fish'>text</grandchild></child></top>\");a.foo += a.child");

Reply via email to