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 2020/12/22 21:41:59 UTC

[royale-compiler] branch develop updated (ba2d331 -> 5d78474)

This is an automated email from the ASF dual-hosted git repository.

joshtynjala pushed a change to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-compiler.git.


    from ba2d331  fix some bugs around fx:Array, fx:Object, fx:Number, etc in fx:Declarations.  Should fix apache/royale-asjs#1007 and apache/royale-asjs#999
     new b47892e  JSClosureCompilerWrapper: setInlineProperties(false)
     new 5d78474  mxml-reflect-object-property compiler option

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../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 +++
 .../compiler/utils/JSClosureCompilerWrapper.java   |  11 +-
 6 files changed, 231 insertions(+), 43 deletions(-)


[royale-compiler] 02/02: mxml-reflect-object-property compiler option

Posted by jo...@apache.org.
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 <jo...@apache.org>
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'


[royale-compiler] 01/02: JSClosureCompilerWrapper: setInlineProperties(false)

Posted by jo...@apache.org.
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 b47892e76db8db3668ac8cd635fb459d35ee9285
Author: Josh Tynjala <jo...@apache.org>
AuthorDate: Tue Dec 22 13:16:37 2020 -0800

    JSClosureCompilerWrapper: setInlineProperties(false)
    
    Fixes an issue where public member variables that are only set in MXML may be incorrectly detected as constants and inlined in release builds. Determined that this happens rarely, so it will have virtually no impact on output file size and will fix really hard to debug issues.
---
 .../royale/compiler/utils/JSClosureCompilerWrapper.java       | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/utils/JSClosureCompilerWrapper.java b/compiler-jx/src/main/java/org/apache/royale/compiler/utils/JSClosureCompilerWrapper.java
index a343d35..638317e 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/utils/JSClosureCompilerWrapper.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/utils/JSClosureCompilerWrapper.java
@@ -407,7 +407,16 @@ public class JSClosureCompilerWrapper
             options_.setCrossChunkCodeMotion(true);
             options_.setCoalesceVariableNames(true);
             options_.setCrossChunkMethodMotion(true);
-            options_.setInlineProperties(true);
+            // we cannot guarantee that public member variables (called
+            // "properties" by closure) are constant because they may get
+            // set dynamically by the MXML data interpreter. closure assumes
+            // that a variable is constant if it cannot detect any code that
+            // makes changes, even if it isn't meant to be constant.
+            // in my tests, this kind of inlining happened very rarely, and
+            // there's virtually zero impact to file size by turning it off.
+            // however, there's a big upside to avoiding unexpected inlining
+            // that's very hard to debug. -JT
+            options_.setInlineProperties(false);
             options_.setInlineVariables(true);
             options_.setSmartNameRemoval(true);
             options_.setRemoveDeadCode(true);