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 0b7fa3d8855cf1ebc6b1355740226b87d70d7d08
Author: Josh Tynjala <[email protected]>
AuthorDate: Wed Dec 2 12:46:27 2020 -0800

    JSGoogConfiguration: add allow-dynamic-bindings
    
    MXMLRoyaleEmitter: if allow-dynamic-bindings is false, always emits 
functions instead of strings for dynamic access
---
 .../codegen/mxml/royale/MXMLRoyaleEmitter.java     | 25 +++++++++++++++++++---
 .../driver/js/goog/JSGoogConfiguration.java        | 20 +++++++++++++++++
 2 files changed, 42 insertions(+), 3 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 12fdc87..85a0032 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
@@ -1499,8 +1499,10 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
 
     private void outputBindingInfoAsData(String cname, BindingDatabase 
bindingDataBase)
     {
+        RoyaleJSProject project = 
(RoyaleJSProject)getMXMLWalker().getProject();
         IASEmitter asEmitter = ((IMXMLBlockWalker) getMXMLWalker())
                 .getASEmitter();
+        boolean allowDynamicBindings = project.config != null && 
project.config.getAllowDynamicBindings();
         
         writeNewline("/**");
         writeNewline(" * @export"); // must export or else GCC will remove it
@@ -1526,7 +1528,6 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
             if (node instanceof IMXMLSingleDataBindingNode)
             {
                IMXMLSingleDataBindingNode sbdn = 
(IMXMLSingleDataBindingNode)node;
-               RoyaleJSProject project = 
(RoyaleJSProject)getMXMLWalker().getProject();
                IDefinition bdef = sbdn.getExpressionNode().resolve(project);
                if (bdef != null)
                {
@@ -1537,10 +1538,13 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
             s = bi.getSourceString();
             if (s == null && bi.isSourceSimplePublicProperty())
                 s = 
getSourceStringFromGetter(bi.getExpressionNodesForGetter());
-            if (s == null || s.length() == 0)
+            if (!allowDynamicBindings || s == null || s.length() == 0)
             {
                 List<IExpressionNode> getterNodes = 
bi.getExpressionNodesForGetter();
                 StringBuilder sb = new StringBuilder();
+                sb.append("/** @this {");
+                sb.append(formatQualifiedName(cname));
+                sb.append("} */\n");
                 sb.append("function() { return ");
                 int n = getterNodes.size();
                 for (int i = 0; i < n; i++)
@@ -1593,7 +1597,20 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
 
             IExpressionNode destNode = bi.getExpressionNodeForDestination();
             s = bi.getDestinationString();
-            if (destNode != null && s == null)
+            if (!allowDynamicBindings && destNode == null && s != null)
+            {
+                StringBuilder sb = new StringBuilder();
+                sb.append("/** @this {");
+                sb.append(formatQualifiedName(cname));
+                sb.append("} */\n");
+                sb.append("function(value) { ");
+                sb.append("this.");
+                sb.append(s);
+                sb.append(" = value; },");
+                writeNewline(sb.toString());
+                s = null;
+            }
+            else if (destNode != null && s == null)
             {
                 StringBuilder sb = new StringBuilder();
                 sb.append(generateSetterFunction(bi, destNode));
@@ -1620,8 +1637,10 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
                 write(ASEmitterTokens.SQUARE_CLOSE.getToken());
             }
             else
+            {
                 write(ASEmitterTokens.DOUBLE_QUOTE.getToken() + s +
                         ASEmitterTokens.DOUBLE_QUOTE.getToken());
+            }
             
         }
         Set<Entry<Object, WatcherInfoBase>> watcherChains = 
bindingDataBase.getWatcherChains();
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 e1cdcbe..892cced 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
@@ -865,6 +865,26 @@ public class JSGoogConfiguration extends JSConfiguration
 
     
     //
+    // 'allow-dynamic-bindings'
+    //
+
+    private boolean allowDynamicBindings = true;
+
+    public boolean getAllowDynamicBindings()
+    {
+        return allowDynamicBindings;
+    }
+
+    @Config
+    @Mapping("allow-dynamic-bindings")
+    public void setAllowDynamicBindings(ConfigurationValue cv, boolean value)
+            throws ConfigurationException
+    {
+       allowDynamicBindings = value;
+    }
+
+    
+    //
     // 'warn-public-vars'
     //
 

Reply via email to