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 5d78474b91ccbce528946ba511d35aea490efaac
Author: Josh Tynjala <[email protected]>
AuthorDate: Tue Dec 22 13:18:15 2020 -0800

    mxml-reflect-object-property compiler option
---
 .../codegen/js/goog/JSGoogEmitterTokens.java       |   3 +-
 .../royale/JSRoyaleBasicMXMLDescriptorEmitter.java |  56 +++++--
 .../codegen/js/royale/JSRoyaleDocEmitter.java      |   9 +-
 .../codegen/mxml/royale/MXMLRoyaleEmitter.java     | 176 +++++++++++++++++----
 .../driver/js/goog/JSGoogConfiguration.java        |  19 +++
 5 files changed, 221 insertions(+), 42 deletions(-)

diff --git 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/goog/JSGoogEmitterTokens.java
 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/goog/JSGoogEmitterTokens.java
index 8afd294..75ffea6 100644
--- 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/goog/JSGoogEmitterTokens.java
+++ 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/goog/JSGoogEmitterTokens.java
@@ -38,7 +38,8 @@ public enum JSGoogEmitterTokens implements IEmitterTokens
     ARRAY("Array"),
     ERROR("Error"),
     SELF("self"),
-    SUPERCLASS("superClass_");
+    SUPERCLASS("superClass_"),
+    GOOG_REFLECT_OBJECTPROPERTY("goog.reflect.objectProperty");
 
     private String token;
 
diff --git 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleBasicMXMLDescriptorEmitter.java
 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleBasicMXMLDescriptorEmitter.java
index ea11bf7..934569b 100644
--- 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleBasicMXMLDescriptorEmitter.java
+++ 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleBasicMXMLDescriptorEmitter.java
@@ -22,12 +22,16 @@ package 
org.apache.royale.compiler.internal.codegen.js.royale;
 import org.apache.royale.compiler.codegen.ISubEmitter;
 import org.apache.royale.compiler.codegen.mxml.js.IMXMLJSEmitter;
 import org.apache.royale.compiler.internal.codegen.as.ASEmitterTokens;
+import org.apache.royale.compiler.internal.codegen.js.goog.JSGoogEmitterTokens;
 import org.apache.royale.compiler.internal.codegen.mxml.MXMLSubEmitter;
 import 
org.apache.royale.compiler.internal.codegen.mxml.royale.MXMLDescriptorSpecifier;
 import 
org.apache.royale.compiler.internal.codegen.mxml.royale.MXMLEventSpecifier;
+import org.apache.royale.compiler.internal.projects.RoyaleJSProject;
 
 public class JSRoyaleBasicMXMLDescriptorEmitter extends MXMLSubEmitter 
