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");
