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

Reply via email to