implements ISubEmitter<MXMLDescriptorSpecifier>
 {
+    private boolean useGoogReflectObjectProperty = false;
+
     public JSRoyaleBasicMXMLDescriptorEmitter(IMXMLJSEmitter emitter)
     {
         super(emitter);
@@ -36,6 +40,8 @@ public class JSRoyaleBasicMXMLDescriptorEmitter extends 
MXMLSubEmitter implement
     @Override
     public void emit(MXMLDescriptorSpecifier root)
     {
+        RoyaleJSProject project = (RoyaleJSProject) 
getMXMLWalker().getProject();
+        useGoogReflectObjectProperty = project.config != null && 
project.config.getMxmlReflectObjectProperty();
                outputDescriptorSpecifier(root, true);
        }
 
@@ -201,9 +207,35 @@ public class JSRoyaleBasicMXMLDescriptorEmitter extends 
MXMLSubEmitter implement
 
     private void outputPropertySpecifier(MXMLDescriptorSpecifier specifier, 
boolean writeNewline)
     {
-        write((specifier.isProperty) ? ASEmitterTokens.SINGLE_QUOTE.getToken() 
: "");
-        write(specifier.name);
-        write((specifier.isProperty) ? ASEmitterTokens.SINGLE_QUOTE.getToken() 
: "");
+        if(specifier.isProperty)
+        {
+            if(useGoogReflectObjectProperty)
+            {
+                write(JSGoogEmitterTokens.GOOG_REFLECT_OBJECTPROPERTY);
+                write(ASEmitterTokens.PAREN_OPEN);
+            }
+            write(ASEmitterTokens.SINGLE_QUOTE);
+            write(specifier.name);
+            write(ASEmitterTokens.SINGLE_QUOTE);
+            if(useGoogReflectObjectProperty)
+            {
+                MXMLDescriptorSpecifier parentSpecifier = specifier.parent;
+                String id = (parentSpecifier.id != null) ? parentSpecifier.id 
: parentSpecifier.effectiveId;
+                write(ASEmitterTokens.COMMA);
+                write(ASEmitterTokens.SPACE);
+                write(ASEmitterTokens.THIS);
+                if (id != null)
+                {
+                    write(ASEmitterTokens.MEMBER_ACCESS);
+                    write(id);
+                }
+                write(ASEmitterTokens.PAREN_CLOSE);
+            }
+        }
+        else
+        {
+            write(specifier.name);
+        }
         writeDelimiter(writeNewline);
 
         if (specifier.isProperty)
@@ -252,13 +284,17 @@ public class JSRoyaleBasicMXMLDescriptorEmitter extends 
MXMLSubEmitter implement
             {
                 write(specifier.propertySpecifiers.size() + 1 + "");
                 writeDelimiter(writeNewline);
-                String idPropName = (specifier.effectiveId != null) ? "_id"
-                        : "id";
-                writeSimpleDescriptor(idPropName, 
ASEmitterTokens.TRUE.getToken(),
-                        ASEmitterTokens.SINGLE_QUOTE.getToken()
-                                + ((specifier.id != null) ? specifier.id : 
specifier.effectiveId) + ASEmitterTokens.SINGLE_QUOTE.getToken(),
-                        writeNewline);
-
+                String idPropName = (specifier.effectiveId != null) ? "_id" : 
"id";
+                String id = (specifier.id != null) ? specifier.id : 
specifier.effectiveId;
+                write(ASEmitterTokens.SINGLE_QUOTE);
+                write(idPropName);
+                write(ASEmitterTokens.SINGLE_QUOTE);
+                writeDelimiter(writeNewline);
+                write(ASEmitterTokens.TRUE);
+                writeDelimiter(writeNewline);
+                write(ASEmitterTokens.SINGLE_QUOTE);
+                write(id);
+                write(ASEmitterTokens.SINGLE_QUOTE);
                 writeDelimiter(writeNewline);
             }
             else
diff --git 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleDocEmitter.java
 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleDocEmitter.java
index 05d27c2..8ee0bea 100644
--- 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleDocEmitter.java
+++ 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleDocEmitter.java
@@ -627,7 +627,10 @@ public class JSRoyaleDocEmitter extends JSGoogDocEmitter
         }
         else
         {
-            boolean warnPublicVars = fjp.config != null && 
fjp.config.getWarnPublicVars() && !fjp.config.getPreventRenamePublicSymbols();
+            boolean warnPublicVars = fjp.config != null
+                    && fjp.config.getWarnPublicVars()
+                    && !fjp.config.getPreventRenamePublicSymbols()
+                    && !fjp.config.getMxmlReflectObjectProperty();
             IMetaTagsNode meta = node.getMetaTags();
             boolean bindable = false;
             if (meta != null)
@@ -652,12 +655,12 @@ public class JSRoyaleDocEmitter extends JSGoogDocEmitter
                 }
                 
                 if (!suppressedWarning(node, fjp))
+                {
                        fjp.getProblems().add(new 
PublicVarWarningProblem(node.getSourcePath(),
                             node.getStart(), node.getEnd(),
                             warningNode.getLine(), warningNode.getColumn(),
                             node.getEndLine(), node.getEndColumn()));
-               
-
+                }
             }
             boolean avoidExport = (node.getASDocComment() instanceof 
ASDocComment
                     && ((ASDocComment)node.getASDocComment()).commentNoEnd()
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 f211c8f..ff2fc41 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
@@ -1510,6 +1510,7 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
         IASEmitter asEmitter = ((IMXMLBlockWalker) getMXMLWalker())
                 .getASEmitter();
         boolean allowDynamicBindings = project.config != null && 
project.config.getAllowDynamicBindings();
+        boolean useMxmlReflectObjectProperty = project.config != null && 
project.config.getMxmlReflectObjectProperty();
         
         writeNewline("/**");
         writeNewline(" * @export"); // must export or else GCC will remove it
@@ -1528,7 +1529,10 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
         boolean hadOutput = false;
         for (BindingInfo bi : bindingInfo)
         {
-            if (hadOutput) writeNewline(ASEmitterTokens.COMMA.getToken());
+            if (hadOutput)
+            {
+                writeNewline(ASEmitterTokens.COMMA);
+            }
             hadOutput = true;
             String s;
             IMXMLNode node = bi.node;
@@ -1559,7 +1563,11 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
                        IExpressionNode getterNode = getterNodes.get(i);
                     sb.append(asEmitter.stringifyNode(getterNode));
                     if (i < n - 1)
-                       sb.append(ASEmitterTokens.SPACE.getToken() + 
ASEmitterTokens.PLUS.getToken() + ASEmitterTokens.SPACE.getToken());
+                    {
+                        sb.append(ASEmitterTokens.SPACE.getToken());
+                        sb.append(ASEmitterTokens.PLUS.getToken());
+                        sb.append(ASEmitterTokens.SPACE.getToken());
+                    }
                 }
                 sb.append("; },");
                 writeNewline(sb.toString());
@@ -1568,39 +1576,107 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
             {
                if (bi.classDef != null)
                {
-                       String[] parts = s.split("\\.");
-                       write(ASEmitterTokens.SQUARE_OPEN.getToken() + 
ASEmitterTokens.DOUBLE_QUOTE.getToken() +
-                               bi.classDef.getQualifiedName() + 
ASEmitterTokens.DOUBLE_QUOTE.getToken());
+                    String[] parts = s.split("\\.");
                        String qname = bi.classDef.getQualifiedName();
+                    write(ASEmitterTokens.SQUARE_OPEN);
+                    write(ASEmitterTokens.DOUBLE_QUOTE);
+                    write(qname);
+                    write(ASEmitterTokens.DOUBLE_QUOTE);
                        if (!usedNames.contains(qname))
                                usedNames.add(qname);
                        if (!staticUsedNames.contains(qname))
                                staticUsedNames.add(qname);
+                    StringBuilder objString = null;
+                    if (useMxmlReflectObjectProperty)
+                    {
+                        objString = new StringBuilder();
+                        objString.append(qname);
+                    }
                        int n = parts.length;
                        for (int i = 1; i < n; i++)
                        {
                            String part = parts[i];
-                           write(", " +  
ASEmitterTokens.DOUBLE_QUOTE.getToken() + part + 
ASEmitterTokens.DOUBLE_QUOTE.getToken());
+                        write(", ");
+                        if(useMxmlReflectObjectProperty)
+                        {
+                            
write(JSGoogEmitterTokens.GOOG_REFLECT_OBJECTPROPERTY);
+                            write(ASEmitterTokens.PAREN_OPEN);
+                        }
+                        write(ASEmitterTokens.DOUBLE_QUOTE);
+                        write(part);
+                        write(ASEmitterTokens.DOUBLE_QUOTE);
+                        if(useMxmlReflectObjectProperty)
+                        {
+                            write(ASEmitterTokens.COMMA);
+                            write(ASEmitterTokens.SPACE);
+                            write(objString.toString());
+                            write(ASEmitterTokens.PAREN_CLOSE);
+                            objString.append(".");
+                            objString.append(part);
+                        }
                        }
-                       writeNewline(ASEmitterTokens.SQUARE_CLOSE.getToken() + 
ASEmitterTokens.COMMA.getToken());
+                    write(ASEmitterTokens.SQUARE_CLOSE);
+                    writeNewline(ASEmitterTokens.COMMA);
                }
                else
                {
                        String[] parts = s.split("\\.");
-                       write(ASEmitterTokens.SQUARE_OPEN.getToken() + 
ASEmitterTokens.DOUBLE_QUOTE.getToken() +
-                               parts[0] + 
ASEmitterTokens.DOUBLE_QUOTE.getToken());
-                       int n = parts.length;
-                       for (int i = 1; i < n; i++)
+                    write(ASEmitterTokens.SQUARE_OPEN);
+                    StringBuilder objString = null;
+                    if (useMxmlReflectObjectProperty)
+                    {
+                        objString = new StringBuilder();
+                        objString.append("this");
+                    }
+                    int n = parts.length;
+                       for (int i = 0; i < n; i++)
                        {
-                           String part = parts[i];
-                           write(", " +  
ASEmitterTokens.DOUBLE_QUOTE.getToken() + part + 
ASEmitterTokens.DOUBLE_QUOTE.getToken());
-                       }
-                       writeNewline(ASEmitterTokens.SQUARE_CLOSE.getToken() + 
ASEmitterTokens.COMMA.getToken());
+                        String part = parts[i];
+                        if (i > 0)
+                        {
+                            write(", ");
+                        }
+                        if(useMxmlReflectObjectProperty)
+                        {
+                            
write(JSGoogEmitterTokens.GOOG_REFLECT_OBJECTPROPERTY);
+                            write(ASEmitterTokens.PAREN_OPEN);
+                        }
+                        write(ASEmitterTokens.DOUBLE_QUOTE);
+                        write(part);
+                        write(ASEmitterTokens.DOUBLE_QUOTE);
+                        if(useMxmlReflectObjectProperty)
+                        {
+                            write(ASEmitterTokens.COMMA);
+                            write(ASEmitterTokens.SPACE);
+                            write(objString.toString());
+                            write(ASEmitterTokens.PAREN_CLOSE);
+                            objString.append(".");
+                            objString.append(part);
+                        }
+                    }
+                    write(ASEmitterTokens.SQUARE_CLOSE);
+                       writeNewline(ASEmitterTokens.COMMA);
                }
             }
             else
-                writeNewline(ASEmitterTokens.DOUBLE_QUOTE.getToken() + s +
-                        ASEmitterTokens.DOUBLE_QUOTE.getToken() + 
ASEmitterTokens.COMMA.getToken());
+            {
+                if(useMxmlReflectObjectProperty)
+                {
+                    write(JSGoogEmitterTokens.GOOG_REFLECT_OBJECTPROPERTY);
+                    write(ASEmitterTokens.PAREN_OPEN);
+                }
+                write(ASEmitterTokens.DOUBLE_QUOTE);
+                write(s);
+                write(ASEmitterTokens.DOUBLE_QUOTE);
+                if(useMxmlReflectObjectProperty)
+                {
+                    write(ASEmitterTokens.COMMA);
+                    write(ASEmitterTokens.SPACE);
+                    write(ASEmitterTokens.THIS);
+                    write(ASEmitterTokens.PAREN_CLOSE);
+                }
+                writeNewline(ASEmitterTokens.COMMA);
+            }
 
             IExpressionNode destNode = bi.getExpressionNodeForDestination();
             s = bi.getDestinationString();
@@ -1621,32 +1697,75 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
             {
                 StringBuilder sb = new StringBuilder();
                 sb.append(generateSetterFunction(bi, destNode));
-                writeNewline(sb.toString() + ASEmitterTokens.COMMA.getToken());
+                write(sb.toString());
+                writeNewline(ASEmitterTokens.COMMA);
             }
             else
-                writeNewline(ASEmitterTokens.NULL.getToken() + 
ASEmitterTokens.COMMA.getToken());
+            {
+                write(ASEmitterTokens.NULL);
+                writeNewline(ASEmitterTokens.COMMA);
+            }
 
             if (s == null)
             {
-                write(ASEmitterTokens.NULL.getToken());
+                write(ASEmitterTokens.NULL);
             }
             else if (s.contains("."))
             {
                 String[] parts = s.split("\\.");
-                write(ASEmitterTokens.SQUARE_OPEN.getToken() + 
ASEmitterTokens.DOUBLE_QUOTE.getToken() +
-                        parts[0] + ASEmitterTokens.DOUBLE_QUOTE.getToken());
+                write(ASEmitterTokens.SQUARE_OPEN);
+                StringBuilder objString = null;
+                if (useMxmlReflectObjectProperty)
+                {
+                    objString = new StringBuilder();
+                    objString.append("this");
+                }
                 int n = parts.length;
-                for (int i = 1; i < n; i++)
+                for (int i = 0; i < n; i++)
                 {
                     String part = parts[i];
-                    write(", " + ASEmitterTokens.DOUBLE_QUOTE.getToken() + 
part + ASEmitterTokens.DOUBLE_QUOTE.getToken());
+                    if (i > 0)
+                    {
+                        write(", ");
+                    }
+                    if(useMxmlReflectObjectProperty)
+                    {
+                        write(JSGoogEmitterTokens.GOOG_REFLECT_OBJECTPROPERTY);
+                        write(ASEmitterTokens.PAREN_OPEN);
+                    }
+                    write(ASEmitterTokens.DOUBLE_QUOTE);
+                    write(part);
+                    write(ASEmitterTokens.DOUBLE_QUOTE);
+                    if(useMxmlReflectObjectProperty)
+                    {
+                        write(ASEmitterTokens.COMMA);
+                        write(ASEmitterTokens.SPACE);
+                        write(objString.toString());
+                        write(ASEmitterTokens.PAREN_CLOSE);
+                        objString.append(".");
+                        objString.append(part);
+                    }
                 }
-                write(ASEmitterTokens.SQUARE_CLOSE.getToken());
+                write(ASEmitterTokens.SQUARE_CLOSE);
             }
             else
             {
-                write(ASEmitterTokens.DOUBLE_QUOTE.getToken() + s +
-                        ASEmitterTokens.DOUBLE_QUOTE.getToken());
+                if(useMxmlReflectObjectProperty)
+                {
+                    write(JSGoogEmitterTokens.GOOG_REFLECT_OBJECTPROPERTY);
+                    write(ASEmitterTokens.PAREN_OPEN);
+                }
+                write(ASEmitterTokens.DOUBLE_QUOTE);
+                write(s);
+                write(ASEmitterTokens.DOUBLE_QUOTE);
+                if(useMxmlReflectObjectProperty)
+                {
+                    write(ASEmitterTokens.COMMA);
+                    write(ASEmitterTokens.SPACE);
+                    write(ASEmitterTokens.THIS);
+                    write(ASEmitterTokens.PAREN_CLOSE);
+                }
+                writeNewline(ASEmitterTokens.COMMA);
             }
             
         }
