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 e0c80914b14270fb41734e5eb8e47bcaa02e15bf
Author: Alex Harui <aha...@apache.org>
AuthorDate: Sun Nov 25 21:32:00 2018 -0800

    fix databinding in fx:String
---
 .../codegen/mxml/royale/MXMLRoyaleEmitter.java     | 32 ++++++---------
 .../databinding/BindingDestinationMaker.java       | 45 ++++++++++++++++++++++
 2 files changed, 57 insertions(+), 20 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 d2fa869..56b39d1 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
@@ -1453,23 +1453,9 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
 
                StringBuilder sb = new StringBuilder();
                sb.append("function (value) { ");
-               int lastGet = body.lastIndexOf("get_");
-               int lastDot = body.lastIndexOf(".");
-               if (lastDot == lastGet - 1)
-               {
-                       String object = body.substring(0, lastDot);
-                       String getter = body.substring(lastDot);
-                       String setter = getter.replace("get_", "set_");
-                       setter = setter.replace("()", "(value)");
-                       body = object + setter;
-                       sb.append(body);
-               }
-               else
-               {
-                       sb.append(body);
-                       sb.append(" = value;");
-               }
-               sb.append(";}");
+               sb.append(body);
+               sb.append(" = value;");
+               sb.append("}");
                return sb.toString();
        }
 
@@ -3129,9 +3115,15 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
        if (instanceNode instanceof IMXMLStringNode)
        {
                IMXMLStringNode stringNode = (IMXMLStringNode)instanceNode;
-            IMXMLLiteralNode valueNode = 
(IMXMLLiteralNode)(stringNode.getExpressionNode());
-            Object value = valueNode.getValue();
-            return objectToString(value);
+               IASNode vNode = stringNode.getExpressionNode();
+               if (vNode instanceof IMXMLLiteralNode)
+               {
+                   IMXMLLiteralNode valueNode = (IMXMLLiteralNode)vNode;
+                   Object value = valueNode.getValue();
+                   return objectToString(value);
+               }
+               else
+                       return "''";
        }
        return "";
     }
diff --git 
a/compiler/src/main/java/org/apache/royale/compiler/internal/codegen/databinding/BindingDestinationMaker.java
 
b/compiler/src/main/java/org/apache/royale/compiler/internal/codegen/databinding/BindingDestinationMaker.java
index add3260..9550fb6 100644
--- 
a/compiler/src/main/java/org/apache/royale/compiler/internal/codegen/databinding/BindingDestinationMaker.java
+++ 
b/compiler/src/main/java/org/apache/royale/compiler/internal/codegen/databinding/BindingDestinationMaker.java
@@ -31,14 +31,23 @@ import 
org.apache.royale.compiler.internal.as.codegen.Binding;
 import org.apache.royale.compiler.internal.as.codegen.InstructionListNode;
 import 
org.apache.royale.compiler.internal.as.codegen.MXMLClassDirectiveProcessor;
 import org.apache.royale.compiler.internal.definitions.NamespaceDefinition;
+import org.apache.royale.compiler.internal.tree.as.DynamicAccessNode;
+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.as.NodeBase;
+import org.apache.royale.compiler.internal.tree.as.NumericLiteralNode;
 import org.apache.royale.compiler.tree.as.IASNode;
 import org.apache.royale.compiler.tree.as.IExpressionNode;
+import org.apache.royale.compiler.tree.mxml.IMXMLArrayNode;
+import org.apache.royale.compiler.tree.mxml.IMXMLConcatenatedDataBindingNode;
 import org.apache.royale.compiler.tree.mxml.IMXMLDataBindingNode;
+import org.apache.royale.compiler.tree.mxml.IMXMLLiteralNode;
 import org.apache.royale.compiler.tree.mxml.IMXMLModelNode;
 import org.apache.royale.compiler.tree.mxml.IMXMLModelPropertyNode;
 import org.apache.royale.compiler.tree.mxml.IMXMLModelRootNode;
 import org.apache.royale.compiler.tree.mxml.IMXMLPropertySpecifierNode;
 import org.apache.royale.compiler.tree.mxml.IMXMLSingleDataBindingNode;
+import org.apache.royale.compiler.tree.mxml.IMXMLStringNode;
 
 /**
  * Utility class for analyze binding destinations and making
@@ -144,6 +153,42 @@ public class BindingDestinationMaker
                 }
             }
         }
+        else if (parent instanceof IMXMLStringNode && dbnode instanceof 
IMXMLConcatenatedDataBindingNode)
+        {
+               // this is a binding in a literal like a string, such as 'this 
is {SOME_VAR} times';
+               // we need to figure out how to set the evaluated value.
+               // if this binding is not in an array, then other code will use 
the effectiveID of the string
+               // and set the value.
+               // if it is in an array, then figure out the index in the array 
to set
+               if (parent.getParent() instanceof IMXMLArrayNode)
+               {
+                       int index = -1;
+                       int n = parent.getParent().getChildCount();
+                       for (int i = 0; i < n; i++)
+                       {
+                               IASNode child = parent.getParent().getChild(i);
+                               if (child == parent)
+                               {
+                                       index = i;
+                                       break;
+                               }
+                       }
+                       IdentifierNode arrayNode = new 
IdentifierNode(((IMXMLArrayNode)parent.getParent()).getEffectiveID());
+                       arrayNode.setSourcePath(parent.getSourcePath());
+                       arrayNode.setColumn(parent.getColumn());
+                       arrayNode.setLine(parent.getLine());
+                       NumericLiteralNode indexNode = new 
NumericLiteralNode(new Integer(index).toString());
+                       indexNode.setSourcePath(parent.getSourcePath());
+                       indexNode.setColumn(parent.getColumn());
+                       indexNode.setLine(parent.getLine());
+                       DynamicAccessNode mae = new 
DynamicAccessNode(arrayNode);
+                       mae.setRightOperandNode(indexNode);
+                       mae.setParent((NodeBase) dbnode.getParent());
+                       arrayNode.setParent(mae);
+                       indexNode.setParent(mae);
+                       return mae;
+               }
+        }
         return ret;   
     }
     

Reply via email to