This is an automated email from the ASF dual-hosted git repository. joshtynjala pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/royale-compiler.git
commit 208a3960b7f1c86bc95e752f5cbcd23bed57d5a6 Author: Josh Tynjala <[email protected]> AuthorDate: Tue May 25 14:51:32 2021 -0700 MXMLRoyaleEmitter: don't output complex initializers for numbers, strings, or arrays if the expression is an MXML data binding expression --- .../codegen/mxml/royale/MXMLRoyaleEmitter.java | 135 +++++++++++++-------- 1 file changed, 84 insertions(+), 51 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 33382ef..9b96f62 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 @@ -3663,43 +3663,57 @@ public class MXMLRoyaleEmitter extends MXMLEmitter implements case MXMLStringID: { IMXMLStringNode stringNode = (IMXMLStringNode)declNode; - varname = stringNode.getEffectiveID(); - writeNewline(); - write(ASEmitterTokens.THIS); - write(ASEmitterTokens.MEMBER_ACCESS); - write(varname); - write(ASEmitterTokens.SPACE); - writeToken(ASEmitterTokens.EQUAL); - IMXMLLiteralNode valueNode = (IMXMLLiteralNode)(stringNode.getExpressionNode()); - Object value = valueNode.getValue(); - write(objectToString(value)); - write(ASEmitterTokens.SEMICOLON); + IASNode expressionNode = stringNode.getExpressionNode(); + // it might be a binding expression instead of a literal + if (expressionNode instanceof IMXMLLiteralNode) + { + varname = stringNode.getEffectiveID(); + writeNewline(); + write(ASEmitterTokens.THIS); + write(ASEmitterTokens.MEMBER_ACCESS); + write(varname); + write(ASEmitterTokens.SPACE); + writeToken(ASEmitterTokens.EQUAL); + IMXMLLiteralNode valueNode = (IMXMLLiteralNode) expressionNode; + Object value = valueNode.getValue(); + write(objectToString(value)); + write(ASEmitterTokens.SEMICOLON); + } break; } case MXMLArrayID: { IMXMLArrayNode arrayNode = (IMXMLArrayNode)declNode; - varname = arrayNode.getEffectiveID(); - writeNewline(); - write(ASEmitterTokens.THIS); - write(ASEmitterTokens.MEMBER_ACCESS); - write(varname); - write(ASEmitterTokens.SPACE); - writeToken(ASEmitterTokens.EQUAL); - write("["); - int m = arrayNode.getChildCount(); - boolean firstOne = true; - for (int j = 0; j < m; j++) - { - IMXMLInstanceNode valueNode = (IMXMLInstanceNode)(arrayNode.getChild(j)); - if (firstOne) - firstOne = false; - else - writeToken(","); - write(instanceToString(valueNode)); - } - write("]"); - write(ASEmitterTokens.SEMICOLON); + int m = arrayNode.getChildCount(); + boolean isDataBinding = false; + if(m == 1) + { + IASNode child = arrayNode.getChild(0); + isDataBinding = child instanceof IMXMLDataBindingNode; + } + if (!isDataBinding) + { + varname = arrayNode.getEffectiveID(); + writeNewline(); + write(ASEmitterTokens.THIS); + write(ASEmitterTokens.MEMBER_ACCESS); + write(varname); + write(ASEmitterTokens.SPACE); + writeToken(ASEmitterTokens.EQUAL); + write(ASEmitterTokens.SQUARE_OPEN); + boolean firstOne = true; + for (int j = 0; j < m; j++) + { + IMXMLInstanceNode valueNode = (IMXMLInstanceNode)(arrayNode.getChild(j)); + if (firstOne) + firstOne = false; + else + writeToken(ASEmitterTokens.COMMA); + write(instanceToString(valueNode)); + } + write(ASEmitterTokens.SQUARE_CLOSE); + write(ASEmitterTokens.SEMICOLON); + } break; } case MXMLXMLID: @@ -3748,17 +3762,22 @@ public class MXMLRoyaleEmitter extends MXMLEmitter implements case MXMLUintID: { IMXMLExpressionNode scalarNode = (IMXMLExpressionNode)declNode; - varname = scalarNode.getEffectiveID(); - writeNewline(); - write(ASEmitterTokens.THIS); - write(ASEmitterTokens.MEMBER_ACCESS); - write(varname); - write(ASEmitterTokens.SPACE); - writeToken(ASEmitterTokens.EQUAL); - IMXMLLiteralNode valueNode = (IMXMLLiteralNode)(scalarNode.getExpressionNode()); - Object value = valueNode.getValue(); - write(value.toString()); - write(ASEmitterTokens.SEMICOLON); + IASNode expressionNode = scalarNode.getExpressionNode(); + // it might be a binding expression instead of a literal + if (expressionNode instanceof IMXMLLiteralNode) + { + varname = scalarNode.getEffectiveID(); + writeNewline(); + write(ASEmitterTokens.THIS); + write(ASEmitterTokens.MEMBER_ACCESS); + write(varname); + write(ASEmitterTokens.SPACE); + writeToken(ASEmitterTokens.EQUAL); + IMXMLLiteralNode valueNode = (IMXMLLiteralNode) expressionNode; + Object value = valueNode.getValue(); + write(value.toString()); + write(ASEmitterTokens.SEMICOLON); + } break; } @@ -3790,46 +3809,60 @@ public class MXMLRoyaleEmitter extends MXMLEmitter implements return objectToString(value); } else + { return "''"; + } } else if (instanceNode instanceof IMXMLObjectNode) { IMXMLObjectNode objectNode = (IMXMLObjectNode)instanceNode; StringBuilder sb = new StringBuilder(); - sb.append("{"); + sb.append(ASEmitterTokens.BLOCK_OPEN.getToken()); int m = objectNode.getChildCount(); boolean firstOne = true; for (int j = 0; j < m; j++) { if (firstOne) + { firstOne = false; - else - sb.append(", "); + } + else + { + sb.append(ASEmitterTokens.COMMA.getToken()); + sb.append(ASEmitterTokens.SPACE.getToken()); + } IMXMLPropertySpecifierNode propName = (IMXMLPropertySpecifierNode)objectNode.getChild(j); - sb.append(propName.getName() + ": "); + sb.append(propName.getName()); + sb.append(ASEmitterTokens.COLON.getToken()); + sb.append(ASEmitterTokens.SPACE.getToken()); IMXMLInstanceNode valueNode = propName.getInstanceNode(); sb.append(instanceToString(valueNode)); } - sb.append("}"); + sb.append(ASEmitterTokens.BLOCK_CLOSE.getToken()); return sb.toString(); } else if (instanceNode instanceof IMXMLArrayNode) { IMXMLArrayNode arrayNode = (IMXMLArrayNode)instanceNode; StringBuilder sb = new StringBuilder(); - sb.append("["); + sb.append(ASEmitterTokens.SQUARE_OPEN.getToken()); int m = arrayNode.getChildCount(); boolean firstOne = true; for (int j = 0; j < m; j++) { IMXMLInstanceNode valueNode = (IMXMLInstanceNode)(arrayNode.getChild(j)); if (firstOne) + { firstOne = false; + } else - sb.append(", "); + { + sb.append(ASEmitterTokens.COMMA.getToken()); + sb.append(ASEmitterTokens.SPACE.getToken()); + } sb.append(instanceToString(valueNode)); } - sb.append("]"); + sb.append(ASEmitterTokens.SQUARE_CLOSE.getToken()); return sb.toString(); } else if ((instanceNode instanceof IMXMLIntNode) ||
