I don’t know the reason for this change, but this broke bracket access in XMLList.
myList[myList.length()] = xml should be output unchanged. It’s now output as: myList.child(myList.length()) = xml That’s wrong… Harbs > On Sep 28, 2018, at 6:34 AM, [email protected] wrote: > > This is an automated email from the ASF dual-hosted git repository. > > aharui pushed a commit to branch develop > in repository https://gitbox.apache.org/repos/asf/royale-compiler.git > > commit 86bfe0a6ef8789e8ce065c856ce6f888f7562776 > Author: Alex Harui <[email protected]> > AuthorDate: Tue Sep 25 12:19:02 2018 -0700 > > fix bracket access of XML/XMLList > --- > .../codegen/js/jx/DynamicAccessEmitter.java | 34 +++++++++++++++++++++- > .../codegen/js/royale/TestRoyaleGlobalClasses.java | 30 ++++++++++++++++++- > 2 files changed, 62 insertions(+), 2 deletions(-) > > diff --git > a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/DynamicAccessEmitter.java > > b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/DynamicAccessEmitter.java > index ae977f9..0d94fac 100644 > --- > a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/DynamicAccessEmitter.java > +++ > b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/DynamicAccessEmitter.java > @@ -21,8 +21,12 @@ package org.apache.royale.compiler.internal.codegen.js.jx; > > import org.apache.royale.compiler.codegen.ISubEmitter; > import org.apache.royale.compiler.codegen.js.IJSEmitter; > +import org.apache.royale.compiler.definitions.ITypeDefinition; > import org.apache.royale.compiler.internal.codegen.as.ASEmitterTokens; > import org.apache.royale.compiler.internal.codegen.js.JSSubEmitter; > +import org.apache.royale.compiler.internal.codegen.js.royale.JSRoyaleEmitter; > +import > org.apache.royale.compiler.internal.tree.as.MemberAccessExpressionNode; > +import org.apache.royale.compiler.internal.tree.as.NumericLiteralNode; > import org.apache.royale.compiler.tree.ASTNodeID; > import org.apache.royale.compiler.tree.as.IDynamicAccessNode; > import org.apache.royale.compiler.tree.as.IExpressionNode; > @@ -43,11 +47,39 @@ public class DynamicAccessEmitter extends JSSubEmitter > implements > if (leftOperandNode.getNodeID() == ASTNodeID.Op_AtID) > return; > > + IExpressionNode rightOperandNode = node.getRightOperandNode(); > + IJSEmitter ijs = getEmitter(); > + JSRoyaleEmitter fjs = (ijs instanceof JSRoyaleEmitter) ? > + (JSRoyaleEmitter)ijs : > null; > + if (fjs != null) > + { > + boolean isXML = false; > + if (leftOperandNode instanceof MemberAccessExpressionNode) > + isXML = > fjs.isLeftNodeXMLish((MemberAccessExpressionNode)leftOperandNode); > + else if (leftOperandNode instanceof IExpressionNode) > + isXML = fjs.isXML((IExpressionNode)leftOperandNode); > + if (isXML) > + { > + ITypeDefinition type = > rightOperandNode.resolveType(getProject()); > + if (!type.isInstanceOf("int", getProject()) && > !type.isInstanceOf("uint", getProject()) && !type.isInstanceOf("Number", > getProject()) ) > + { > + String field = > fjs.stringifyNode(rightOperandNode); > + if (field.startsWith("\"@")) > + { > + field = field.replace("@", ""); > + write(".attribute(" + field + > ")"); > + } > + else > + write(".child(" + field + ")"); > + return; > + } > + } > + } > + > startMapping(node, leftOperandNode); > write(ASEmitterTokens.SQUARE_OPEN); > endMapping(node); > > - IExpressionNode rightOperandNode = node.getRightOperandNode(); > getWalker().walk(rightOperandNode); > > startMapping(node, rightOperandNode); > diff --git > a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleGlobalClasses.java > > b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleGlobalClasses.java > index 85b3a15..b2c8a17 100644 > --- > a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleGlobalClasses.java > +++ > b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleGlobalClasses.java > @@ -482,7 +482,17 @@ public class TestRoyaleGlobalClasses extends > TestGoogGlobalClasses > asBlockWalker.visitVariable(node); > assertOut("var /** @type {XMLList} */ b = a.child('child')"); > } > - > + > + @Test > + public void testXMLSingleDotBracket() > + { > + IVariableNode node = getVariable("var a:XML = new XML(\"<top > attr1='cat'><child attr2='dog'><grandchild > attr3='fish'>text</grandchild></child></top>\");var b:XMLList = > a[\"child\"];"); > + IASNode parentNode = node.getParent(); > + node = (IVariableNode) parentNode.getChild(1); > + asBlockWalker.visitVariable(node); > + assertOut("var /** @type {XMLList} */ b = a.child(\"child\")"); > + } > + > @Test > public void testXMLSingleDotChain() > { > @@ -636,6 +646,16 @@ public class TestRoyaleGlobalClasses extends > TestGoogGlobalClasses > } > > @Test > + public void testXMLAttributeBracket2() > + { > + IVariableNode node = getVariable("var a:XML = new XML(\"<top > attr1='cat'><child attr2='dog'><grandchild > attr3='fish'>text</grandchild></child></top>\");var b:XMLList = > a[\"@attr1\"];"); > + IASNode parentNode = node.getParent(); > + node = (IVariableNode) parentNode.getChild(1); > + asBlockWalker.visitVariable(node); > + assertOut("var /** @type {XMLList} */ b = a.attribute(\"attr1\")"); > + } > + > + @Test > public void testXMLAttributeToString() > { > IVariableNode node = getVariable("var a:XML = new XML(\"<top > attr1='cat'><child attr2='dog'><grandchild > attr3='fish'>text</grandchild></child></top>\");var b:String = a.@attr1;"); > @@ -726,6 +746,14 @@ public class TestRoyaleGlobalClasses extends > TestGoogGlobalClasses > } > > @Test > + public void testXMLListSetAttributeIndex() > + { > + IBinaryOperatorNode node = getBinaryNode("var n:int = 1;var > a:XMLList;a[n].@bar = 'foo'"); > + asBlockWalker.visitBinaryOperator(node); > + assertOut("a[n].setAttribute('bar', 'foo')"); > + } > + > + @Test > public void testXMLListSetAttributeComplex() > { > IBinaryOperatorNode node = getBinaryNode("var > a:XMLList;a.(@id==3).@height = '100px'"); >