@@ -1670,7 +1789,8 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
             if (hadOutput) writeNewline();
         }
 
-        writeNewline( ASEmitterTokens.SQUARE_CLOSE.getToken() + 
ASEmitterTokens.SEMICOLON.getToken());
+        write(ASEmitterTokens.SQUARE_CLOSE);
+        writeNewline(ASEmitterTokens.SEMICOLON);
     }
 
     private String generateSetterFunction(BindingInfo bi, IExpressionNode 
destNode) {
diff --git 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/driver/js/goog/JSGoogConfiguration.java
 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/driver/js/goog/JSGoogConfiguration.java
index 892cced..1f54cbc 100644
--- 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/driver/js/goog/JSGoogConfiguration.java
+++ 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/driver/js/goog/JSGoogConfiguration.java
@@ -883,6 +883,25 @@ public class JSGoogConfiguration extends JSConfiguration
        allowDynamicBindings = value;
     }
 
+    //
+    // 'mxml-reflect-object-property'
+    //
+
+    private boolean mxmlReflectObjectProperty = false;
+
+    public boolean getMxmlReflectObjectProperty()
+    {
+        return mxmlReflectObjectProperty;
+    }
+
+    @Config
+    @Mapping("mxml-reflect-object-property")
+    public void setMxmlReflectObjectProperty(ConfigurationValue cv, boolean 
value)
+            throws ConfigurationException
+    {
+       mxmlReflectObjectProperty = value;
+    }
+
     
     //
     // 'warn-public-vars'

Reply via email to