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
The following commit(s) were added to refs/heads/develop by this push:
new 20195a3 handle binding in MXML XML
20195a3 is described below
commit 20195a31c8133105fe1ebed028adae25ed979507
Author: Alex Harui <[email protected]>
AuthorDate: Wed Nov 28 18:33:33 2018 -0800
handle binding in MXML XML
---
.../codegen/mxml/royale/MXMLRoyaleEmitter.java | 60 +++++++++++++++++++---
.../tree/mxml/MXMLBindingAttributeNode.java | 5 ++
.../internal/tree/mxml/MXMLBindingNode.java | 2 +-
.../compiler/internal/tree/mxml/XMLBuilder.java | 2 +
4 files changed, 62 insertions(+), 7 deletions(-)
diff --git
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java
index fdfe0ec..a9887d7 100644
---
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java
+++
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java
@@ -34,6 +34,7 @@ import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
+import java.util.Stack;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.royale.abc.semantics.MethodInfo;
@@ -50,6 +51,7 @@ import
org.apache.royale.compiler.constants.IASLanguageConstants;
import org.apache.royale.compiler.definitions.IClassDefinition;
import org.apache.royale.compiler.definitions.IDefinition;
import org.apache.royale.compiler.definitions.ITypeDefinition;
+import org.apache.royale.compiler.internal.as.codegen.InstructionListNode;
import org.apache.royale.compiler.internal.codegen.as.ASEmitterTokens;
import org.apache.royale.compiler.internal.codegen.databinding.BindingDatabase;
import org.apache.royale.compiler.internal.codegen.databinding.BindingInfo;
@@ -80,6 +82,7 @@ import
org.apache.royale.compiler.internal.tree.as.IdentifierNode;
import org.apache.royale.compiler.internal.tree.as.MemberAccessExpressionNode;
import org.apache.royale.compiler.internal.tree.mxml.MXMLDocumentNode;
import org.apache.royale.compiler.internal.tree.mxml.MXMLFileNode;
+import org.apache.royale.compiler.internal.tree.mxml.MXMLBindingNode;
import org.apache.royale.compiler.mxml.IMXMLLanguageConstants;
import org.apache.royale.compiler.projects.ICompilerProject;
import org.apache.royale.compiler.tree.ASTNodeID;
@@ -1405,7 +1408,7 @@ public class MXMLRoyaleEmitter extends MXMLEmitter
implements
if (destNode != null)
{
StringBuilder sb = new StringBuilder();
- sb.append(generateSetterFunction(destNode));
+ sb.append(generateSetterFunction(bi, destNode));
writeNewline(sb.toString() + ASEmitterTokens.COMMA.getToken());
}
else
@@ -1450,18 +1453,63 @@ public class MXMLRoyaleEmitter extends MXMLEmitter
implements
writeNewline( ASEmitterTokens.SQUARE_CLOSE.getToken() +
ASEmitterTokens.SEMICOLON.getToken());
}
- private String generateSetterFunction(IExpressionNode destNode) {
+ private String generateSetterFunction(BindingInfo bi, IExpressionNode
destNode) {
IASEmitter asEmitter = ((IMXMLBlockWalker) getMXMLWalker())
.getASEmitter();
- String body = asEmitter.stringifyNode(destNode);
-
StringBuilder sb = new StringBuilder();
sb.append("function (value) { ");
- sb.append(body);
- sb.append(" = value;");
+ if (destNode instanceof InstructionListNode)
+ {
+ sb.append(generateDestExpression(bi));
+ }
+ else
+ {
+ String body = asEmitter.stringifyNode(destNode);
+ sb.append(body);
+ sb.append(" = value;");
+ }
sb.append("}");
return sb.toString();
}
+
+ String generateDestExpression(BindingInfo bi)
+ {
+ StringBuilder sb = new StringBuilder();
+ MXMLBindingNode node = (MXMLBindingNode)bi.node;
+ IMXMLBindingAttributeNode destNode = node.getDestinationAttributeNode();
+ Stack<IASNode> nodeStack = new Stack<IASNode>();
+ nodeStack.push(node);
+ IASNode parentNode = node.getParent();
+ while (!(parentNode instanceof IMXMLInstanceNode))
+ {
+ nodeStack.push(parentNode);
+ parentNode = parentNode.getParent();
+ }
+ boolean isXML = parentNode instanceof IMXMLXMLNode;
+ sb.append("this.");
+ sb.append(((IMXMLInstanceNode)parentNode).getEffectiveID());
+ while (nodeStack.size() > 0)
+ {
+ IASNode childNode = nodeStack.pop();
+ int n = parentNode.getChildCount();
+ int i = 0;
+ for (; i < n; i++)
+ {
+ if (childNode == parentNode.getChild(i))
+ break;
+ }
+ assert i < n;
+ sb.append("[" + new Integer(i).toString() + "]" );
+ parentNode = childNode;
+ }
+ if (isXML)
+ {
+ sb.append(".setAttribute('" + destNode.getName() + "', value);"
);
+ }
+ else
+ sb.append("." + destNode.getName() + " = value;");
+ return sb.toString();
+ }
private void encodeWatcher(WatcherInfoBase watcherInfoBase)
{
diff --git
a/compiler/src/main/java/org/apache/royale/compiler/internal/tree/mxml/MXMLBindingAttributeNode.java
b/compiler/src/main/java/org/apache/royale/compiler/internal/tree/mxml/MXMLBindingAttributeNode.java
index 1fee677..56b8247 100644
---
a/compiler/src/main/java/org/apache/royale/compiler/internal/tree/mxml/MXMLBindingAttributeNode.java
+++
b/compiler/src/main/java/org/apache/royale/compiler/internal/tree/mxml/MXMLBindingAttributeNode.java
@@ -83,6 +83,11 @@ class MXMLBindingAttributeNode extends MXMLNodeBase
implements IMXMLBindingAttri
return attributeName;
}
+ public void setName(String s)
+ {
+ attributeName = s;
+ }
+
@Override
public int getChildCount()
{
diff --git
a/compiler/src/main/java/org/apache/royale/compiler/internal/tree/mxml/MXMLBindingNode.java
b/compiler/src/main/java/org/apache/royale/compiler/internal/tree/mxml/MXMLBindingNode.java
index 19b8085..5ed122b 100644
---
a/compiler/src/main/java/org/apache/royale/compiler/internal/tree/mxml/MXMLBindingNode.java
+++
b/compiler/src/main/java/org/apache/royale/compiler/internal/tree/mxml/MXMLBindingNode.java
@@ -39,7 +39,7 @@ import static
org.apache.royale.compiler.mxml.IMXMLLanguageConstants.*;
/**
* Implementation of the {@code IMXMLBindingNode} interface.
*/
-class MXMLBindingNode extends MXMLNodeBase implements IMXMLBindingNode
+public class MXMLBindingNode extends MXMLNodeBase implements IMXMLBindingNode
{
/**
* Constructor
diff --git
a/compiler/src/main/java/org/apache/royale/compiler/internal/tree/mxml/XMLBuilder.java
b/compiler/src/main/java/org/apache/royale/compiler/internal/tree/mxml/XMLBuilder.java
index bb5b63e..ce052d0 100644
---
a/compiler/src/main/java/org/apache/royale/compiler/internal/tree/mxml/XMLBuilder.java
+++
b/compiler/src/main/java/org/apache/royale/compiler/internal/tree/mxml/XMLBuilder.java
@@ -284,6 +284,8 @@ class XMLBuilder
MXMLBindingNode bindingNode = new MXMLBindingNode(parent);
MXMLBindingAttributeNode target = new
MXMLBindingAttributeNode(bindingNode, destExpr);
+ target.setLocation(attr);
+ target.setName(attr.getName());
destExpr.setParent(target);
MXMLBindingAttributeNode source = new
MXMLBindingAttributeNode(bindingNode, dbnode.getExpressionNode());