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; }