You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by jo...@apache.org on 2021/05/25 22:06:48 UTC

[royale-compiler] 01/02: MXMLRoyaleEmitter: don't output complex initializers for numbers, strings, or arrays if the expression is an MXML data binding expression

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 <jo...@apache.org>
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) ||