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/09/02 16:54:07 UTC

[royale-compiler] branch develop updated: compiler-jx: dynamically export variables in release builds instead of using export annotations

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


The following commit(s) were added to refs/heads/develop by this push:
     new 3b7cf0d  compiler-jx: dynamically export variables in release builds instead of using export annotations
3b7cf0d is described below

commit 3b7cf0d3b2282a32dcaf19314760e56566be4174
Author: Josh Tynjala <jo...@apache.org>
AuthorDate: Wed Sep 2 09:54:00 2020 -0700

    compiler-jx: dynamically export variables in release builds instead of using export annotations
    
    This is a continuation of previous work that dynamically exported types and methods. Still need to do getters/setters.
---
 .../javascript/jscomp/GenerateRoyaleExports.java   | 126 +++++++++++++++++++++
 .../javascript/jscomp/RoyaleClosurePassConfig.java |  32 ++----
 .../codegen/js/royale/JSRoyaleDocEmitter.java      |  22 +---
 .../apache/royale/compiler/utils/ClosureUtils.java |   7 +-
 .../codegen/js/royale/TestRoyaleClass.java         |  21 ++--
 .../codegen/js/royale/TestRoyaleEmitter.java       |  93 ++++++++-------
 .../codegen/js/royale/TestRoyaleFieldMembers.java  |  34 +++---
 .../codegen/js/royale/TestRoyalePackage.java       |   2 -
 .../mxml/royale/TestRoyaleMXMLApplication.java     |   2 -
 .../codegen/mxml/royale/TestRoyaleMXMLScript.java  |   7 --
 .../royale/projects/internal/MainClass_result.js   |   1 -
 11 files changed, 216 insertions(+), 131 deletions(-)

diff --git a/compiler-jx/src/main/java/com/google/javascript/jscomp/GenerateRoyaleExports.java b/compiler-jx/src/main/java/com/google/javascript/jscomp/GenerateRoyaleExports.java
new file mode 100644
index 0000000..16997ac
--- /dev/null
+++ b/compiler-jx/src/main/java/com/google/javascript/jscomp/GenerateRoyaleExports.java
@@ -0,0 +1,126 @@
+/*
+ *
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package com.google.javascript.jscomp;
+
+import java.util.Set;
+
+import com.google.javascript.jscomp.NodeTraversal.AbstractPostOrderCallback;
+import com.google.javascript.rhino.IR;
+import com.google.javascript.rhino.JSDocInfo;
+import com.google.javascript.rhino.Node;
+import com.google.javascript.rhino.Token;
+
+public class GenerateRoyaleExports extends AbstractPostOrderCallback {
+
+	private final AbstractCompiler compiler;
+	private Set<String> extraSymbolNamesToExport;
+
+	public GenerateRoyaleExports(AbstractCompiler compiler) {
+	  this.compiler = compiler;
+	}
+
+	public void process(Node externs, Node root, Set<String> extraSymbolNamesToExport) {
+		this.extraSymbolNamesToExport = extraSymbolNamesToExport;
+		NodeTraversal.traverse(compiler, root, this);
+	}
+
+	@Override
+	public void visit(NodeTraversal t, Node n, Node parent) {
+		if(n.getToken() != Token.ASSIGN) {
+			return;
+		}
+		JSDocInfo docInfo = n.getJSDocInfo();
+		if(docInfo == null) {
+			return;
+		}
+		Node firstChild = n.getFirstChild();
+		if (!firstChild.isQualifiedName()) {
+			return;
+		}
+		String qualifiedName = firstChild.getQualifiedName();
+		if(!extraSymbolNamesToExport.contains(qualifiedName)) {
+			//System.err.println("~~~ NO MATCH! " + qualifiedName);
+			return;
+		}
+
+		Node parentNode = n.getParent();
+
+		if(parentNode == null) {
+			return;
+		}
+
+		Node gpNode = parentNode.getParent();
+
+		if(gpNode == null || !gpNode.isScript()) {
+			return;
+		}
+		//System.err.println("*** MATCH! " + qualifiedName);
+
+		addExportSymbolCall(qualifiedName, n);
+	}
+
+	private void addExportSymbolCall(String export, Node context) {
+	  Node call =
+		  IR.call(
+			  NodeUtil.newQName(
+				  compiler, compiler.getCodingConvention().getExportSymbolFunction(),
+				  context, export),
+			  IR.string(export),
+			  NodeUtil.newQName(
+				  compiler, export,
+				  context, export));
+  
+	  Node expression = IR.exprResult(call).useSourceInfoIfMissingFromForTree(context);
+	  annotate(expression);
+  
+	  addStatement(context, expression);
+	}
+
+	private void addStatement(Node context, Node stmt) {
+	  CodingConvention convention = compiler.getCodingConvention();
+  
+	  Node n = context;
+	  Node exprRoot = n;
+	  while (!NodeUtil.isStatementBlock(exprRoot.getParent())) {
+		exprRoot = exprRoot.getParent();
+	  }
+  
+	  // It's important that any class-building calls (goog.inherits)
+	  // come right after the class definition, so move the export after that.
+	  while (true) {
+		Node next = exprRoot.getNext();
+		if (next != null
+			&& NodeUtil.isExprCall(next)
+			&& convention.getClassesDefinedByCall(next.getFirstChild()) != null) {
+		  exprRoot = next;
+		} else {
+		  break;
+		}
+	  }
+  
+	  Node block = exprRoot.getParent();
+	  block.addChildAfter(stmt, exprRoot);
+	  compiler.reportChangeToEnclosingScope(stmt);
+	}
+
+	private void annotate(Node node) {
+	  NodeTraversal.traverse(
+		  compiler, node, new PrepareAst.PrepareAnnotations());
+	}
+}
\ No newline at end of file
diff --git a/compiler-jx/src/main/java/com/google/javascript/jscomp/RoyaleClosurePassConfig.java b/compiler-jx/src/main/java/com/google/javascript/jscomp/RoyaleClosurePassConfig.java
index 92f3cc8..c332a81 100644
--- a/compiler-jx/src/main/java/com/google/javascript/jscomp/RoyaleClosurePassConfig.java
+++ b/compiler-jx/src/main/java/com/google/javascript/jscomp/RoyaleClosurePassConfig.java
@@ -344,6 +344,10 @@ public final class RoyaleClosurePassConfig extends PassConfig {
       checks.add(angularPass);
     }
 
+    if (extraSymbolNamesToExport != null) {
+      checks.add(generateRoyaleExports);
+    }
+
     if (!options.generateExportsAfterTypeChecking && options.generateExports) {
       checks.add(generateExports);
     }
@@ -362,10 +366,6 @@ public final class RoyaleClosurePassConfig extends PassConfig {
       checks.add(polymerPass);
     }
 
-    if (extraSymbolNamesToExport != null) {
-      checks.add(extraSymbolsPass);
-    }
-
     if (options.checkSuspiciousCode
         || options.enables(DiagnosticGroups.GLOBAL_THIS)
         || options.enables(DiagnosticGroups.DEBUGGER_STATEMENT_PRESENT)) {
@@ -1268,31 +1268,15 @@ public final class RoyaleClosurePassConfig extends PassConfig {
         }
       };
   
-  private final PassFactory extraSymbolsPass = 
-    new PassFactory("extra-symbols-to-export", true) {
+  private final PassFactory generateRoyaleExports = 
+    new PassFactory("generate-royale-exports", true) {
       @Override
       protected CompilerPass create(final AbstractCompiler compiler) {
+        final GenerateRoyaleExports pass = new GenerateRoyaleExports(compiler);
         return new CompilerPass() {
           @Override
           public void process(Node externs, Node root) {
-            Node scriptNode = compiler.getScriptNode(sourceFileName);
-            for(String nameToExport : extraSymbolNamesToExport)
-            {
-              Node exportCallTarget = NodeUtil.newQName(compiler,
-                  compiler.getCodingConvention().getExportSymbolFunction(), scriptNode, nameToExport);
-              Node call = IR.call(exportCallTarget);
-              if (exportCallTarget.isName()) {
-                call.putBooleanProp(Node.FREE_CALL, true);
-              }
-              call.addChildToBack(IR.string(nameToExport));
-              call.addChildToBack(NodeUtil.newQName(compiler,
-              nameToExport, scriptNode, nameToExport));
-
-              Node expression = IR.exprResult(call);
-
-              scriptNode.addChildToBack(expression);
-              compiler.reportChangeToEnclosingScope(expression);
-            }
+            pass.process(externs, root, extraSymbolNamesToExport);
           }
         };
       }
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 6e403d3..05d27c2 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
@@ -594,23 +594,11 @@ public class JSRoyaleDocEmitter extends JSGoogDocEmitter
     public void emitFieldDoc(IVariableNode node, IDefinition def, ICompilerProject project)
     {
         RoyaleJSProject fjp =  (RoyaleJSProject)project;
-        boolean suppressExports = false;
-        if (emitter instanceof JSRoyaleEmitter) {
-            suppressExports = ((JSRoyaleEmitter) emitter).getModel().suppressExports;
-        }
-        if (fjp.config != null)
-        {
-        	emitExports = !suppressExports && fjp.config.getExportPublicSymbols();
-        	exportProtected = !suppressExports && fjp.config.getExportProtectedSymbols();
-        	exportInternal = !suppressExports && fjp.config.getExportInternalSymbols();
-        }
-        else
-        {
-            emitExports = !suppressExports;
-            exportProtected = false;
-            exportInternal = false;
-        }
-        emitExports = emitExports && !node.getVariableClassification().equals(VariableClassification.PACKAGE_MEMBER);
+
+        //exporting fields is handled dynamically in ClosureUtils
+        emitExports = false;
+        exportProtected = false;
+        exportInternal = false;
 
         begin();
 
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/utils/ClosureUtils.java b/compiler-jx/src/main/java/org/apache/royale/compiler/utils/ClosureUtils.java
index 17676c7..a7ccbd8 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/utils/ClosureUtils.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/utils/ClosureUtils.java
@@ -195,8 +195,11 @@ public class ClosureUtils
                             {
                                 continue;
                             }
-                            if (localDef instanceof IFunctionDefinition
-                                    && !(localDef instanceof IAccessorDefinition))
+                            boolean isMethod = localDef instanceof IFunctionDefinition
+                                && !(localDef instanceof IAccessorDefinition);
+                            boolean isVar = localDef instanceof IVariableDefinition
+                                && !(localDef instanceof IAccessorDefinition);
+                            if (isMethod || isVar)
                             {
                                 INamespaceReference nsRef = localDef.getNamespaceReference();
                                 boolean isCustomNS = !nsRef.isLanguageNamespace();
diff --git a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleClass.java b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleClass.java
index 88f7032..e3a6d4e 100644
--- a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleClass.java
+++ b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleClass.java
@@ -126,7 +126,7 @@ public class TestRoyaleClass extends TestGoogClass
     {
         IClassNode node = getClassNode("public class B {public function B(arg1:String) {this.arg1 = arg1}; public var arg1:String;}");
         asBlockWalker.visitClass(node);
-        String expected = "/**\n * @constructor\n * @param {string} arg1\n */\norg.apache.royale.B = function(arg1) {\n  this.arg1 = arg1;\n};\n\n\n/**\n * @export\n * @type {string}\n */\norg.apache.royale.B.prototype.arg1 = null;";
+        String expected = "/**\n * @constructor\n * @param {string} arg1\n */\norg.apache.royale.B = function(arg1) {\n  this.arg1 = arg1;\n};\n\n\n/**\n * @type {string}\n */\norg.apache.royale.B.prototype.arg1 = null;";
         assertOut(expected);
     }
 
@@ -135,7 +135,7 @@ public class TestRoyaleClass extends TestGoogClass
     {
         IClassNode node = getClassNode("public class B {public function B() {}; public var event:Event = new Event(); public function foo():String {return event.type;};}");
         asBlockWalker.visitClass(node);
-        String expected = "/**\n * @constructor\n */\norg.apache.royale.B = function() {\n\nthis.event = new Event();\n};\n\n\n/**\n * @export\n * @type {Event}\n */\norg.apache.royale.B.prototype.event = null;\n\n\n/**\n * @return {string}\n */\norg.apache.royale.B.prototype.foo = function() {\n  return this.event.type;\n};";
+        String expected = "/**\n * @constructor\n */\norg.apache.royale.B = function() {\n\nthis.event = new Event();\n};\n\n\n/**\n * @type {Event}\n */\norg.apache.royale.B.prototype.event = null;\n\n\n/**\n * @return {string}\n */\norg.apache.royale.B.prototype.foo = function() {\n  return this.event.type;\n};";
         assertOut(expected);
     }
 
@@ -390,7 +390,7 @@ public class TestRoyaleClass extends TestGoogClass
         IClassNode node = getClassNode("public class A {public var a:Object;protected var b:String; "
                 + "private var c:int; internal var d:uint; var e:Number}");
         asBlockWalker.visitClass(node);
-        assertOut("/**\n * @constructor\n */\norg.apache.royale.A = function() {\n};\n\n\n/**\n * @export\n * @type {Object}\n */\norg.apache.royale.A.prototype.a = null;\n\n\n/**\n * @protected\n * @type {string}\n */\norg.apache.royale.A.prototype.b = null;\n\n\n/**\n * @private\n * @type {number}\n */\norg.apache.royale.A.prototype.c = 0;\n\n\n/**\n * @package\n * @type {number}\n */\norg.apache.royale.A.prototype.d = 0;\n\n\n/**\n * @package\n * @type {number}\n */\norg.apache.royale [...]
+        assertOut("/**\n * @constructor\n */\norg.apache.royale.A = function() {\n};\n\n\n/**\n * @type {Object}\n */\norg.apache.royale.A.prototype.a = null;\n\n\n/**\n * @protected\n * @type {string}\n */\norg.apache.royale.A.prototype.b = null;\n\n\n/**\n * @private\n * @type {number}\n */\norg.apache.royale.A.prototype.c = 0;\n\n\n/**\n * @package\n * @type {number}\n */\norg.apache.royale.A.prototype.d = 0;\n\n\n/**\n * @package\n * @type {number}\n */\norg.apache.royale.A.prototype [...]
     }
 
     @Test
@@ -403,7 +403,6 @@ public class TestRoyaleClass extends TestGoogClass
         		  " */\norg.apache.royale.A = function() {\n" +
         		  "};\n\n\n" +
         		  "/**\n" +
-        		  " * @export\n" +
         		  " * @type {Object}\n" +
         		  " */\n" +
         		  "org.apache.royale.A.prototype.a_ = null;\n\n\n" +
@@ -493,7 +492,6 @@ public class TestRoyaleClass extends TestGoogClass
         		  "this.a_ = {foo:1};\n" +
         		  "};\n\n\n" +
         		  "/**\n" +
-        		  " * @export\n" +
         		  " * @type {Object}\n" +
         		  " */\n" +
         		  "org.apache.royale.A.prototype.a_ = null;\n\n\n" +
@@ -582,7 +580,6 @@ public class TestRoyaleClass extends TestGoogClass
         		  " */\norg.apache.royale.A = function() {\n" +
         		  "};\n\n\n" +
         		  "/**\n" +
-        		  " * @export\n" +
         		  " * @type {Object}\n" +
         		  " */\n" +
         		  "org.apache.royale.A.prototype.a_ = null;\n\n\n" +
@@ -632,7 +629,7 @@ public class TestRoyaleClass extends TestGoogClass
         IClassNode node = getClassNode("public class A {public static var a:int = 10;public static var b:String = initStatic(); "
                 + "private static function initStatic():String { return \"foo\"; }}");
         asBlockWalker.visitClass(node);
-        assertOut("/**\n * @constructor\n */\norg.apache.royale.A = function() {\n};\n\n\n/**\n * @export\n * @nocollapse\n * @type {number}\n */\norg.apache.royale.A.a = 10;\n\n\n/**\n * @export\n * @nocollapse\n * @type {string}\n */\norg.apache.royale.A.b;\n\n\n/**\n * @private\n * @return {string}\n */\norg.apache.royale.A.initStatic = function() {\n  return \"foo\";\n};\n\norg.apache.royale.A.b = org.apache.royale.A.initStatic();\n\n");
+        assertOut("/**\n * @constructor\n */\norg.apache.royale.A = function() {\n};\n\n\n/**\n * @nocollapse\n * @type {number}\n */\norg.apache.royale.A.a = 10;\n\n\n/**\n * @nocollapse\n * @type {string}\n */\norg.apache.royale.A.b;\n\n\n/**\n * @private\n * @return {string}\n */\norg.apache.royale.A.initStatic = function() {\n  return \"foo\";\n};\n\norg.apache.royale.A.b = org.apache.royale.A.initStatic();\n\n");
     }
     
     @Test
@@ -653,7 +650,7 @@ public class TestRoyaleClass extends TestGoogClass
                 + "private static const C:Number = 42;"
                 + "custom_namespace static const C:String = 'me' + 'you';}");
         asBlockWalker.visitClass(node);
-        assertOut("/**\n * @constructor\n */\norg.apache.royale.A = function() {\n};\n\n\n/**\n * @export\n * @nocollapse\n * @const\n * @type {number}\n */\norg.apache.royale.A.A = 42;\n\n\n/**\n * @protected\n * @nocollapse\n * @const\n * @type {number}\n */\norg.apache.royale.A.B = 42;\n\n\n/**\n * @private\n * @const\n * @type {number}\n */\norg.apache.royale.A.C = 42;\n\n\n/**\n * @const\n * @type {string}\n */\norg.apache.royale.A.http_$$ns_apache_org$2017$custom$namespace__C = 'me [...]
+        assertOut("/**\n * @constructor\n */\norg.apache.royale.A = function() {\n};\n\n\n/**\n * @nocollapse\n * @const\n * @type {number}\n */\norg.apache.royale.A.A = 42;\n\n\n/**\n * @protected\n * @nocollapse\n * @const\n * @type {number}\n */\norg.apache.royale.A.B = 42;\n\n\n/**\n * @private\n * @const\n * @type {number}\n */\norg.apache.royale.A.C = 42;\n\n\n/**\n * @const\n * @type {string}\n */\norg.apache.royale.A.http_$$ns_apache_org$2017$custom$namespace__C = 'me' + 'you';");
     }
 
     @Override
@@ -730,7 +727,7 @@ public class TestRoyaleClass extends TestGoogClass
                 + "public function foo2():String{function bar2(param1:String):String {return param1 + baz1;}; return bar2('foo');}"
                 + "}");
         asBlockWalker.visitClass(node);
-        assertOut("/**\n * @constructor\n */\norg.apache.royale.B = function() {\n};\n\n\n/**\n * @export\n * @type {string}\n */\norg.apache.royale.B.prototype.baz1 = null;\n\n\n/**\n * @return {string}\n */\norg.apache.royale.B.prototype.foo1 = function() {\n  var self = this;\n  function bar1() {\n    return self.baz1;\n  };\n  return bar1();\n};\n\n\n/**\n * @return {string}\n */\norg.apache.royale.B.prototype.foo2 = function() {\n  var self = this;\n  function bar2(param1) {\n    re [...]
+        assertOut("/**\n * @constructor\n */\norg.apache.royale.B = function() {\n};\n\n\n/**\n * @type {string}\n */\norg.apache.royale.B.prototype.baz1 = null;\n\n\n/**\n * @return {string}\n */\norg.apache.royale.B.prototype.foo1 = function() {\n  var self = this;\n  function bar1() {\n    return self.baz1;\n  };\n  return bar1();\n};\n\n\n/**\n * @return {string}\n */\norg.apache.royale.B.prototype.foo2 = function() {\n  var self = this;\n  function bar2(param1) {\n    return param1  [...]
     }
 
     @Test
@@ -837,7 +834,7 @@ public class TestRoyaleClass extends TestGoogClass
     {
         IClassNode node = getClassNode("public class A {public function A(arg1:String, arg2:int) {arg2 = arg2 + 2;} public var foo:Array = [];}");
         asBlockWalker.visitClass(node);
-        assertOut("/**\n * @constructor\n * @param {string} arg1\n * @param {number} arg2\n */\norg.apache.royale.A = function(arg1, arg2) {\n  \n  this.foo = [];\n  arg2 = (arg2 + 2) >> 0;\n};\n\n\n/**\n * @export\n * @type {Array}\n */\norg.apache.royale.A.prototype.foo = null;");
+        assertOut("/**\n * @constructor\n * @param {string} arg1\n * @param {number} arg2\n */\norg.apache.royale.A = function(arg1, arg2) {\n  \n  this.foo = [];\n  arg2 = (arg2 + 2) >> 0;\n};\n\n\n/**\n * @type {Array}\n */\norg.apache.royale.A.prototype.foo = null;");
     }
 
     @Test
@@ -853,7 +850,7 @@ public class TestRoyaleClass extends TestGoogClass
     {
         IClassNode node = getClassNode("public class A extends TestImplementation {public function A(arg1:String, arg2:int) {arg2 = arg2 + 2;} public var foo:Array = [];}");
         asBlockWalker.visitClass(node);
-        assertOut("/**\n * @constructor\n * @extends {custom.TestImplementation}\n * @param {string} arg1\n * @param {number} arg2\n */\norg.apache.royale.A = function(arg1, arg2) {\n  org.apache.royale.A.base(this, 'constructor');\n  \n  this.foo = [];\n  arg2 = (arg2 + 2) >> 0;\n};\ngoog.inherits(org.apache.royale.A, custom.TestImplementation);\n\n\n/**\n * @export\n * @type {Array}\n */\norg.apache.royale.A.prototype.foo = null;");
+        assertOut("/**\n * @constructor\n * @extends {custom.TestImplementation}\n * @param {string} arg1\n * @param {number} arg2\n */\norg.apache.royale.A = function(arg1, arg2) {\n  org.apache.royale.A.base(this, 'constructor');\n  \n  this.foo = [];\n  arg2 = (arg2 + 2) >> 0;\n};\ngoog.inherits(org.apache.royale.A, custom.TestImplementation);\n\n\n/**\n * @type {Array}\n */\norg.apache.royale.A.prototype.foo = null;");
     }
 
     @Test
@@ -861,7 +858,7 @@ public class TestRoyaleClass extends TestGoogClass
     {
         IClassNode node = getClassNode("public class A {public static const NAME:String = 'Dummy'; public function A(arg1:String = NAME) {_name = arg1;} private var _name:String;}");
         asBlockWalker.visitClass(node);
-        assertOut("/**\n * @constructor\n * @param {string=} arg1\n */\norg.apache.royale.A = function(arg1) {\n  arg1 = typeof arg1 !== 'undefined' ? arg1 : org.apache.royale.A.NAME;\n  this._name = arg1;\n};\n\n\n/**\n * @export\n * @nocollapse\n * @const\n * @type {string}\n */\norg.apache.royale.A.NAME = 'Dummy';\n\n\n/**\n * @private\n * @type {string}\n */\norg.apache.royale.A.prototype._name = null;");
+        assertOut("/**\n * @constructor\n * @param {string=} arg1\n */\norg.apache.royale.A = function(arg1) {\n  arg1 = typeof arg1 !== 'undefined' ? arg1 : org.apache.royale.A.NAME;\n  this._name = arg1;\n};\n\n\n/**\n * @nocollapse\n * @const\n * @type {string}\n */\norg.apache.royale.A.NAME = 'Dummy';\n\n\n/**\n * @private\n * @type {string}\n */\norg.apache.royale.A.prototype._name = null;");
     }
     
     protected IBackend createBackend()
diff --git a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleEmitter.java b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleEmitter.java
index 67dc6e1..a45f7d0 100644
--- a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleEmitter.java
+++ b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleEmitter.java
@@ -59,53 +59,52 @@ public class TestRoyaleEmitter extends TestGoogEmitter
         IFileNode node = compileAS(code);
         asBlockWalker.visitFile(node);
 	        assertOutWithMetadata("/**\n" +
-					" * com.example.components.MyEventTarget\n" +
-					" *\n" +
-					" * @fileoverview\n" +
-					" *\n" +
-					" * @suppress {checkTypes|accessControls}\n" +
-					" */\n" +
-					"\n" +
-					"goog.provide('com.example.components.MyEventTarget');\n" +
-					"\n" +
-					"goog.require('custom.TestImplementation');\n" +
-					"\n" +
-					"\n" +
-					"\n" +
-					"/**\n" +
-					" * @constructor\n" +
-					" * @extends {custom.TestImplementation}\n" +
-					" */\n" +
-					"com.example.components.MyEventTarget = function() {\n" +
-					"  com.example.components.MyEventTarget.base(this, 'constructor');\n" +
-					"  if (foo() != 42) {\n" +
-					"    bar();\n" +
-					"  }\n" +
-					"};\n" +
-					"goog.inherits(com.example.components.MyEventTarget, custom.TestImplementation);\n" +
-					"\n" +
-					"\n" +
-					"/**\n" +
-					" * @private\n" +
-					" * @type {string}\n" +
-					" */\n" +
-					"com.example.components.MyEventTarget.prototype._privateVar = \"do \";\n" +
-			"\n" +
-			"\n" +
-			"/**\n" +
-			" * @export\n" +
-			" * @type {number}\n" +
-			" */\n" +
-			"com.example.components.MyEventTarget.prototype.publicProperty = 100;\n" +
-			"\n" +
-			"\n" +
-			"/**\n" +
-			" * @param {string} value\n" +
-			" * @return {string}\n" +
-			" */\n" +
-			"com.example.components.MyEventTarget.prototype.myFunction = function(value) {\n" +
-			"  return \"Don't \" + this._privateVar + value;\n" +
-		"};\n" +
+				" * com.example.components.MyEventTarget\n" +
+				" *\n" +
+				" * @fileoverview\n" +
+				" *\n" +
+				" * @suppress {checkTypes|accessControls}\n" +
+				" */\n" +
+				"\n" +
+				"goog.provide('com.example.components.MyEventTarget');\n" +
+				"\n" +
+				"goog.require('custom.TestImplementation');\n" +
+				"\n" +
+				"\n" +
+				"\n" +
+				"/**\n" +
+				" * @constructor\n" +
+				" * @extends {custom.TestImplementation}\n" +
+				" */\n" +
+				"com.example.components.MyEventTarget = function() {\n" +
+				"  com.example.components.MyEventTarget.base(this, 'constructor');\n" +
+				"  if (foo() != 42) {\n" +
+				"    bar();\n" +
+				"  }\n" +
+				"};\n" +
+				"goog.inherits(com.example.components.MyEventTarget, custom.TestImplementation);\n" +
+				"\n" +
+				"\n" +
+				"/**\n" +
+				" * @private\n" +
+				" * @type {string}\n" +
+				" */\n" +
+				"com.example.components.MyEventTarget.prototype._privateVar = \"do \";\n" +
+				"\n" +
+				"\n" +
+				"/**\n" +
+				" * @type {number}\n" +
+				" */\n" +
+				"com.example.components.MyEventTarget.prototype.publicProperty = 100;\n" +
+				"\n" +
+				"\n" +
+				"/**\n" +
+				" * @param {string} value\n" +
+				" * @return {string}\n" +
+				" */\n" +
+				"com.example.components.MyEventTarget.prototype.myFunction = function(value) {\n" +
+				"  return \"Don't \" + this._privateVar + value;\n" +
+				"};\n" +
 				"\n" +
 				"\n" +
 				"/**\n" +
diff --git a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleFieldMembers.java b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleFieldMembers.java
index c715e9d..fb4b64d 100644
--- a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleFieldMembers.java
+++ b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleFieldMembers.java
@@ -52,7 +52,7 @@ public class TestRoyaleFieldMembers extends TestGoogFieldMembers
     {
         IVariableNode node = getField("public var foo:String = null;");
         asBlockWalker.visitVariable(node);
-        assertOut("/**\n * @export\n * @type {string}\n */\nRoyaleTest_A.prototype.foo = null");
+        assertOut("/**\n * @type {string}\n */\nRoyaleTest_A.prototype.foo = null");
     }
 
     @Override
@@ -61,7 +61,7 @@ public class TestRoyaleFieldMembers extends TestGoogFieldMembers
     {
         IVariableNode node = getField("public var foo:int;");
         asBlockWalker.visitVariable(node);
-        assertOut("/**\n * @export\n * @type {number}\n */\nRoyaleTest_A.prototype.foo = 0");
+        assertOut("/**\n * @type {number}\n */\nRoyaleTest_A.prototype.foo = 0");
     }
 
     @Override
@@ -70,7 +70,7 @@ public class TestRoyaleFieldMembers extends TestGoogFieldMembers
     {
         IVariableNode node = getField("public var foo:int = 420;");
         asBlockWalker.visitVariable(node);
-        assertOut("/**\n * @export\n * @type {number}\n */\nRoyaleTest_A.prototype.foo = 420");
+        assertOut("/**\n * @type {number}\n */\nRoyaleTest_A.prototype.foo = 420");
     }
 
     @Test
@@ -78,7 +78,7 @@ public class TestRoyaleFieldMembers extends TestGoogFieldMembers
     {
         IVariableNode node = getField("public var foo:int = -420;");
         asBlockWalker.visitVariable(node);
-        assertOut("/**\n * @export\n * @type {number}\n */\nRoyaleTest_A.prototype.foo = -420");
+        assertOut("/**\n * @type {number}\n */\nRoyaleTest_A.prototype.foo = -420");
     }
 
     @Test
@@ -86,7 +86,7 @@ public class TestRoyaleFieldMembers extends TestGoogFieldMembers
     {
         IVariableNode node = getField("public var foo:int = -123.4;");
         asBlockWalker.visitVariable(node);
-        assertOut("/**\n * @export\n * @type {number}\n */\nRoyaleTest_A.prototype.foo = -123");
+        assertOut("/**\n * @type {number}\n */\nRoyaleTest_A.prototype.foo = -123");
     }
 
     @Test
@@ -94,7 +94,7 @@ public class TestRoyaleFieldMembers extends TestGoogFieldMembers
     {
         IVariableNode node = getField("public var foo:uint = 123.4;");
         asBlockWalker.visitVariable(node);
-        assertOut("/**\n * @export\n * @type {number}\n */\nRoyaleTest_A.prototype.foo = 123");
+        assertOut("/**\n * @type {number}\n */\nRoyaleTest_A.prototype.foo = 123");
     }
 
     @Test
@@ -102,7 +102,7 @@ public class TestRoyaleFieldMembers extends TestGoogFieldMembers
     {
         IVariableNode node = getField("public var foo:uint = -123;");
         asBlockWalker.visitVariable(node);
-        assertOut("/**\n * @export\n * @type {number}\n */\nRoyaleTest_A.prototype.foo = 4294967173");
+        assertOut("/**\n * @type {number}\n */\nRoyaleTest_A.prototype.foo = 4294967173");
     }
 
     @Test
@@ -175,7 +175,7 @@ public class TestRoyaleFieldMembers extends TestGoogFieldMembers
     {
         IVariableNode node = getField("public static var foo:int;");
         asBlockWalker.visitVariable(node);
-        assertOut("/**\n * @export\n * @type {number}\n */\nRoyaleTest_A.foo = 0");
+        assertOut("/**\n * @type {number}\n */\nRoyaleTest_A.foo = 0");
     }
 
     @Test
@@ -210,7 +210,7 @@ public class TestRoyaleFieldMembers extends TestGoogFieldMembers
     	IClassNode node = (IClassNode) getNode("import custom.custom_namespace;use namespace custom_namespace;public static var foo:Object = initFoo(); custom_namespace static function initFoo():Object { return null; }",
         		IClassNode.class, WRAP_LEVEL_CLASS);
         asBlockWalker.visitClass(node);
-        assertOut("/**\n * @constructor\n */\nRoyaleTest_A = function() {\n};\n\n\n/**\n * @export\n * @type {Object}\n */\nRoyaleTest_A.foo;\n\n\n/**\n * @return {Object}\n */\nRoyaleTest_A.http_$$ns_apache_org$2017$custom$namespace__initFoo = function() {\n  return null;\n};\n\nRoyaleTest_A.foo = RoyaleTest_A.http_$$ns_apache_org$2017$custom$namespace__initFoo();\n\n");
+        assertOut("/**\n * @constructor\n */\nRoyaleTest_A = function() {\n};\n\n\n/**\n * @type {Object}\n */\nRoyaleTest_A.foo;\n\n\n/**\n * @return {Object}\n */\nRoyaleTest_A.http_$$ns_apache_org$2017$custom$namespace__initFoo = function() {\n  return null;\n};\n\nRoyaleTest_A.foo = RoyaleTest_A.http_$$ns_apache_org$2017$custom$namespace__initFoo();\n\n");
     }
     
     @Test
@@ -219,7 +219,7 @@ public class TestRoyaleFieldMembers extends TestGoogFieldMembers
     	IClassNode node = (IClassNode) getNode("static public var foo:Object = { 'foo': 'bar' }",
         		IClassNode.class, WRAP_LEVEL_CLASS);
         asBlockWalker.visitClass(node);
-        assertOut("/**\n * @constructor\n */\nRoyaleTest_A = function() {\n};\n\n\n/**\n * @export\n * @type {Object}\n */\nRoyaleTest_A.foo = {'foo':'bar'};");
+        assertOut("/**\n * @constructor\n */\nRoyaleTest_A = function() {\n};\n\n\n/**\n * @type {Object}\n */\nRoyaleTest_A.foo = {'foo':'bar'};");
     }
     
     @Test
@@ -259,7 +259,7 @@ public class TestRoyaleFieldMembers extends TestGoogFieldMembers
     {
         IVariableNode node = getField("public static const foo;");
         asBlockWalker.visitVariable(node);
-        assertOut("/**\n * @export\n * @const\n * @type {*}\n */\nRoyaleTest_A.foo");
+        assertOut("/**\n * @const\n * @type {*}\n */\nRoyaleTest_A.foo");
     }
 
     @Test
@@ -267,7 +267,7 @@ public class TestRoyaleFieldMembers extends TestGoogFieldMembers
     {
         IVariableNode node = getField("public const foo;");
         asBlockWalker.visitVariable(node);
-        assertOut("/**\n * @export\n * @const\n * @type {*}\n */\nRoyaleTest_A.prototype.foo");
+        assertOut("/**\n * @const\n * @type {*}\n */\nRoyaleTest_A.prototype.foo");
     }
 
     @Override
@@ -276,7 +276,7 @@ public class TestRoyaleFieldMembers extends TestGoogFieldMembers
     {
         IVariableNode node = getField("public static const foo:int;");
         asBlockWalker.visitVariable(node);
-        assertOut("/**\n * @export\n * @const\n * @type {number}\n */\nRoyaleTest_A.foo = 0");
+        assertOut("/**\n * @const\n * @type {number}\n */\nRoyaleTest_A.foo = 0");
     }
 
     @Test
@@ -284,7 +284,7 @@ public class TestRoyaleFieldMembers extends TestGoogFieldMembers
     {
         IVariableNode node = getField("public const foo:int;");
         asBlockWalker.visitVariable(node);
-        assertOut("/**\n * @export\n * @const\n * @type {number}\n */\nRoyaleTest_A.prototype.foo = 0");
+        assertOut("/**\n * @const\n * @type {number}\n */\nRoyaleTest_A.prototype.foo = 0");
     }
 
     @Override
@@ -293,7 +293,7 @@ public class TestRoyaleFieldMembers extends TestGoogFieldMembers
     {
         IVariableNode node = getField("public static const foo:int = 420;");
         asBlockWalker.visitVariable(node);
-        assertOut("/**\n * @export\n * @const\n * @type {number}\n */\nRoyaleTest_A.foo = 420");
+        assertOut("/**\n * @const\n * @type {number}\n */\nRoyaleTest_A.foo = 420");
     }
 
     @Test
@@ -301,7 +301,7 @@ public class TestRoyaleFieldMembers extends TestGoogFieldMembers
     {
         IVariableNode node = getField("public static const foo:Number = parseFloat('1E2');");
         asBlockWalker.visitVariable(node);
-        assertOut("/**\n * @export\n * @const\n * @type {number}\n */\nRoyaleTest_A.foo = parseFloat('1E2')");
+        assertOut("/**\n * @const\n * @type {number}\n */\nRoyaleTest_A.foo = parseFloat('1E2')");
     }
 
     @Test
@@ -309,7 +309,7 @@ public class TestRoyaleFieldMembers extends TestGoogFieldMembers
     {
         IVariableNode node = getField("public const foo:int = 420;");
         asBlockWalker.visitVariable(node);
-        assertOut("/**\n * @export\n * @const\n * @type {number}\n */\nRoyaleTest_A.prototype.foo = 420");
+        assertOut("/**\n * @const\n * @type {number}\n */\nRoyaleTest_A.prototype.foo = 420");
     }
 
     @Test
diff --git a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyalePackage.java b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyalePackage.java
index 7d61fc4..cbced0a 100644
--- a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyalePackage.java
+++ b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyalePackage.java
@@ -713,7 +713,6 @@ public class TestRoyalePackage extends TestGoogPackage
 				"\n" +
 				"\n" +
 				"/**\n" +
-				" * @export\n" +
 				" * @nocollapse\n" +
 				" * @type {string}\n" +
 				" */\n" +
@@ -1146,7 +1145,6 @@ public class TestRoyalePackage extends TestGoogPackage
 				"\n" +
 				"\n" +
 				"/**\n" +
-				" * @export\n" +
 				" * @nocollapse\n" +
 				" * @const\n" +
 				" * @type {number}\n" +
diff --git a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLApplication.java b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLApplication.java
index e435712..b5511f3 100644
--- a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLApplication.java
+++ b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLApplication.java
@@ -900,7 +900,6 @@ public class TestRoyaleMXMLApplication extends RoyaleTestBase
         		"\n" +
 				"\n" +
         		"/**\n" +
-        		" * @export\n" +
         		" * @type {binding.ComplexValueObject}\n" +
         		" */\n" +
         		"AppName.prototype.firstOne = null;\n" +
@@ -1077,7 +1076,6 @@ public class TestRoyaleMXMLApplication extends RoyaleTestBase
         		"\n" +
 				"\n" +
         		"/**\n" +
-        		" * @export\n" +
         		" * @type {XML}\n" +
         		" */\n" +
         		"AppName.prototype.xml = null;\n" +
diff --git a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLScript.java b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLScript.java
index e42f4a1..cfd5acf 100644
--- a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLScript.java
+++ b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLScript.java
@@ -274,7 +274,6 @@ public class TestRoyaleMXMLScript extends RoyaleTestBase
         		"\n" +
 				"\n" +
 				"/**\n" +
-				" * @export\n" +
 				" * @type {Array}\n" +
 				" */\n" +
 				"AppName.prototype.foo;\n" +
@@ -378,14 +377,12 @@ public class TestRoyaleMXMLScript extends RoyaleTestBase
 				"  Object.defineProperty(AppName, 'foo', { value: value, writable: true });\n" +
 				"};\n" +
 				"/**\n" +
-				" * @export\n" +
 				" * @type {string}\n" +
 				" */\n" +
 				"AppName.foo;\n" +
 				"\n" +
 				"Object.defineProperties(AppName, /** @lends {AppName} */ {\n" +
 				"/**\n" +
-				" * @export\n" +
 				" * @type {string}\n" +
 				" */\n" +
 				"foo: {\n" +
@@ -482,7 +479,6 @@ public class TestRoyaleMXMLScript extends RoyaleTestBase
         		"\n" +
 				"\n" +
 				"/**\n" +
-				" * @export\n" +
 				" * @type {string}\n" +
 				" */\n" +
 				"AppName.foo = 'foo';\n" +
@@ -576,7 +572,6 @@ public class TestRoyaleMXMLScript extends RoyaleTestBase
         		"\n" +
 				"\n" +
 				"/**\n" +
-				" * @export\n" +
 				" * @type {Array}\n" +
 				" */\n" +
 				"AppName.foo = ['foo'];\n" +
@@ -677,7 +672,6 @@ public class TestRoyaleMXMLScript extends RoyaleTestBase
 				"  return value;\n" +
 				"};\n" +
 				"/**\n" +
-				" * @export\n" +
 				" * @const\n" +
 				" * @type {string}\n" +
 				" */\n" +
@@ -685,7 +679,6 @@ public class TestRoyaleMXMLScript extends RoyaleTestBase
 				"\n" +
 				"Object.defineProperties(AppName, /** @lends {AppName} */ {\n" +
 				"/**\n" +
-				" * @export\n" +
 				" * @const\n" +
 				" * @type {string}\n" +
 				" */\n" +
diff --git a/compiler-jx/src/test/resources/royale/projects/internal/MainClass_result.js b/compiler-jx/src/test/resources/royale/projects/internal/MainClass_result.js
index 266e02b..52e26f7 100644
--- a/compiler-jx/src/test/resources/royale/projects/internal/MainClass_result.js
+++ b/compiler-jx/src/test/resources/royale/projects/internal/MainClass_result.js
@@ -73,7 +73,6 @@ MainClass.InternalClass = function() {
 
 
 /**
- * @export
  * @type {OtherClass}
  */
 MainClass.InternalClass.prototype.foo = null;


Re: [royale-compiler] branch develop updated: compiler-jx: dynamically export variables in release builds instead of using export annotations

Posted by Carlos Rovira <ca...@apache.org>.
Hi Josh,

I was testing some apps this morning as I did full rebuild and seems all is
fine.
I detect a fail in the TodoMVC-Crux example, but reverting your changes
exposed that something broke with View:


getDefinitionByName.js:59 Uncaught ReferenceError: Error #1065: Variable
org.apache.royale.jewel.View is not defined.
    at iq (getDefinitionByName.js:59)
    at kq.M.Pj (TypeDefinition.as:389)
    at my.M.fromTypeDefinition (TypeDescriptor.as:167)
    at Function.Gq.getTypeDescriptor (TypeCache.as:60)
    at Function.ss.constructBean (BeanFactory.as:616)
    at Function.qs.setUp (CruxManager.as:106)
    at ss.M.setUpEventHandler (BeanFactory.as:517)
    at Iz.M.fireListeners (EventDispatcher.as:131)
    at xp (eventtarget.js:372)
    at Cw.M.Ko (JSStageEvents.as:209)

but seems not related to your changes.
Maybe something done in these past months in compiler or in framework
caused this.
Going to check what could be the problem

thanks


El mié., 2 sept. 2020 a las 18:56, Josh Tynjala (<jo...@bowlerhat.dev>)
escribió:

> Please let me know if this compiler change breaks anything in your apps.
> I'll get any issues fixed ASAP.
>
> --
> Josh Tynjala
> Bowler Hat LLC <https://bowlerhat.dev>
>
>
> On Wed, Sep 2, 2020 at 9:54 AM <jo...@apache.org> wrote:
>
> > 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
> >
> >
> > The following commit(s) were added to refs/heads/develop by this push:
> >      new 3b7cf0d  compiler-jx: dynamically export variables in release
> > builds instead of using export annotations
> > 3b7cf0d is described below
> >
> > commit 3b7cf0d3b2282a32dcaf19314760e56566be4174
> > Author: Josh Tynjala <jo...@apache.org>
> > AuthorDate: Wed Sep 2 09:54:00 2020 -0700
> >
> >     compiler-jx: dynamically export variables in release builds instead
> of
> > using export annotations
> >
> >     This is a continuation of previous work that dynamically exported
> > types and methods. Still need to do getters/setters.
> > ---
> >  .../javascript/jscomp/GenerateRoyaleExports.java   | 126
> > +++++++++++++++++++++
> >  .../javascript/jscomp/RoyaleClosurePassConfig.java |  32 ++----
> >  .../codegen/js/royale/JSRoyaleDocEmitter.java      |  22 +---
> >  .../apache/royale/compiler/utils/ClosureUtils.java |   7 +-
> >  .../codegen/js/royale/TestRoyaleClass.java         |  21 ++--
> >  .../codegen/js/royale/TestRoyaleEmitter.java       |  93 ++++++++-------
> >  .../codegen/js/royale/TestRoyaleFieldMembers.java  |  34 +++---
> >  .../codegen/js/royale/TestRoyalePackage.java       |   2 -
> >  .../mxml/royale/TestRoyaleMXMLApplication.java     |   2 -
> >  .../codegen/mxml/royale/TestRoyaleMXMLScript.java  |   7 --
> >  .../royale/projects/internal/MainClass_result.js   |   1 -
> >  11 files changed, 216 insertions(+), 131 deletions(-)
> >
> > diff --git
> >
> a/compiler-jx/src/main/java/com/google/javascript/jscomp/GenerateRoyaleExports.java
> >
> b/compiler-jx/src/main/java/com/google/javascript/jscomp/GenerateRoyaleExports.java
> > new file mode 100644
> > index 0000000..16997ac
> > --- /dev/null
> > +++
> >
> b/compiler-jx/src/main/java/com/google/javascript/jscomp/GenerateRoyaleExports.java
> > @@ -0,0 +1,126 @@
> > +/*
> > + *
> > + *  Licensed to the Apache Software Foundation (ASF) under one or more
> > + *  contributor license agreements.  See the NOTICE file distributed
> with
> > + *  this work for additional information regarding copyright ownership.
> > + *  The ASF licenses this file to You under the Apache License, Version
> > 2.0
> > + *  (the "License"); you may not use this file except in compliance with
> > + *  the License.  You may obtain a copy of the License at
> > + *
> > + *      http://www.apache.org/licenses/LICENSE-2.0
> > + *
> > + *  Unless required by applicable law or agreed to in writing, software
> > + *  distributed under the License is distributed on an "AS IS" BASIS,
> > + *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> > implied.
> > + *  See the License for the specific language governing permissions and
> > + *  limitations under the License.
> > + *
> > + */
> > +package com.google.javascript.jscomp;
> > +
> > +import java.util.Set;
> > +
> > +import
> > com.google.javascript.jscomp.NodeTraversal.AbstractPostOrderCallback;
> > +import com.google.javascript.rhino.IR;
> > +import com.google.javascript.rhino.JSDocInfo;
> > +import com.google.javascript.rhino.Node;
> > +import com.google.javascript.rhino.Token;
> > +
> > +public class GenerateRoyaleExports extends AbstractPostOrderCallback {
> > +
> > +       private final AbstractCompiler compiler;
> > +       private Set<String> extraSymbolNamesToExport;
> > +
> > +       public GenerateRoyaleExports(AbstractCompiler compiler) {
> > +         this.compiler = compiler;
> > +       }
> > +
> > +       public void process(Node externs, Node root, Set<String>
> > extraSymbolNamesToExport) {
> > +               this.extraSymbolNamesToExport = extraSymbolNamesToExport;
> > +               NodeTraversal.traverse(compiler, root, this);
> > +       }
> > +
> > +       @Override
> > +       public void visit(NodeTraversal t, Node n, Node parent) {
> > +               if(n.getToken() != Token.ASSIGN) {
> > +                       return;
> > +               }
> > +               JSDocInfo docInfo = n.getJSDocInfo();
> > +               if(docInfo == null) {
> > +                       return;
> > +               }
> > +               Node firstChild = n.getFirstChild();
> > +               if (!firstChild.isQualifiedName()) {
> > +                       return;
> > +               }
> > +               String qualifiedName = firstChild.getQualifiedName();
> > +               if(!extraSymbolNamesToExport.contains(qualifiedName)) {
> > +                       //System.err.println("~~~ NO MATCH! " +
> > qualifiedName);
> > +                       return;
> > +               }
> > +
> > +               Node parentNode = n.getParent();
> > +
> > +               if(parentNode == null) {
> > +                       return;
> > +               }
> > +
> > +               Node gpNode = parentNode.getParent();
> > +
> > +               if(gpNode == null || !gpNode.isScript()) {
> > +                       return;
> > +               }
> > +               //System.err.println("*** MATCH! " + qualifiedName);
> > +
> > +               addExportSymbolCall(qualifiedName, n);
> > +       }
> > +
> > +       private void addExportSymbolCall(String export, Node context) {
> > +         Node call =
> > +                 IR.call(
> > +                         NodeUtil.newQName(
> > +                                 compiler,
> > compiler.getCodingConvention().getExportSymbolFunction(),
> > +                                 context, export),
> > +                         IR.string(export),
> > +                         NodeUtil.newQName(
> > +                                 compiler, export,
> > +                                 context, export));
> > +
> > +         Node expression =
> > IR.exprResult(call).useSourceInfoIfMissingFromForTree(context);
> > +         annotate(expression);
> > +
> > +         addStatement(context, expression);
> > +       }
> > +
> > +       private void addStatement(Node context, Node stmt) {
> > +         CodingConvention convention = compiler.getCodingConvention();
> > +
> > +         Node n = context;
> > +         Node exprRoot = n;
> > +         while (!NodeUtil.isStatementBlock(exprRoot.getParent())) {
> > +               exprRoot = exprRoot.getParent();
> > +         }
> > +
> > +         // It's important that any class-building calls (goog.inherits)
> > +         // come right after the class definition, so move the export
> > after that.
> > +         while (true) {
> > +               Node next = exprRoot.getNext();
> > +               if (next != null
> > +                       && NodeUtil.isExprCall(next)
> > +                       &&
> > convention.getClassesDefinedByCall(next.getFirstChild()) != null) {
> > +                 exprRoot = next;
> > +               } else {
> > +                 break;
> > +               }
> > +         }
> > +
> > +         Node block = exprRoot.getParent();
> > +         block.addChildAfter(stmt, exprRoot);
> > +         compiler.reportChangeToEnclosingScope(stmt);
> > +       }
> > +
> > +       private void annotate(Node node) {
> > +         NodeTraversal.traverse(
> > +                 compiler, node, new PrepareAst.PrepareAnnotations());
> > +       }
> > +}
> > \ No newline at end of file
> > diff --git
> >
> a/compiler-jx/src/main/java/com/google/javascript/jscomp/RoyaleClosurePassConfig.java
> >
> b/compiler-jx/src/main/java/com/google/javascript/jscomp/RoyaleClosurePassConfig.java
> > index 92f3cc8..c332a81 100644
> > ---
> >
> a/compiler-jx/src/main/java/com/google/javascript/jscomp/RoyaleClosurePassConfig.java
> > +++
> >
> b/compiler-jx/src/main/java/com/google/javascript/jscomp/RoyaleClosurePassConfig.java
> > @@ -344,6 +344,10 @@ public final class RoyaleClosurePassConfig extends
> > PassConfig {
> >        checks.add(angularPass);
> >      }
> >
> > +    if (extraSymbolNamesToExport != null) {
> > +      checks.add(generateRoyaleExports);
> > +    }
> > +
> >      if (!options.generateExportsAfterTypeChecking &&
> > options.generateExports) {
> >        checks.add(generateExports);
> >      }
> > @@ -362,10 +366,6 @@ public final class RoyaleClosurePassConfig extends
> > PassConfig {
> >        checks.add(polymerPass);
> >      }
> >
> > -    if (extraSymbolNamesToExport != null) {
> > -      checks.add(extraSymbolsPass);
> > -    }
> > -
> >      if (options.checkSuspiciousCode
> >          || options.enables(DiagnosticGroups.GLOBAL_THIS)
> >          ||
> options.enables(DiagnosticGroups.DEBUGGER_STATEMENT_PRESENT)) {
> > @@ -1268,31 +1268,15 @@ public final class RoyaleClosurePassConfig
> extends
> > PassConfig {
> >          }
> >        };
> >
> > -  private final PassFactory extraSymbolsPass =
> > -    new PassFactory("extra-symbols-to-export", true) {
> > +  private final PassFactory generateRoyaleExports =
> > +    new PassFactory("generate-royale-exports", true) {
> >        @Override
> >        protected CompilerPass create(final AbstractCompiler compiler) {
> > +        final GenerateRoyaleExports pass = new
> > GenerateRoyaleExports(compiler);
> >          return new CompilerPass() {
> >            @Override
> >            public void process(Node externs, Node root) {
> > -            Node scriptNode = compiler.getScriptNode(sourceFileName);
> > -            for(String nameToExport : extraSymbolNamesToExport)
> > -            {
> > -              Node exportCallTarget = NodeUtil.newQName(compiler,
> > -
> > compiler.getCodingConvention().getExportSymbolFunction(), scriptNode,
> > nameToExport);
> > -              Node call = IR.call(exportCallTarget);
> > -              if (exportCallTarget.isName()) {
> > -                call.putBooleanProp(Node.FREE_CALL, true);
> > -              }
> > -              call.addChildToBack(IR.string(nameToExport));
> > -              call.addChildToBack(NodeUtil.newQName(compiler,
> > -              nameToExport, scriptNode, nameToExport));
> > -
> > -              Node expression = IR.exprResult(call);
> > -
> > -              scriptNode.addChildToBack(expression);
> > -              compiler.reportChangeToEnclosingScope(expression);
> > -            }
> > +            pass.process(externs, root, extraSymbolNamesToExport);
> >            }
> >          };
> >        }
> > 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 6e403d3..05d27c2 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
> > @@ -594,23 +594,11 @@ public class JSRoyaleDocEmitter extends
> > JSGoogDocEmitter
> >      public void emitFieldDoc(IVariableNode node, IDefinition def,
> > ICompilerProject project)
> >      {
> >          RoyaleJSProject fjp =  (RoyaleJSProject)project;
> > -        boolean suppressExports = false;
> > -        if (emitter instanceof JSRoyaleEmitter) {
> > -            suppressExports = ((JSRoyaleEmitter)
> > emitter).getModel().suppressExports;
> > -        }
> > -        if (fjp.config != null)
> > -        {
> > -               emitExports = !suppressExports &&
> > fjp.config.getExportPublicSymbols();
> > -               exportProtected = !suppressExports &&
> > fjp.config.getExportProtectedSymbols();
> > -               exportInternal = !suppressExports &&
> > fjp.config.getExportInternalSymbols();
> > -        }
> > -        else
> > -        {
> > -            emitExports = !suppressExports;
> > -            exportProtected = false;
> > -            exportInternal = false;
> > -        }
> > -        emitExports = emitExports &&
> >
> !node.getVariableClassification().equals(VariableClassification.PACKAGE_MEMBER);
> > +
> > +        //exporting fields is handled dynamically in ClosureUtils
> > +        emitExports = false;
> > +        exportProtected = false;
> > +        exportInternal = false;
> >
> >          begin();
> >
> > diff --git
> >
> a/compiler-jx/src/main/java/org/apache/royale/compiler/utils/ClosureUtils.java
> >
> b/compiler-jx/src/main/java/org/apache/royale/compiler/utils/ClosureUtils.java
> > index 17676c7..a7ccbd8 100644
> > ---
> >
> a/compiler-jx/src/main/java/org/apache/royale/compiler/utils/ClosureUtils.java
> > +++
> >
> b/compiler-jx/src/main/java/org/apache/royale/compiler/utils/ClosureUtils.java
> > @@ -195,8 +195,11 @@ public class ClosureUtils
> >                              {
> >                                  continue;
> >                              }
> > -                            if (localDef instanceof IFunctionDefinition
> > -                                    && !(localDef instanceof
> > IAccessorDefinition))
> > +                            boolean isMethod = localDef instanceof
> > IFunctionDefinition
> > +                                && !(localDef instanceof
> > IAccessorDefinition);
> > +                            boolean isVar = localDef instanceof
> > IVariableDefinition
> > +                                && !(localDef instanceof
> > IAccessorDefinition);
> > +                            if (isMethod || isVar)
> >                              {
> >                                  INamespaceReference nsRef =
> > localDef.getNamespaceReference();
> >                                  boolean isCustomNS =
> > !nsRef.isLanguageNamespace();
> > diff --git
> >
> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleClass.java
> >
> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleClass.java
> > index 88f7032..e3a6d4e 100644
> > ---
> >
> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleClass.java
> > +++
> >
> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleClass.java
> > @@ -126,7 +126,7 @@ public class TestRoyaleClass extends TestGoogClass
> >      {
> >          IClassNode node = getClassNode("public class B {public function
> > B(arg1:String) {this.arg1 = arg1}; public var arg1:String;}");
> >          asBlockWalker.visitClass(node);
> > -        String expected = "/**\n * @constructor\n * @param {string}
> > arg1\n */\norg.apache.royale.B = function(arg1) {\n  this.arg1 =
> > arg1;\n};\n\n\n/**\n * @export\n * @type {string}\n
> > */\norg.apache.royale.B.prototype.arg1 = null;";
> > +        String expected = "/**\n * @constructor\n * @param {string}
> > arg1\n */\norg.apache.royale.B = function(arg1) {\n  this.arg1 =
> > arg1;\n};\n\n\n/**\n * @type {string}\n
> > */\norg.apache.royale.B.prototype.arg1 = null;";
> >          assertOut(expected);
> >      }
> >
> > @@ -135,7 +135,7 @@ public class TestRoyaleClass extends TestGoogClass
> >      {
> >          IClassNode node = getClassNode("public class B {public function
> > B() {}; public var event:Event = new Event(); public function
> foo():String
> > {return event.type;};}");
> >          asBlockWalker.visitClass(node);
> > -        String expected = "/**\n * @constructor\n
> */\norg.apache.royale.B
> > = function() {\n\nthis.event = new Event();\n};\n\n\n/**\n * @export\n *
> > @type {Event}\n */\norg.apache.royale.B.prototype.event =
> null;\n\n\n/**\n
> > * @return {string}\n */\norg.apache.royale.B.prototype.foo = function()
> > {\n  return this.event.type;\n};";
> > +        String expected = "/**\n * @constructor\n
> */\norg.apache.royale.B
> > = function() {\n\nthis.event = new Event();\n};\n\n\n/**\n * @type
> > {Event}\n */\norg.apache.royale.B.prototype.event = null;\n\n\n/**\n *
> > @return {string}\n */\norg.apache.royale.B.prototype.foo = function() {\n
> > return this.event.type;\n};";
> >          assertOut(expected);
> >      }
> >
> > @@ -390,7 +390,7 @@ public class TestRoyaleClass extends TestGoogClass
> >          IClassNode node = getClassNode("public class A {public var
> > a:Object;protected var b:String; "
> >                  + "private var c:int; internal var d:uint; var
> > e:Number}");
> >          asBlockWalker.visitClass(node);
> > -        assertOut("/**\n * @constructor\n */\norg.apache.royale.A =
> > function() {\n};\n\n\n/**\n * @export\n * @type {Object}\n
> > */\norg.apache.royale.A.prototype.a = null;\n\n\n/**\n * @protected\n *
> > @type {string}\n */\norg.apache.royale.A.prototype.b = null;\n\n\n/**\n *
> > @private\n * @type {number}\n */\norg.apache.royale.A.prototype.c =
> > 0;\n\n\n/**\n * @package\n * @type {number}\n
> > */\norg.apache.royale.A.prototype.d = 0;\n\n\n/**\n * @package\n * @type
> > {number}\n */\norg.apache.royale [...]
> > +        assertOut("/**\n * @constructor\n */\norg.apache.royale.A =
> > function() {\n};\n\n\n/**\n * @type {Object}\n
> > */\norg.apache.royale.A.prototype.a = null;\n\n\n/**\n * @protected\n *
> > @type {string}\n */\norg.apache.royale.A.prototype.b = null;\n\n\n/**\n *
> > @private\n * @type {number}\n */\norg.apache.royale.A.prototype.c =
> > 0;\n\n\n/**\n * @package\n * @type {number}\n
> > */\norg.apache.royale.A.prototype.d = 0;\n\n\n/**\n * @package\n * @type
> > {number}\n */\norg.apache.royale.A.prototype [...]
> >      }
> >
> >      @Test
> > @@ -403,7 +403,6 @@ public class TestRoyaleClass extends TestGoogClass
> >                           " */\norg.apache.royale.A = function() {\n" +
> >                           "};\n\n\n" +
> >                           "/**\n" +
> > -                         " * @export\n" +
> >                           " * @type {Object}\n" +
> >                           " */\n" +
> >                           "org.apache.royale.A.prototype.a_ =
> null;\n\n\n"
> > +
> > @@ -493,7 +492,6 @@ public class TestRoyaleClass extends TestGoogClass
> >                           "this.a_ = {foo:1};\n" +
> >                           "};\n\n\n" +
> >                           "/**\n" +
> > -                         " * @export\n" +
> >                           " * @type {Object}\n" +
> >                           " */\n" +
> >                           "org.apache.royale.A.prototype.a_ =
> null;\n\n\n"
> > +
> > @@ -582,7 +580,6 @@ public class TestRoyaleClass extends TestGoogClass
> >                           " */\norg.apache.royale.A = function() {\n" +
> >                           "};\n\n\n" +
> >                           "/**\n" +
> > -                         " * @export\n" +
> >                           " * @type {Object}\n" +
> >                           " */\n" +
> >                           "org.apache.royale.A.prototype.a_ =
> null;\n\n\n"
> > +
> > @@ -632,7 +629,7 @@ public class TestRoyaleClass extends TestGoogClass
> >          IClassNode node = getClassNode("public class A {public static
> var
> > a:int = 10;public static var b:String = initStatic(); "
> >                  + "private static function initStatic():String { return
> > \"foo\"; }}");
> >          asBlockWalker.visitClass(node);
> > -        assertOut("/**\n * @constructor\n */\norg.apache.royale.A =
> > function() {\n};\n\n\n/**\n * @export\n * @nocollapse\n * @type
> {number}\n
> > */\norg.apache.royale.A.a = 10;\n\n\n/**\n * @export\n * @nocollapse\n *
> > @type {string}\n */\norg.apache.royale.A.b;\n\n\n/**\n * @private\n *
> > @return {string}\n */\norg.apache.royale.A.initStatic = function() {\n
> > return \"foo\";\n};\n\norg.apache.royale.A.b =
> > org.apache.royale.A.initStatic();\n\n");
> > +        assertOut("/**\n * @constructor\n */\norg.apache.royale.A =
> > function() {\n};\n\n\n/**\n * @nocollapse\n * @type {number}\n
> > */\norg.apache.royale.A.a = 10;\n\n\n/**\n * @nocollapse\n * @type
> > {string}\n */\norg.apache.royale.A.b;\n\n\n/**\n * @private\n * @return
> > {string}\n */\norg.apache.royale.A.initStatic = function() {\n  return
> > \"foo\";\n};\n\norg.apache.royale.A.b =
> > org.apache.royale.A.initStatic();\n\n");
> >      }
> >
> >      @Test
> > @@ -653,7 +650,7 @@ public class TestRoyaleClass extends TestGoogClass
> >                  + "private static const C:Number = 42;"
> >                  + "custom_namespace static const C:String = 'me' +
> > 'you';}");
> >          asBlockWalker.visitClass(node);
> > -        assertOut("/**\n * @constructor\n */\norg.apache.royale.A =
> > function() {\n};\n\n\n/**\n * @export\n * @nocollapse\n * @const\n *
> @type
> > {number}\n */\norg.apache.royale.A.A = 42;\n\n\n/**\n * @protected\n *
> > @nocollapse\n * @const\n * @type {number}\n */\norg.apache.royale.A.B =
> > 42;\n\n\n/**\n * @private\n * @const\n * @type {number}\n
> > */\norg.apache.royale.A.C = 42;\n\n\n/**\n * @const\n * @type {string}\n
> > */\norg.apache.royale.A.http_$$ns_apache_org$2017$custom$namespace__C =
> 'me
> > [...]
> > +        assertOut("/**\n * @constructor\n */\norg.apache.royale.A =
> > function() {\n};\n\n\n/**\n * @nocollapse\n * @const\n * @type {number}\n
> > */\norg.apache.royale.A.A = 42;\n\n\n/**\n * @protected\n *
> @nocollapse\n *
> > @const\n * @type {number}\n */\norg.apache.royale.A.B = 42;\n\n\n/**\n *
> > @private\n * @const\n * @type {number}\n */\norg.apache.royale.A.C =
> > 42;\n\n\n/**\n * @const\n * @type {string}\n
> > */\norg.apache.royale.A.http_$$ns_apache_org$2017$custom$namespace__C =
> > 'me' + 'you';");
> >      }
> >
> >      @Override
> > @@ -730,7 +727,7 @@ public class TestRoyaleClass extends TestGoogClass
> >                  + "public function foo2():String{function
> > bar2(param1:String):String {return param1 + baz1;}; return bar2('foo');}"
> >                  + "}");
> >          asBlockWalker.visitClass(node);
> > -        assertOut("/**\n * @constructor\n */\norg.apache.royale.B =
> > function() {\n};\n\n\n/**\n * @export\n * @type {string}\n
> > */\norg.apache.royale.B.prototype.baz1 = null;\n\n\n/**\n * @return
> > {string}\n */\norg.apache.royale.B.prototype.foo1 = function() {\n  var
> > self = this;\n  function bar1() {\n    return self.baz1;\n  };\n  return
> > bar1();\n};\n\n\n/**\n * @return {string}\n
> > */\norg.apache.royale.B.prototype.foo2 = function() {\n  var self =
> > this;\n  function bar2(param1) {\n    re [...]
> > +        assertOut("/**\n * @constructor\n */\norg.apache.royale.B =
> > function() {\n};\n\n\n/**\n * @type {string}\n
> > */\norg.apache.royale.B.prototype.baz1 = null;\n\n\n/**\n * @return
> > {string}\n */\norg.apache.royale.B.prototype.foo1 = function() {\n  var
> > self = this;\n  function bar1() {\n    return self.baz1;\n  };\n  return
> > bar1();\n};\n\n\n/**\n * @return {string}\n
> > */\norg.apache.royale.B.prototype.foo2 = function() {\n  var self =
> > this;\n  function bar2(param1) {\n    return param1  [...]
> >      }
> >
> >      @Test
> > @@ -837,7 +834,7 @@ public class TestRoyaleClass extends TestGoogClass
> >      {
> >          IClassNode node = getClassNode("public class A {public function
> > A(arg1:String, arg2:int) {arg2 = arg2 + 2;} public var foo:Array =
> [];}");
> >          asBlockWalker.visitClass(node);
> > -        assertOut("/**\n * @constructor\n * @param {string} arg1\n *
> > @param {number} arg2\n */\norg.apache.royale.A = function(arg1, arg2) {\n
> > \n  this.foo = [];\n  arg2 = (arg2 + 2) >> 0;\n};\n\n\n/**\n * @export\n
> *
> > @type {Array}\n */\norg.apache.royale.A.prototype.foo = null;");
> > +        assertOut("/**\n * @constructor\n * @param {string} arg1\n *
> > @param {number} arg2\n */\norg.apache.royale.A = function(arg1, arg2) {\n
> > \n  this.foo = [];\n  arg2 = (arg2 + 2) >> 0;\n};\n\n\n/**\n * @type
> > {Array}\n */\norg.apache.royale.A.prototype.foo = null;");
> >      }
> >
> >      @Test
> > @@ -853,7 +850,7 @@ public class TestRoyaleClass extends TestGoogClass
> >      {
> >          IClassNode node = getClassNode("public class A extends
> > TestImplementation {public function A(arg1:String, arg2:int) {arg2 =
> arg2 +
> > 2;} public var foo:Array = [];}");
> >          asBlockWalker.visitClass(node);
> > -        assertOut("/**\n * @constructor\n * @extends
> > {custom.TestImplementation}\n * @param {string} arg1\n * @param {number}
> > arg2\n */\norg.apache.royale.A = function(arg1, arg2) {\n
> > org.apache.royale.A.base(this, 'constructor');\n  \n  this.foo = [];\n
> > arg2 = (arg2 + 2) >> 0;\n};\ngoog.inherits(org.apache.royale.A,
> > custom.TestImplementation);\n\n\n/**\n * @export\n * @type {Array}\n
> > */\norg.apache.royale.A.prototype.foo = null;");
> > +        assertOut("/**\n * @constructor\n * @extends
> > {custom.TestImplementation}\n * @param {string} arg1\n * @param {number}
> > arg2\n */\norg.apache.royale.A = function(arg1, arg2) {\n
> > org.apache.royale.A.base(this, 'constructor');\n  \n  this.foo = [];\n
> > arg2 = (arg2 + 2) >> 0;\n};\ngoog.inherits(org.apache.royale.A,
> > custom.TestImplementation);\n\n\n/**\n * @type {Array}\n
> > */\norg.apache.royale.A.prototype.foo = null;");
> >      }
> >
> >      @Test
> > @@ -861,7 +858,7 @@ public class TestRoyaleClass extends TestGoogClass
> >      {
> >          IClassNode node = getClassNode("public class A {public static
> > const NAME:String = 'Dummy'; public function A(arg1:String = NAME)
> {_name =
> > arg1;} private var _name:String;}");
> >          asBlockWalker.visitClass(node);
> > -        assertOut("/**\n * @constructor\n * @param {string=} arg1\n
> > */\norg.apache.royale.A = function(arg1) {\n  arg1 = typeof arg1 !==
> > 'undefined' ? arg1 : org.apache.royale.A.NAME;\n  this._name =
> > arg1;\n};\n\n\n/**\n * @export\n * @nocollapse\n * @const\n * @type
> > {string}\n */\norg.apache.royale.A.NAME = 'Dummy';\n\n\n/**\n *
> > @private\n * @type {string}\n */\norg.apache.royale.A.prototype._name =
> > null;");
> > +        assertOut("/**\n * @constructor\n * @param {string=} arg1\n
> > */\norg.apache.royale.A = function(arg1) {\n  arg1 = typeof arg1 !==
> > 'undefined' ? arg1 : org.apache.royale.A.NAME;\n  this._name =
> > arg1;\n};\n\n\n/**\n * @nocollapse\n * @const\n * @type {string}\n */\
> > norg.apache.royale.A.NAME = 'Dummy';\n\n\n/**\n * @private\n * @type
> > {string}\n */\norg.apache.royale.A.prototype._name = null;");
> >      }
> >
> >      protected IBackend createBackend()
> > diff --git
> >
> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleEmitter.java
> >
> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleEmitter.java
> > index 67dc6e1..a45f7d0 100644
> > ---
> >
> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleEmitter.java
> > +++
> >
> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleEmitter.java
> > @@ -59,53 +59,52 @@ public class TestRoyaleEmitter extends
> TestGoogEmitter
> >          IFileNode node = compileAS(code);
> >          asBlockWalker.visitFile(node);
> >                 assertOutWithMetadata("/**\n" +
> > -                                       " *
> > com.example.components.MyEventTarget\n" +
> > -                                       " *\n" +
> > -                                       " * @fileoverview\n" +
> > -                                       " *\n" +
> > -                                       " * @suppress
> > {checkTypes|accessControls}\n" +
> > -                                       " */\n" +
> > -                                       "\n" +
> > -
> >  "goog.provide('com.example.components.MyEventTarget');\n" +
> > -                                       "\n" +
> > -
> >  "goog.require('custom.TestImplementation');\n" +
> > -                                       "\n" +
> > -                                       "\n" +
> > -                                       "\n" +
> > -                                       "/**\n" +
> > -                                       " * @constructor\n" +
> > -                                       " * @extends
> > {custom.TestImplementation}\n" +
> > -                                       " */\n" +
> > -
> >  "com.example.components.MyEventTarget = function() {\n" +
> > -                                       "
> > com.example.components.MyEventTarget.base(this, 'constructor');\n" +
> > -                                       "  if (foo() != 42) {\n" +
> > -                                       "    bar();\n" +
> > -                                       "  }\n" +
> > -                                       "};\n" +
> > -
> >  "goog.inherits(com.example.components.MyEventTarget,
> > custom.TestImplementation);\n" +
> > -                                       "\n" +
> > -                                       "\n" +
> > -                                       "/**\n" +
> > -                                       " * @private\n" +
> > -                                       " * @type {string}\n" +
> > -                                       " */\n" +
> > -
> >  "com.example.components.MyEventTarget.prototype._privateVar = \"do
> \";\n" +
> > -                       "\n" +
> > -                       "\n" +
> > -                       "/**\n" +
> > -                       " * @export\n" +
> > -                       " * @type {number}\n" +
> > -                       " */\n" +
> > -
> >  "com.example.components.MyEventTarget.prototype.publicProperty =
> 100;\n" +
> > -                       "\n" +
> > -                       "\n" +
> > -                       "/**\n" +
> > -                       " * @param {string} value\n" +
> > -                       " * @return {string}\n" +
> > -                       " */\n" +
> > -
> >  "com.example.components.MyEventTarget.prototype.myFunction =
> > function(value) {\n" +
> > -                       "  return \"Don't \" + this._privateVar +
> > value;\n" +
> > -               "};\n" +
> > +                               " *
> > com.example.components.MyEventTarget\n" +
> > +                               " *\n" +
> > +                               " * @fileoverview\n" +
> > +                               " *\n" +
> > +                               " * @suppress
> > {checkTypes|accessControls}\n" +
> > +                               " */\n" +
> > +                               "\n" +
> > +
> >  "goog.provide('com.example.components.MyEventTarget');\n" +
> > +                               "\n" +
> > +
> >  "goog.require('custom.TestImplementation');\n" +
> > +                               "\n" +
> > +                               "\n" +
> > +                               "\n" +
> > +                               "/**\n" +
> > +                               " * @constructor\n" +
> > +                               " * @extends
> > {custom.TestImplementation}\n" +
> > +                               " */\n" +
> > +                               "com.example.components.MyEventTarget =
> > function() {\n" +
> > +                               "
> > com.example.components.MyEventTarget.base(this, 'constructor');\n" +
> > +                               "  if (foo() != 42) {\n" +
> > +                               "    bar();\n" +
> > +                               "  }\n" +
> > +                               "};\n" +
> > +
> >  "goog.inherits(com.example.components.MyEventTarget,
> > custom.TestImplementation);\n" +
> > +                               "\n" +
> > +                               "\n" +
> > +                               "/**\n" +
> > +                               " * @private\n" +
> > +                               " * @type {string}\n" +
> > +                               " */\n" +
> > +
> >  "com.example.components.MyEventTarget.prototype._privateVar = \"do
> \";\n" +
> > +                               "\n" +
> > +                               "\n" +
> > +                               "/**\n" +
> > +                               " * @type {number}\n" +
> > +                               " */\n" +
> > +
> >  "com.example.components.MyEventTarget.prototype.publicProperty =
> 100;\n" +
> > +                               "\n" +
> > +                               "\n" +
> > +                               "/**\n" +
> > +                               " * @param {string} value\n" +
> > +                               " * @return {string}\n" +
> > +                               " */\n" +
> > +
> >  "com.example.components.MyEventTarget.prototype.myFunction =
> > function(value) {\n" +
> > +                               "  return \"Don't \" + this._privateVar +
> > value;\n" +
> > +                               "};\n" +
> >                                 "\n" +
> >                                 "\n" +
> >                                 "/**\n" +
> > diff --git
> >
> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleFieldMembers.java
> >
> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleFieldMembers.java
> > index c715e9d..fb4b64d 100644
> > ---
> >
> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleFieldMembers.java
> > +++
> >
> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleFieldMembers.java
> > @@ -52,7 +52,7 @@ public class TestRoyaleFieldMembers extends
> > TestGoogFieldMembers
> >      {
> >          IVariableNode node = getField("public var foo:String = null;");
> >          asBlockWalker.visitVariable(node);
> > -        assertOut("/**\n * @export\n * @type {string}\n
> > */\nRoyaleTest_A.prototype.foo = null");
> > +        assertOut("/**\n * @type {string}\n
> > */\nRoyaleTest_A.prototype.foo = null");
> >      }
> >
> >      @Override
> > @@ -61,7 +61,7 @@ public class TestRoyaleFieldMembers extends
> > TestGoogFieldMembers
> >      {
> >          IVariableNode node = getField("public var foo:int;");
> >          asBlockWalker.visitVariable(node);
> > -        assertOut("/**\n * @export\n * @type {number}\n
> > */\nRoyaleTest_A.prototype.foo = 0");
> > +        assertOut("/**\n * @type {number}\n
> > */\nRoyaleTest_A.prototype.foo = 0");
> >      }
> >
> >      @Override
> > @@ -70,7 +70,7 @@ public class TestRoyaleFieldMembers extends
> > TestGoogFieldMembers
> >      {
> >          IVariableNode node = getField("public var foo:int = 420;");
> >          asBlockWalker.visitVariable(node);
> > -        assertOut("/**\n * @export\n * @type {number}\n
> > */\nRoyaleTest_A.prototype.foo = 420");
> > +        assertOut("/**\n * @type {number}\n
> > */\nRoyaleTest_A.prototype.foo = 420");
> >      }
> >
> >      @Test
> > @@ -78,7 +78,7 @@ public class TestRoyaleFieldMembers extends
> > TestGoogFieldMembers
> >      {
> >          IVariableNode node = getField("public var foo:int = -420;");
> >          asBlockWalker.visitVariable(node);
> > -        assertOut("/**\n * @export\n * @type {number}\n
> > */\nRoyaleTest_A.prototype.foo = -420");
> > +        assertOut("/**\n * @type {number}\n
> > */\nRoyaleTest_A.prototype.foo = -420");
> >      }
> >
> >      @Test
> > @@ -86,7 +86,7 @@ public class TestRoyaleFieldMembers extends
> > TestGoogFieldMembers
> >      {
> >          IVariableNode node = getField("public var foo:int = -123.4;");
> >          asBlockWalker.visitVariable(node);
> > -        assertOut("/**\n * @export\n * @type {number}\n
> > */\nRoyaleTest_A.prototype.foo = -123");
> > +        assertOut("/**\n * @type {number}\n
> > */\nRoyaleTest_A.prototype.foo = -123");
> >      }
> >
> >      @Test
> > @@ -94,7 +94,7 @@ public class TestRoyaleFieldMembers extends
> > TestGoogFieldMembers
> >      {
> >          IVariableNode node = getField("public var foo:uint = 123.4;");
> >          asBlockWalker.visitVariable(node);
> > -        assertOut("/**\n * @export\n * @type {number}\n
> > */\nRoyaleTest_A.prototype.foo = 123");
> > +        assertOut("/**\n * @type {number}\n
> > */\nRoyaleTest_A.prototype.foo = 123");
> >      }
> >
> >      @Test
> > @@ -102,7 +102,7 @@ public class TestRoyaleFieldMembers extends
> > TestGoogFieldMembers
> >      {
> >          IVariableNode node = getField("public var foo:uint = -123;");
> >          asBlockWalker.visitVariable(node);
> > -        assertOut("/**\n * @export\n * @type {number}\n
> > */\nRoyaleTest_A.prototype.foo = 4294967173");
> > +        assertOut("/**\n * @type {number}\n
> > */\nRoyaleTest_A.prototype.foo = 4294967173");
> >      }
> >
> >      @Test
> > @@ -175,7 +175,7 @@ public class TestRoyaleFieldMembers extends
> > TestGoogFieldMembers
> >      {
> >          IVariableNode node = getField("public static var foo:int;");
> >          asBlockWalker.visitVariable(node);
> > -        assertOut("/**\n * @export\n * @type {number}\n
> > */\nRoyaleTest_A.foo = 0");
> > +        assertOut("/**\n * @type {number}\n */\nRoyaleTest_A.foo = 0");
> >      }
> >
> >      @Test
> > @@ -210,7 +210,7 @@ public class TestRoyaleFieldMembers extends
> > TestGoogFieldMembers
> >         IClassNode node = (IClassNode) getNode("import
> > custom.custom_namespace;use namespace custom_namespace;public static var
> > foo:Object = initFoo(); custom_namespace static function
> initFoo():Object {
> > return null; }",
> >                         IClassNode.class, WRAP_LEVEL_CLASS);
> >          asBlockWalker.visitClass(node);
> > -        assertOut("/**\n * @constructor\n */\nRoyaleTest_A = function()
> > {\n};\n\n\n/**\n * @export\n * @type {Object}\n
> > */\nRoyaleTest_A.foo;\n\n\n/**\n * @return {Object}\n
> > */\nRoyaleTest_A.http_$$ns_apache_org$2017$custom$namespace__initFoo =
> > function() {\n  return null;\n};\n\nRoyaleTest_A.foo =
> >
> RoyaleTest_A.http_$$ns_apache_org$2017$custom$namespace__initFoo();\n\n");
> > +        assertOut("/**\n * @constructor\n */\nRoyaleTest_A = function()
> > {\n};\n\n\n/**\n * @type {Object}\n */\nRoyaleTest_A.foo;\n\n\n/**\n *
> > @return {Object}\n
> > */\nRoyaleTest_A.http_$$ns_apache_org$2017$custom$namespace__initFoo =
> > function() {\n  return null;\n};\n\nRoyaleTest_A.foo =
> >
> RoyaleTest_A.http_$$ns_apache_org$2017$custom$namespace__initFoo();\n\n");
> >      }
> >
> >      @Test
> > @@ -219,7 +219,7 @@ public class TestRoyaleFieldMembers extends
> > TestGoogFieldMembers
> >         IClassNode node = (IClassNode) getNode("static public var
> > foo:Object = { 'foo': 'bar' }",
> >                         IClassNode.class, WRAP_LEVEL_CLASS);
> >          asBlockWalker.visitClass(node);
> > -        assertOut("/**\n * @constructor\n */\nRoyaleTest_A = function()
> > {\n};\n\n\n/**\n * @export\n * @type {Object}\n */\nRoyaleTest_A.foo =
> > {'foo':'bar'};");
> > +        assertOut("/**\n * @constructor\n */\nRoyaleTest_A = function()
> > {\n};\n\n\n/**\n * @type {Object}\n */\nRoyaleTest_A.foo =
> {'foo':'bar'};");
> >      }
> >
> >      @Test
> > @@ -259,7 +259,7 @@ public class TestRoyaleFieldMembers extends
> > TestGoogFieldMembers
> >      {
> >          IVariableNode node = getField("public static const foo;");
> >          asBlockWalker.visitVariable(node);
> > -        assertOut("/**\n * @export\n * @const\n * @type {*}\n
> > */\nRoyaleTest_A.foo");
> > +        assertOut("/**\n * @const\n * @type {*}\n
> */\nRoyaleTest_A.foo");
> >      }
> >
> >      @Test
> > @@ -267,7 +267,7 @@ public class TestRoyaleFieldMembers extends
> > TestGoogFieldMembers
> >      {
> >          IVariableNode node = getField("public const foo;");
> >          asBlockWalker.visitVariable(node);
> > -        assertOut("/**\n * @export\n * @const\n * @type {*}\n
> > */\nRoyaleTest_A.prototype.foo");
> > +        assertOut("/**\n * @const\n * @type {*}\n
> > */\nRoyaleTest_A.prototype.foo");
> >      }
> >
> >      @Override
> > @@ -276,7 +276,7 @@ public class TestRoyaleFieldMembers extends
> > TestGoogFieldMembers
> >      {
> >          IVariableNode node = getField("public static const foo:int;");
> >          asBlockWalker.visitVariable(node);
> > -        assertOut("/**\n * @export\n * @const\n * @type {number}\n
> > */\nRoyaleTest_A.foo = 0");
> > +        assertOut("/**\n * @const\n * @type {number}\n
> > */\nRoyaleTest_A.foo = 0");
> >      }
> >
> >      @Test
> > @@ -284,7 +284,7 @@ public class TestRoyaleFieldMembers extends
> > TestGoogFieldMembers
> >      {
> >          IVariableNode node = getField("public const foo:int;");
> >          asBlockWalker.visitVariable(node);
> > -        assertOut("/**\n * @export\n * @const\n * @type {number}\n
> > */\nRoyaleTest_A.prototype.foo = 0");
> > +        assertOut("/**\n * @const\n * @type {number}\n
> > */\nRoyaleTest_A.prototype.foo = 0");
> >      }
> >
> >      @Override
> > @@ -293,7 +293,7 @@ public class TestRoyaleFieldMembers extends
> > TestGoogFieldMembers
> >      {
> >          IVariableNode node = getField("public static const foo:int =
> > 420;");
> >          asBlockWalker.visitVariable(node);
> > -        assertOut("/**\n * @export\n * @const\n * @type {number}\n
> > */\nRoyaleTest_A.foo = 420");
> > +        assertOut("/**\n * @const\n * @type {number}\n
> > */\nRoyaleTest_A.foo = 420");
> >      }
> >
> >      @Test
> > @@ -301,7 +301,7 @@ public class TestRoyaleFieldMembers extends
> > TestGoogFieldMembers
> >      {
> >          IVariableNode node = getField("public static const foo:Number =
> > parseFloat('1E2');");
> >          asBlockWalker.visitVariable(node);
> > -        assertOut("/**\n * @export\n * @const\n * @type {number}\n
> > */\nRoyaleTest_A.foo = parseFloat('1E2')");
> > +        assertOut("/**\n * @const\n * @type {number}\n
> > */\nRoyaleTest_A.foo = parseFloat('1E2')");
> >      }
> >
> >      @Test
> > @@ -309,7 +309,7 @@ public class TestRoyaleFieldMembers extends
> > TestGoogFieldMembers
> >      {
> >          IVariableNode node = getField("public const foo:int = 420;");
> >          asBlockWalker.visitVariable(node);
> > -        assertOut("/**\n * @export\n * @const\n * @type {number}\n
> > */\nRoyaleTest_A.prototype.foo = 420");
> > +        assertOut("/**\n * @const\n * @type {number}\n
> > */\nRoyaleTest_A.prototype.foo = 420");
> >      }
> >
> >      @Test
> > diff --git
> >
> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyalePackage.java
> >
> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyalePackage.java
> > index 7d61fc4..cbced0a 100644
> > ---
> >
> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyalePackage.java
> > +++
> >
> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyalePackage.java
> > @@ -713,7 +713,6 @@ public class TestRoyalePackage extends
> TestGoogPackage
> >                                 "\n" +
> >                                 "\n" +
> >                                 "/**\n" +
> > -                               " * @export\n" +
> >                                 " * @nocollapse\n" +
> >                                 " * @type {string}\n" +
> >                                 " */\n" +
> > @@ -1146,7 +1145,6 @@ public class TestRoyalePackage extends
> > TestGoogPackage
> >                                 "\n" +
> >                                 "\n" +
> >                                 "/**\n" +
> > -                               " * @export\n" +
> >                                 " * @nocollapse\n" +
> >                                 " * @const\n" +
> >                                 " * @type {number}\n" +
> > diff --git
> >
> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLApplication.java
> >
> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLApplication.java
> > index e435712..b5511f3 100644
> > ---
> >
> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLApplication.java
> > +++
> >
> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLApplication.java
> > @@ -900,7 +900,6 @@ public class TestRoyaleMXMLApplication extends
> > RoyaleTestBase
> >                         "\n" +
> >                                 "\n" +
> >                         "/**\n" +
> > -                       " * @export\n" +
> >                         " * @type {binding.ComplexValueObject}\n" +
> >                         " */\n" +
> >                         "AppName.prototype.firstOne = null;\n" +
> > @@ -1077,7 +1076,6 @@ public class TestRoyaleMXMLApplication extends
> > RoyaleTestBase
> >                         "\n" +
> >                                 "\n" +
> >                         "/**\n" +
> > -                       " * @export\n" +
> >                         " * @type {XML}\n" +
> >                         " */\n" +
> >                         "AppName.prototype.xml = null;\n" +
> > diff --git
> >
> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLScript.java
> >
> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLScript.java
> > index e42f4a1..cfd5acf 100644
> > ---
> >
> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLScript.java
> > +++
> >
> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLScript.java
> > @@ -274,7 +274,6 @@ public class TestRoyaleMXMLScript extends
> > RoyaleTestBase
> >                         "\n" +
> >                                 "\n" +
> >                                 "/**\n" +
> > -                               " * @export\n" +
> >                                 " * @type {Array}\n" +
> >                                 " */\n" +
> >                                 "AppName.prototype.foo;\n" +
> > @@ -378,14 +377,12 @@ public class TestRoyaleMXMLScript extends
> > RoyaleTestBase
> >                                 "  Object.defineProperty(AppName, 'foo',
> {
> > value: value, writable: true });\n" +
> >                                 "};\n" +
> >                                 "/**\n" +
> > -                               " * @export\n" +
> >                                 " * @type {string}\n" +
> >                                 " */\n" +
> >                                 "AppName.foo;\n" +
> >                                 "\n" +
> >                                 "Object.defineProperties(AppName, /**
> > @lends {AppName} */ {\n" +
> >                                 "/**\n" +
> > -                               " * @export\n" +
> >                                 " * @type {string}\n" +
> >                                 " */\n" +
> >                                 "foo: {\n" +
> > @@ -482,7 +479,6 @@ public class TestRoyaleMXMLScript extends
> > RoyaleTestBase
> >                         "\n" +
> >                                 "\n" +
> >                                 "/**\n" +
> > -                               " * @export\n" +
> >                                 " * @type {string}\n" +
> >                                 " */\n" +
> >                                 "AppName.foo = 'foo';\n" +
> > @@ -576,7 +572,6 @@ public class TestRoyaleMXMLScript extends
> > RoyaleTestBase
> >                         "\n" +
> >                                 "\n" +
> >                                 "/**\n" +
> > -                               " * @export\n" +
> >                                 " * @type {Array}\n" +
> >                                 " */\n" +
> >                                 "AppName.foo = ['foo'];\n" +
> > @@ -677,7 +672,6 @@ public class TestRoyaleMXMLScript extends
> > RoyaleTestBase
> >                                 "  return value;\n" +
> >                                 "};\n" +
> >                                 "/**\n" +
> > -                               " * @export\n" +
> >                                 " * @const\n" +
> >                                 " * @type {string}\n" +
> >                                 " */\n" +
> > @@ -685,7 +679,6 @@ public class TestRoyaleMXMLScript extends
> > RoyaleTestBase
> >                                 "\n" +
> >                                 "Object.defineProperties(AppName, /**
> > @lends {AppName} */ {\n" +
> >                                 "/**\n" +
> > -                               " * @export\n" +
> >                                 " * @const\n" +
> >                                 " * @type {string}\n" +
> >                                 " */\n" +
> > diff --git
> >
> a/compiler-jx/src/test/resources/royale/projects/internal/MainClass_result.js
> >
> b/compiler-jx/src/test/resources/royale/projects/internal/MainClass_result.js
> > index 266e02b..52e26f7 100644
> > ---
> >
> a/compiler-jx/src/test/resources/royale/projects/internal/MainClass_result.js
> > +++
> >
> b/compiler-jx/src/test/resources/royale/projects/internal/MainClass_result.js
> > @@ -73,7 +73,6 @@ MainClass.InternalClass = function() {
> >
> >
> >  /**
> > - * @export
> >   * @type {OtherClass}
> >   */
> >  MainClass.InternalClass.prototype.foo = null;
> >
> >
>


-- 
Carlos Rovira
http://about.me/carlosrovira

Re: [royale-compiler] branch develop updated: compiler-jx: dynamically export variables in release builds instead of using export annotations

Posted by Josh Tynjala <jo...@bowlerhat.dev>.
Please let me know if this compiler change breaks anything in your apps.
I'll get any issues fixed ASAP.

--
Josh Tynjala
Bowler Hat LLC <https://bowlerhat.dev>


On Wed, Sep 2, 2020 at 9:54 AM <jo...@apache.org> wrote:

> 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
>
>
> The following commit(s) were added to refs/heads/develop by this push:
>      new 3b7cf0d  compiler-jx: dynamically export variables in release
> builds instead of using export annotations
> 3b7cf0d is described below
>
> commit 3b7cf0d3b2282a32dcaf19314760e56566be4174
> Author: Josh Tynjala <jo...@apache.org>
> AuthorDate: Wed Sep 2 09:54:00 2020 -0700
>
>     compiler-jx: dynamically export variables in release builds instead of
> using export annotations
>
>     This is a continuation of previous work that dynamically exported
> types and methods. Still need to do getters/setters.
> ---
>  .../javascript/jscomp/GenerateRoyaleExports.java   | 126
> +++++++++++++++++++++
>  .../javascript/jscomp/RoyaleClosurePassConfig.java |  32 ++----
>  .../codegen/js/royale/JSRoyaleDocEmitter.java      |  22 +---
>  .../apache/royale/compiler/utils/ClosureUtils.java |   7 +-
>  .../codegen/js/royale/TestRoyaleClass.java         |  21 ++--
>  .../codegen/js/royale/TestRoyaleEmitter.java       |  93 ++++++++-------
>  .../codegen/js/royale/TestRoyaleFieldMembers.java  |  34 +++---
>  .../codegen/js/royale/TestRoyalePackage.java       |   2 -
>  .../mxml/royale/TestRoyaleMXMLApplication.java     |   2 -
>  .../codegen/mxml/royale/TestRoyaleMXMLScript.java  |   7 --
>  .../royale/projects/internal/MainClass_result.js   |   1 -
>  11 files changed, 216 insertions(+), 131 deletions(-)
>
> diff --git
> a/compiler-jx/src/main/java/com/google/javascript/jscomp/GenerateRoyaleExports.java
> b/compiler-jx/src/main/java/com/google/javascript/jscomp/GenerateRoyaleExports.java
> new file mode 100644
> index 0000000..16997ac
> --- /dev/null
> +++
> b/compiler-jx/src/main/java/com/google/javascript/jscomp/GenerateRoyaleExports.java
> @@ -0,0 +1,126 @@
> +/*
> + *
> + *  Licensed to the Apache Software Foundation (ASF) under one or more
> + *  contributor license agreements.  See the NOTICE file distributed with
> + *  this work for additional information regarding copyright ownership.
> + *  The ASF licenses this file to You under the Apache License, Version
> 2.0
> + *  (the "License"); you may not use this file except in compliance with
> + *  the License.  You may obtain a copy of the License at
> + *
> + *      http://www.apache.org/licenses/LICENSE-2.0
> + *
> + *  Unless required by applicable law or agreed to in writing, software
> + *  distributed under the License is distributed on an "AS IS" BASIS,
> + *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> + *  See the License for the specific language governing permissions and
> + *  limitations under the License.
> + *
> + */
> +package com.google.javascript.jscomp;
> +
> +import java.util.Set;
> +
> +import
> com.google.javascript.jscomp.NodeTraversal.AbstractPostOrderCallback;
> +import com.google.javascript.rhino.IR;
> +import com.google.javascript.rhino.JSDocInfo;
> +import com.google.javascript.rhino.Node;
> +import com.google.javascript.rhino.Token;
> +
> +public class GenerateRoyaleExports extends AbstractPostOrderCallback {
> +
> +       private final AbstractCompiler compiler;
> +       private Set<String> extraSymbolNamesToExport;
> +
> +       public GenerateRoyaleExports(AbstractCompiler compiler) {
> +         this.compiler = compiler;
> +       }
> +
> +       public void process(Node externs, Node root, Set<String>
> extraSymbolNamesToExport) {
> +               this.extraSymbolNamesToExport = extraSymbolNamesToExport;
> +               NodeTraversal.traverse(compiler, root, this);
> +       }
> +
> +       @Override
> +       public void visit(NodeTraversal t, Node n, Node parent) {
> +               if(n.getToken() != Token.ASSIGN) {
> +                       return;
> +               }
> +               JSDocInfo docInfo = n.getJSDocInfo();
> +               if(docInfo == null) {
> +                       return;
> +               }
> +               Node firstChild = n.getFirstChild();
> +               if (!firstChild.isQualifiedName()) {
> +                       return;
> +               }
> +               String qualifiedName = firstChild.getQualifiedName();
> +               if(!extraSymbolNamesToExport.contains(qualifiedName)) {
> +                       //System.err.println("~~~ NO MATCH! " +
> qualifiedName);
> +                       return;
> +               }
> +
> +               Node parentNode = n.getParent();
> +
> +               if(parentNode == null) {
> +                       return;
> +               }
> +
> +               Node gpNode = parentNode.getParent();
> +
> +               if(gpNode == null || !gpNode.isScript()) {
> +                       return;
> +               }
> +               //System.err.println("*** MATCH! " + qualifiedName);
> +
> +               addExportSymbolCall(qualifiedName, n);
> +       }
> +
> +       private void addExportSymbolCall(String export, Node context) {
> +         Node call =
> +                 IR.call(
> +                         NodeUtil.newQName(
> +                                 compiler,
> compiler.getCodingConvention().getExportSymbolFunction(),
> +                                 context, export),
> +                         IR.string(export),
> +                         NodeUtil.newQName(
> +                                 compiler, export,
> +                                 context, export));
> +
> +         Node expression =
> IR.exprResult(call).useSourceInfoIfMissingFromForTree(context);
> +         annotate(expression);
> +
> +         addStatement(context, expression);
> +       }
> +
> +       private void addStatement(Node context, Node stmt) {
> +         CodingConvention convention = compiler.getCodingConvention();
> +
> +         Node n = context;
> +         Node exprRoot = n;
> +         while (!NodeUtil.isStatementBlock(exprRoot.getParent())) {
> +               exprRoot = exprRoot.getParent();
> +         }
> +
> +         // It's important that any class-building calls (goog.inherits)
> +         // come right after the class definition, so move the export
> after that.
> +         while (true) {
> +               Node next = exprRoot.getNext();
> +               if (next != null
> +                       && NodeUtil.isExprCall(next)
> +                       &&
> convention.getClassesDefinedByCall(next.getFirstChild()) != null) {
> +                 exprRoot = next;
> +               } else {
> +                 break;
> +               }
> +         }
> +
> +         Node block = exprRoot.getParent();
> +         block.addChildAfter(stmt, exprRoot);
> +         compiler.reportChangeToEnclosingScope(stmt);
> +       }
> +
> +       private void annotate(Node node) {
> +         NodeTraversal.traverse(
> +                 compiler, node, new PrepareAst.PrepareAnnotations());
> +       }
> +}
> \ No newline at end of file
> diff --git
> a/compiler-jx/src/main/java/com/google/javascript/jscomp/RoyaleClosurePassConfig.java
> b/compiler-jx/src/main/java/com/google/javascript/jscomp/RoyaleClosurePassConfig.java
> index 92f3cc8..c332a81 100644
> ---
> a/compiler-jx/src/main/java/com/google/javascript/jscomp/RoyaleClosurePassConfig.java
> +++
> b/compiler-jx/src/main/java/com/google/javascript/jscomp/RoyaleClosurePassConfig.java
> @@ -344,6 +344,10 @@ public final class RoyaleClosurePassConfig extends
> PassConfig {
>        checks.add(angularPass);
>      }
>
> +    if (extraSymbolNamesToExport != null) {
> +      checks.add(generateRoyaleExports);
> +    }
> +
>      if (!options.generateExportsAfterTypeChecking &&
> options.generateExports) {
>        checks.add(generateExports);
>      }
> @@ -362,10 +366,6 @@ public final class RoyaleClosurePassConfig extends
> PassConfig {
>        checks.add(polymerPass);
>      }
>
> -    if (extraSymbolNamesToExport != null) {
> -      checks.add(extraSymbolsPass);
> -    }
> -
>      if (options.checkSuspiciousCode
>          || options.enables(DiagnosticGroups.GLOBAL_THIS)
>          || options.enables(DiagnosticGroups.DEBUGGER_STATEMENT_PRESENT)) {
> @@ -1268,31 +1268,15 @@ public final class RoyaleClosurePassConfig extends
> PassConfig {
>          }
>        };
>
> -  private final PassFactory extraSymbolsPass =
> -    new PassFactory("extra-symbols-to-export", true) {
> +  private final PassFactory generateRoyaleExports =
> +    new PassFactory("generate-royale-exports", true) {
>        @Override
>        protected CompilerPass create(final AbstractCompiler compiler) {
> +        final GenerateRoyaleExports pass = new
> GenerateRoyaleExports(compiler);
>          return new CompilerPass() {
>            @Override
>            public void process(Node externs, Node root) {
> -            Node scriptNode = compiler.getScriptNode(sourceFileName);
> -            for(String nameToExport : extraSymbolNamesToExport)
> -            {
> -              Node exportCallTarget = NodeUtil.newQName(compiler,
> -
> compiler.getCodingConvention().getExportSymbolFunction(), scriptNode,
> nameToExport);
> -              Node call = IR.call(exportCallTarget);
> -              if (exportCallTarget.isName()) {
> -                call.putBooleanProp(Node.FREE_CALL, true);
> -              }
> -              call.addChildToBack(IR.string(nameToExport));
> -              call.addChildToBack(NodeUtil.newQName(compiler,
> -              nameToExport, scriptNode, nameToExport));
> -
> -              Node expression = IR.exprResult(call);
> -
> -              scriptNode.addChildToBack(expression);
> -              compiler.reportChangeToEnclosingScope(expression);
> -            }
> +            pass.process(externs, root, extraSymbolNamesToExport);
>            }
>          };
>        }
> 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 6e403d3..05d27c2 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
> @@ -594,23 +594,11 @@ public class JSRoyaleDocEmitter extends
> JSGoogDocEmitter
>      public void emitFieldDoc(IVariableNode node, IDefinition def,
> ICompilerProject project)
>      {
>          RoyaleJSProject fjp =  (RoyaleJSProject)project;
> -        boolean suppressExports = false;
> -        if (emitter instanceof JSRoyaleEmitter) {
> -            suppressExports = ((JSRoyaleEmitter)
> emitter).getModel().suppressExports;
> -        }
> -        if (fjp.config != null)
> -        {
> -               emitExports = !suppressExports &&
> fjp.config.getExportPublicSymbols();
> -               exportProtected = !suppressExports &&
> fjp.config.getExportProtectedSymbols();
> -               exportInternal = !suppressExports &&
> fjp.config.getExportInternalSymbols();
> -        }
> -        else
> -        {
> -            emitExports = !suppressExports;
> -            exportProtected = false;
> -            exportInternal = false;
> -        }
> -        emitExports = emitExports &&
> !node.getVariableClassification().equals(VariableClassification.PACKAGE_MEMBER);
> +
> +        //exporting fields is handled dynamically in ClosureUtils
> +        emitExports = false;
> +        exportProtected = false;
> +        exportInternal = false;
>
>          begin();
>
> diff --git
> a/compiler-jx/src/main/java/org/apache/royale/compiler/utils/ClosureUtils.java
> b/compiler-jx/src/main/java/org/apache/royale/compiler/utils/ClosureUtils.java
> index 17676c7..a7ccbd8 100644
> ---
> a/compiler-jx/src/main/java/org/apache/royale/compiler/utils/ClosureUtils.java
> +++
> b/compiler-jx/src/main/java/org/apache/royale/compiler/utils/ClosureUtils.java
> @@ -195,8 +195,11 @@ public class ClosureUtils
>                              {
>                                  continue;
>                              }
> -                            if (localDef instanceof IFunctionDefinition
> -                                    && !(localDef instanceof
> IAccessorDefinition))
> +                            boolean isMethod = localDef instanceof
> IFunctionDefinition
> +                                && !(localDef instanceof
> IAccessorDefinition);
> +                            boolean isVar = localDef instanceof
> IVariableDefinition
> +                                && !(localDef instanceof
> IAccessorDefinition);
> +                            if (isMethod || isVar)
>                              {
>                                  INamespaceReference nsRef =
> localDef.getNamespaceReference();
>                                  boolean isCustomNS =
> !nsRef.isLanguageNamespace();
> diff --git
> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleClass.java
> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleClass.java
> index 88f7032..e3a6d4e 100644
> ---
> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleClass.java
> +++
> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleClass.java
> @@ -126,7 +126,7 @@ public class TestRoyaleClass extends TestGoogClass
>      {
>          IClassNode node = getClassNode("public class B {public function
> B(arg1:String) {this.arg1 = arg1}; public var arg1:String;}");
>          asBlockWalker.visitClass(node);
> -        String expected = "/**\n * @constructor\n * @param {string}
> arg1\n */\norg.apache.royale.B = function(arg1) {\n  this.arg1 =
> arg1;\n};\n\n\n/**\n * @export\n * @type {string}\n
> */\norg.apache.royale.B.prototype.arg1 = null;";
> +        String expected = "/**\n * @constructor\n * @param {string}
> arg1\n */\norg.apache.royale.B = function(arg1) {\n  this.arg1 =
> arg1;\n};\n\n\n/**\n * @type {string}\n
> */\norg.apache.royale.B.prototype.arg1 = null;";
>          assertOut(expected);
>      }
>
> @@ -135,7 +135,7 @@ public class TestRoyaleClass extends TestGoogClass
>      {
>          IClassNode node = getClassNode("public class B {public function
> B() {}; public var event:Event = new Event(); public function foo():String
> {return event.type;};}");
>          asBlockWalker.visitClass(node);
> -        String expected = "/**\n * @constructor\n */\norg.apache.royale.B
> = function() {\n\nthis.event = new Event();\n};\n\n\n/**\n * @export\n *
> @type {Event}\n */\norg.apache.royale.B.prototype.event = null;\n\n\n/**\n
> * @return {string}\n */\norg.apache.royale.B.prototype.foo = function()
> {\n  return this.event.type;\n};";
> +        String expected = "/**\n * @constructor\n */\norg.apache.royale.B
> = function() {\n\nthis.event = new Event();\n};\n\n\n/**\n * @type
> {Event}\n */\norg.apache.royale.B.prototype.event = null;\n\n\n/**\n *
> @return {string}\n */\norg.apache.royale.B.prototype.foo = function() {\n
> return this.event.type;\n};";
>          assertOut(expected);
>      }
>
> @@ -390,7 +390,7 @@ public class TestRoyaleClass extends TestGoogClass
>          IClassNode node = getClassNode("public class A {public var
> a:Object;protected var b:String; "
>                  + "private var c:int; internal var d:uint; var
> e:Number}");
>          asBlockWalker.visitClass(node);
> -        assertOut("/**\n * @constructor\n */\norg.apache.royale.A =
> function() {\n};\n\n\n/**\n * @export\n * @type {Object}\n
> */\norg.apache.royale.A.prototype.a = null;\n\n\n/**\n * @protected\n *
> @type {string}\n */\norg.apache.royale.A.prototype.b = null;\n\n\n/**\n *
> @private\n * @type {number}\n */\norg.apache.royale.A.prototype.c =
> 0;\n\n\n/**\n * @package\n * @type {number}\n
> */\norg.apache.royale.A.prototype.d = 0;\n\n\n/**\n * @package\n * @type
> {number}\n */\norg.apache.royale [...]
> +        assertOut("/**\n * @constructor\n */\norg.apache.royale.A =
> function() {\n};\n\n\n/**\n * @type {Object}\n
> */\norg.apache.royale.A.prototype.a = null;\n\n\n/**\n * @protected\n *
> @type {string}\n */\norg.apache.royale.A.prototype.b = null;\n\n\n/**\n *
> @private\n * @type {number}\n */\norg.apache.royale.A.prototype.c =
> 0;\n\n\n/**\n * @package\n * @type {number}\n
> */\norg.apache.royale.A.prototype.d = 0;\n\n\n/**\n * @package\n * @type
> {number}\n */\norg.apache.royale.A.prototype [...]
>      }
>
>      @Test
> @@ -403,7 +403,6 @@ public class TestRoyaleClass extends TestGoogClass
>                           " */\norg.apache.royale.A = function() {\n" +
>                           "};\n\n\n" +
>                           "/**\n" +
> -                         " * @export\n" +
>                           " * @type {Object}\n" +
>                           " */\n" +
>                           "org.apache.royale.A.prototype.a_ = null;\n\n\n"
> +
> @@ -493,7 +492,6 @@ public class TestRoyaleClass extends TestGoogClass
>                           "this.a_ = {foo:1};\n" +
>                           "};\n\n\n" +
>                           "/**\n" +
> -                         " * @export\n" +
>                           " * @type {Object}\n" +
>                           " */\n" +
>                           "org.apache.royale.A.prototype.a_ = null;\n\n\n"
> +
> @@ -582,7 +580,6 @@ public class TestRoyaleClass extends TestGoogClass
>                           " */\norg.apache.royale.A = function() {\n" +
>                           "};\n\n\n" +
>                           "/**\n" +
> -                         " * @export\n" +
>                           " * @type {Object}\n" +
>                           " */\n" +
>                           "org.apache.royale.A.prototype.a_ = null;\n\n\n"
> +
> @@ -632,7 +629,7 @@ public class TestRoyaleClass extends TestGoogClass
>          IClassNode node = getClassNode("public class A {public static var
> a:int = 10;public static var b:String = initStatic(); "
>                  + "private static function initStatic():String { return
> \"foo\"; }}");
>          asBlockWalker.visitClass(node);
> -        assertOut("/**\n * @constructor\n */\norg.apache.royale.A =
> function() {\n};\n\n\n/**\n * @export\n * @nocollapse\n * @type {number}\n
> */\norg.apache.royale.A.a = 10;\n\n\n/**\n * @export\n * @nocollapse\n *
> @type {string}\n */\norg.apache.royale.A.b;\n\n\n/**\n * @private\n *
> @return {string}\n */\norg.apache.royale.A.initStatic = function() {\n
> return \"foo\";\n};\n\norg.apache.royale.A.b =
> org.apache.royale.A.initStatic();\n\n");
> +        assertOut("/**\n * @constructor\n */\norg.apache.royale.A =
> function() {\n};\n\n\n/**\n * @nocollapse\n * @type {number}\n
> */\norg.apache.royale.A.a = 10;\n\n\n/**\n * @nocollapse\n * @type
> {string}\n */\norg.apache.royale.A.b;\n\n\n/**\n * @private\n * @return
> {string}\n */\norg.apache.royale.A.initStatic = function() {\n  return
> \"foo\";\n};\n\norg.apache.royale.A.b =
> org.apache.royale.A.initStatic();\n\n");
>      }
>
>      @Test
> @@ -653,7 +650,7 @@ public class TestRoyaleClass extends TestGoogClass
>                  + "private static const C:Number = 42;"
>                  + "custom_namespace static const C:String = 'me' +
> 'you';}");
>          asBlockWalker.visitClass(node);
> -        assertOut("/**\n * @constructor\n */\norg.apache.royale.A =
> function() {\n};\n\n\n/**\n * @export\n * @nocollapse\n * @const\n * @type
> {number}\n */\norg.apache.royale.A.A = 42;\n\n\n/**\n * @protected\n *
> @nocollapse\n * @const\n * @type {number}\n */\norg.apache.royale.A.B =
> 42;\n\n\n/**\n * @private\n * @const\n * @type {number}\n
> */\norg.apache.royale.A.C = 42;\n\n\n/**\n * @const\n * @type {string}\n
> */\norg.apache.royale.A.http_$$ns_apache_org$2017$custom$namespace__C = 'me
> [...]
> +        assertOut("/**\n * @constructor\n */\norg.apache.royale.A =
> function() {\n};\n\n\n/**\n * @nocollapse\n * @const\n * @type {number}\n
> */\norg.apache.royale.A.A = 42;\n\n\n/**\n * @protected\n * @nocollapse\n *
> @const\n * @type {number}\n */\norg.apache.royale.A.B = 42;\n\n\n/**\n *
> @private\n * @const\n * @type {number}\n */\norg.apache.royale.A.C =
> 42;\n\n\n/**\n * @const\n * @type {string}\n
> */\norg.apache.royale.A.http_$$ns_apache_org$2017$custom$namespace__C =
> 'me' + 'you';");
>      }
>
>      @Override
> @@ -730,7 +727,7 @@ public class TestRoyaleClass extends TestGoogClass
>                  + "public function foo2():String{function
> bar2(param1:String):String {return param1 + baz1;}; return bar2('foo');}"
>                  + "}");
>          asBlockWalker.visitClass(node);
> -        assertOut("/**\n * @constructor\n */\norg.apache.royale.B =
> function() {\n};\n\n\n/**\n * @export\n * @type {string}\n
> */\norg.apache.royale.B.prototype.baz1 = null;\n\n\n/**\n * @return
> {string}\n */\norg.apache.royale.B.prototype.foo1 = function() {\n  var
> self = this;\n  function bar1() {\n    return self.baz1;\n  };\n  return
> bar1();\n};\n\n\n/**\n * @return {string}\n
> */\norg.apache.royale.B.prototype.foo2 = function() {\n  var self =
> this;\n  function bar2(param1) {\n    re [...]
> +        assertOut("/**\n * @constructor\n */\norg.apache.royale.B =
> function() {\n};\n\n\n/**\n * @type {string}\n
> */\norg.apache.royale.B.prototype.baz1 = null;\n\n\n/**\n * @return
> {string}\n */\norg.apache.royale.B.prototype.foo1 = function() {\n  var
> self = this;\n  function bar1() {\n    return self.baz1;\n  };\n  return
> bar1();\n};\n\n\n/**\n * @return {string}\n
> */\norg.apache.royale.B.prototype.foo2 = function() {\n  var self =
> this;\n  function bar2(param1) {\n    return param1  [...]
>      }
>
>      @Test
> @@ -837,7 +834,7 @@ public class TestRoyaleClass extends TestGoogClass
>      {
>          IClassNode node = getClassNode("public class A {public function
> A(arg1:String, arg2:int) {arg2 = arg2 + 2;} public var foo:Array = [];}");
>          asBlockWalker.visitClass(node);
> -        assertOut("/**\n * @constructor\n * @param {string} arg1\n *
> @param {number} arg2\n */\norg.apache.royale.A = function(arg1, arg2) {\n
> \n  this.foo = [];\n  arg2 = (arg2 + 2) >> 0;\n};\n\n\n/**\n * @export\n *
> @type {Array}\n */\norg.apache.royale.A.prototype.foo = null;");
> +        assertOut("/**\n * @constructor\n * @param {string} arg1\n *
> @param {number} arg2\n */\norg.apache.royale.A = function(arg1, arg2) {\n
> \n  this.foo = [];\n  arg2 = (arg2 + 2) >> 0;\n};\n\n\n/**\n * @type
> {Array}\n */\norg.apache.royale.A.prototype.foo = null;");
>      }
>
>      @Test
> @@ -853,7 +850,7 @@ public class TestRoyaleClass extends TestGoogClass
>      {
>          IClassNode node = getClassNode("public class A extends
> TestImplementation {public function A(arg1:String, arg2:int) {arg2 = arg2 +
> 2;} public var foo:Array = [];}");
>          asBlockWalker.visitClass(node);
> -        assertOut("/**\n * @constructor\n * @extends
> {custom.TestImplementation}\n * @param {string} arg1\n * @param {number}
> arg2\n */\norg.apache.royale.A = function(arg1, arg2) {\n
> org.apache.royale.A.base(this, 'constructor');\n  \n  this.foo = [];\n
> arg2 = (arg2 + 2) >> 0;\n};\ngoog.inherits(org.apache.royale.A,
> custom.TestImplementation);\n\n\n/**\n * @export\n * @type {Array}\n
> */\norg.apache.royale.A.prototype.foo = null;");
> +        assertOut("/**\n * @constructor\n * @extends
> {custom.TestImplementation}\n * @param {string} arg1\n * @param {number}
> arg2\n */\norg.apache.royale.A = function(arg1, arg2) {\n
> org.apache.royale.A.base(this, 'constructor');\n  \n  this.foo = [];\n
> arg2 = (arg2 + 2) >> 0;\n};\ngoog.inherits(org.apache.royale.A,
> custom.TestImplementation);\n\n\n/**\n * @type {Array}\n
> */\norg.apache.royale.A.prototype.foo = null;");
>      }
>
>      @Test
> @@ -861,7 +858,7 @@ public class TestRoyaleClass extends TestGoogClass
>      {
>          IClassNode node = getClassNode("public class A {public static
> const NAME:String = 'Dummy'; public function A(arg1:String = NAME) {_name =
> arg1;} private var _name:String;}");
>          asBlockWalker.visitClass(node);
> -        assertOut("/**\n * @constructor\n * @param {string=} arg1\n
> */\norg.apache.royale.A = function(arg1) {\n  arg1 = typeof arg1 !==
> 'undefined' ? arg1 : org.apache.royale.A.NAME;\n  this._name =
> arg1;\n};\n\n\n/**\n * @export\n * @nocollapse\n * @const\n * @type
> {string}\n */\norg.apache.royale.A.NAME = 'Dummy';\n\n\n/**\n *
> @private\n * @type {string}\n */\norg.apache.royale.A.prototype._name =
> null;");
> +        assertOut("/**\n * @constructor\n * @param {string=} arg1\n
> */\norg.apache.royale.A = function(arg1) {\n  arg1 = typeof arg1 !==
> 'undefined' ? arg1 : org.apache.royale.A.NAME;\n  this._name =
> arg1;\n};\n\n\n/**\n * @nocollapse\n * @const\n * @type {string}\n */\
> norg.apache.royale.A.NAME = 'Dummy';\n\n\n/**\n * @private\n * @type
> {string}\n */\norg.apache.royale.A.prototype._name = null;");
>      }
>
>      protected IBackend createBackend()
> diff --git
> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleEmitter.java
> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleEmitter.java
> index 67dc6e1..a45f7d0 100644
> ---
> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleEmitter.java
> +++
> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleEmitter.java
> @@ -59,53 +59,52 @@ public class TestRoyaleEmitter extends TestGoogEmitter
>          IFileNode node = compileAS(code);
>          asBlockWalker.visitFile(node);
>                 assertOutWithMetadata("/**\n" +
> -                                       " *
> com.example.components.MyEventTarget\n" +
> -                                       " *\n" +
> -                                       " * @fileoverview\n" +
> -                                       " *\n" +
> -                                       " * @suppress
> {checkTypes|accessControls}\n" +
> -                                       " */\n" +
> -                                       "\n" +
> -
>  "goog.provide('com.example.components.MyEventTarget');\n" +
> -                                       "\n" +
> -
>  "goog.require('custom.TestImplementation');\n" +
> -                                       "\n" +
> -                                       "\n" +
> -                                       "\n" +
> -                                       "/**\n" +
> -                                       " * @constructor\n" +
> -                                       " * @extends
> {custom.TestImplementation}\n" +
> -                                       " */\n" +
> -
>  "com.example.components.MyEventTarget = function() {\n" +
> -                                       "
> com.example.components.MyEventTarget.base(this, 'constructor');\n" +
> -                                       "  if (foo() != 42) {\n" +
> -                                       "    bar();\n" +
> -                                       "  }\n" +
> -                                       "};\n" +
> -
>  "goog.inherits(com.example.components.MyEventTarget,
> custom.TestImplementation);\n" +
> -                                       "\n" +
> -                                       "\n" +
> -                                       "/**\n" +
> -                                       " * @private\n" +
> -                                       " * @type {string}\n" +
> -                                       " */\n" +
> -
>  "com.example.components.MyEventTarget.prototype._privateVar = \"do \";\n" +
> -                       "\n" +
> -                       "\n" +
> -                       "/**\n" +
> -                       " * @export\n" +
> -                       " * @type {number}\n" +
> -                       " */\n" +
> -
>  "com.example.components.MyEventTarget.prototype.publicProperty = 100;\n" +
> -                       "\n" +
> -                       "\n" +
> -                       "/**\n" +
> -                       " * @param {string} value\n" +
> -                       " * @return {string}\n" +
> -                       " */\n" +
> -
>  "com.example.components.MyEventTarget.prototype.myFunction =
> function(value) {\n" +
> -                       "  return \"Don't \" + this._privateVar +
> value;\n" +
> -               "};\n" +
> +                               " *
> com.example.components.MyEventTarget\n" +
> +                               " *\n" +
> +                               " * @fileoverview\n" +
> +                               " *\n" +
> +                               " * @suppress
> {checkTypes|accessControls}\n" +
> +                               " */\n" +
> +                               "\n" +
> +
>  "goog.provide('com.example.components.MyEventTarget');\n" +
> +                               "\n" +
> +
>  "goog.require('custom.TestImplementation');\n" +
> +                               "\n" +
> +                               "\n" +
> +                               "\n" +
> +                               "/**\n" +
> +                               " * @constructor\n" +
> +                               " * @extends
> {custom.TestImplementation}\n" +
> +                               " */\n" +
> +                               "com.example.components.MyEventTarget =
> function() {\n" +
> +                               "
> com.example.components.MyEventTarget.base(this, 'constructor');\n" +
> +                               "  if (foo() != 42) {\n" +
> +                               "    bar();\n" +
> +                               "  }\n" +
> +                               "};\n" +
> +
>  "goog.inherits(com.example.components.MyEventTarget,
> custom.TestImplementation);\n" +
> +                               "\n" +
> +                               "\n" +
> +                               "/**\n" +
> +                               " * @private\n" +
> +                               " * @type {string}\n" +
> +                               " */\n" +
> +
>  "com.example.components.MyEventTarget.prototype._privateVar = \"do \";\n" +
> +                               "\n" +
> +                               "\n" +
> +                               "/**\n" +
> +                               " * @type {number}\n" +
> +                               " */\n" +
> +
>  "com.example.components.MyEventTarget.prototype.publicProperty = 100;\n" +
> +                               "\n" +
> +                               "\n" +
> +                               "/**\n" +
> +                               " * @param {string} value\n" +
> +                               " * @return {string}\n" +
> +                               " */\n" +
> +
>  "com.example.components.MyEventTarget.prototype.myFunction =
> function(value) {\n" +
> +                               "  return \"Don't \" + this._privateVar +
> value;\n" +
> +                               "};\n" +
>                                 "\n" +
>                                 "\n" +
>                                 "/**\n" +
> diff --git
> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleFieldMembers.java
> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleFieldMembers.java
> index c715e9d..fb4b64d 100644
> ---
> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleFieldMembers.java
> +++
> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleFieldMembers.java
> @@ -52,7 +52,7 @@ public class TestRoyaleFieldMembers extends
> TestGoogFieldMembers
>      {
>          IVariableNode node = getField("public var foo:String = null;");
>          asBlockWalker.visitVariable(node);
> -        assertOut("/**\n * @export\n * @type {string}\n
> */\nRoyaleTest_A.prototype.foo = null");
> +        assertOut("/**\n * @type {string}\n
> */\nRoyaleTest_A.prototype.foo = null");
>      }
>
>      @Override
> @@ -61,7 +61,7 @@ public class TestRoyaleFieldMembers extends
> TestGoogFieldMembers
>      {
>          IVariableNode node = getField("public var foo:int;");
>          asBlockWalker.visitVariable(node);
> -        assertOut("/**\n * @export\n * @type {number}\n
> */\nRoyaleTest_A.prototype.foo = 0");
> +        assertOut("/**\n * @type {number}\n
> */\nRoyaleTest_A.prototype.foo = 0");
>      }
>
>      @Override
> @@ -70,7 +70,7 @@ public class TestRoyaleFieldMembers extends
> TestGoogFieldMembers
>      {
>          IVariableNode node = getField("public var foo:int = 420;");
>          asBlockWalker.visitVariable(node);
> -        assertOut("/**\n * @export\n * @type {number}\n
> */\nRoyaleTest_A.prototype.foo = 420");
> +        assertOut("/**\n * @type {number}\n
> */\nRoyaleTest_A.prototype.foo = 420");
>      }
>
>      @Test
> @@ -78,7 +78,7 @@ public class TestRoyaleFieldMembers extends
> TestGoogFieldMembers
>      {
>          IVariableNode node = getField("public var foo:int = -420;");
>          asBlockWalker.visitVariable(node);
> -        assertOut("/**\n * @export\n * @type {number}\n
> */\nRoyaleTest_A.prototype.foo = -420");
> +        assertOut("/**\n * @type {number}\n
> */\nRoyaleTest_A.prototype.foo = -420");
>      }
>
>      @Test
> @@ -86,7 +86,7 @@ public class TestRoyaleFieldMembers extends
> TestGoogFieldMembers
>      {
>          IVariableNode node = getField("public var foo:int = -123.4;");
>          asBlockWalker.visitVariable(node);
> -        assertOut("/**\n * @export\n * @type {number}\n
> */\nRoyaleTest_A.prototype.foo = -123");
> +        assertOut("/**\n * @type {number}\n
> */\nRoyaleTest_A.prototype.foo = -123");
>      }
>
>      @Test
> @@ -94,7 +94,7 @@ public class TestRoyaleFieldMembers extends
> TestGoogFieldMembers
>      {
>          IVariableNode node = getField("public var foo:uint = 123.4;");
>          asBlockWalker.visitVariable(node);
> -        assertOut("/**\n * @export\n * @type {number}\n
> */\nRoyaleTest_A.prototype.foo = 123");
> +        assertOut("/**\n * @type {number}\n
> */\nRoyaleTest_A.prototype.foo = 123");
>      }
>
>      @Test
> @@ -102,7 +102,7 @@ public class TestRoyaleFieldMembers extends
> TestGoogFieldMembers
>      {
>          IVariableNode node = getField("public var foo:uint = -123;");
>          asBlockWalker.visitVariable(node);
> -        assertOut("/**\n * @export\n * @type {number}\n
> */\nRoyaleTest_A.prototype.foo = 4294967173");
> +        assertOut("/**\n * @type {number}\n
> */\nRoyaleTest_A.prototype.foo = 4294967173");
>      }
>
>      @Test
> @@ -175,7 +175,7 @@ public class TestRoyaleFieldMembers extends
> TestGoogFieldMembers
>      {
>          IVariableNode node = getField("public static var foo:int;");
>          asBlockWalker.visitVariable(node);
> -        assertOut("/**\n * @export\n * @type {number}\n
> */\nRoyaleTest_A.foo = 0");
> +        assertOut("/**\n * @type {number}\n */\nRoyaleTest_A.foo = 0");
>      }
>
>      @Test
> @@ -210,7 +210,7 @@ public class TestRoyaleFieldMembers extends
> TestGoogFieldMembers
>         IClassNode node = (IClassNode) getNode("import
> custom.custom_namespace;use namespace custom_namespace;public static var
> foo:Object = initFoo(); custom_namespace static function initFoo():Object {
> return null; }",
>                         IClassNode.class, WRAP_LEVEL_CLASS);
>          asBlockWalker.visitClass(node);
> -        assertOut("/**\n * @constructor\n */\nRoyaleTest_A = function()
> {\n};\n\n\n/**\n * @export\n * @type {Object}\n
> */\nRoyaleTest_A.foo;\n\n\n/**\n * @return {Object}\n
> */\nRoyaleTest_A.http_$$ns_apache_org$2017$custom$namespace__initFoo =
> function() {\n  return null;\n};\n\nRoyaleTest_A.foo =
> RoyaleTest_A.http_$$ns_apache_org$2017$custom$namespace__initFoo();\n\n");
> +        assertOut("/**\n * @constructor\n */\nRoyaleTest_A = function()
> {\n};\n\n\n/**\n * @type {Object}\n */\nRoyaleTest_A.foo;\n\n\n/**\n *
> @return {Object}\n
> */\nRoyaleTest_A.http_$$ns_apache_org$2017$custom$namespace__initFoo =
> function() {\n  return null;\n};\n\nRoyaleTest_A.foo =
> RoyaleTest_A.http_$$ns_apache_org$2017$custom$namespace__initFoo();\n\n");
>      }
>
>      @Test
> @@ -219,7 +219,7 @@ public class TestRoyaleFieldMembers extends
> TestGoogFieldMembers
>         IClassNode node = (IClassNode) getNode("static public var
> foo:Object = { 'foo': 'bar' }",
>                         IClassNode.class, WRAP_LEVEL_CLASS);
>          asBlockWalker.visitClass(node);
> -        assertOut("/**\n * @constructor\n */\nRoyaleTest_A = function()
> {\n};\n\n\n/**\n * @export\n * @type {Object}\n */\nRoyaleTest_A.foo =
> {'foo':'bar'};");
> +        assertOut("/**\n * @constructor\n */\nRoyaleTest_A = function()
> {\n};\n\n\n/**\n * @type {Object}\n */\nRoyaleTest_A.foo = {'foo':'bar'};");
>      }
>
>      @Test
> @@ -259,7 +259,7 @@ public class TestRoyaleFieldMembers extends
> TestGoogFieldMembers
>      {
>          IVariableNode node = getField("public static const foo;");
>          asBlockWalker.visitVariable(node);
> -        assertOut("/**\n * @export\n * @const\n * @type {*}\n
> */\nRoyaleTest_A.foo");
> +        assertOut("/**\n * @const\n * @type {*}\n */\nRoyaleTest_A.foo");
>      }
>
>      @Test
> @@ -267,7 +267,7 @@ public class TestRoyaleFieldMembers extends
> TestGoogFieldMembers
>      {
>          IVariableNode node = getField("public const foo;");
>          asBlockWalker.visitVariable(node);
> -        assertOut("/**\n * @export\n * @const\n * @type {*}\n
> */\nRoyaleTest_A.prototype.foo");
> +        assertOut("/**\n * @const\n * @type {*}\n
> */\nRoyaleTest_A.prototype.foo");
>      }
>
>      @Override
> @@ -276,7 +276,7 @@ public class TestRoyaleFieldMembers extends
> TestGoogFieldMembers
>      {
>          IVariableNode node = getField("public static const foo:int;");
>          asBlockWalker.visitVariable(node);
> -        assertOut("/**\n * @export\n * @const\n * @type {number}\n
> */\nRoyaleTest_A.foo = 0");
> +        assertOut("/**\n * @const\n * @type {number}\n
> */\nRoyaleTest_A.foo = 0");
>      }
>
>      @Test
> @@ -284,7 +284,7 @@ public class TestRoyaleFieldMembers extends
> TestGoogFieldMembers
>      {
>          IVariableNode node = getField("public const foo:int;");
>          asBlockWalker.visitVariable(node);
> -        assertOut("/**\n * @export\n * @const\n * @type {number}\n
> */\nRoyaleTest_A.prototype.foo = 0");
> +        assertOut("/**\n * @const\n * @type {number}\n
> */\nRoyaleTest_A.prototype.foo = 0");
>      }
>
>      @Override
> @@ -293,7 +293,7 @@ public class TestRoyaleFieldMembers extends
> TestGoogFieldMembers
>      {
>          IVariableNode node = getField("public static const foo:int =
> 420;");
>          asBlockWalker.visitVariable(node);
> -        assertOut("/**\n * @export\n * @const\n * @type {number}\n
> */\nRoyaleTest_A.foo = 420");
> +        assertOut("/**\n * @const\n * @type {number}\n
> */\nRoyaleTest_A.foo = 420");
>      }
>
>      @Test
> @@ -301,7 +301,7 @@ public class TestRoyaleFieldMembers extends
> TestGoogFieldMembers
>      {
>          IVariableNode node = getField("public static const foo:Number =
> parseFloat('1E2');");
>          asBlockWalker.visitVariable(node);
> -        assertOut("/**\n * @export\n * @const\n * @type {number}\n
> */\nRoyaleTest_A.foo = parseFloat('1E2')");
> +        assertOut("/**\n * @const\n * @type {number}\n
> */\nRoyaleTest_A.foo = parseFloat('1E2')");
>      }
>
>      @Test
> @@ -309,7 +309,7 @@ public class TestRoyaleFieldMembers extends
> TestGoogFieldMembers
>      {
>          IVariableNode node = getField("public const foo:int = 420;");
>          asBlockWalker.visitVariable(node);
> -        assertOut("/**\n * @export\n * @const\n * @type {number}\n
> */\nRoyaleTest_A.prototype.foo = 420");
> +        assertOut("/**\n * @const\n * @type {number}\n
> */\nRoyaleTest_A.prototype.foo = 420");
>      }
>
>      @Test
> diff --git
> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyalePackage.java
> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyalePackage.java
> index 7d61fc4..cbced0a 100644
> ---
> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyalePackage.java
> +++
> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyalePackage.java
> @@ -713,7 +713,6 @@ public class TestRoyalePackage extends TestGoogPackage
>                                 "\n" +
>                                 "\n" +
>                                 "/**\n" +
> -                               " * @export\n" +
>                                 " * @nocollapse\n" +
>                                 " * @type {string}\n" +
>                                 " */\n" +
> @@ -1146,7 +1145,6 @@ public class TestRoyalePackage extends
> TestGoogPackage
>                                 "\n" +
>                                 "\n" +
>                                 "/**\n" +
> -                               " * @export\n" +
>                                 " * @nocollapse\n" +
>                                 " * @const\n" +
>                                 " * @type {number}\n" +
> diff --git
> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLApplication.java
> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLApplication.java
> index e435712..b5511f3 100644
> ---
> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLApplication.java
> +++
> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLApplication.java
> @@ -900,7 +900,6 @@ public class TestRoyaleMXMLApplication extends
> RoyaleTestBase
>                         "\n" +
>                                 "\n" +
>                         "/**\n" +
> -                       " * @export\n" +
>                         " * @type {binding.ComplexValueObject}\n" +
>                         " */\n" +
>                         "AppName.prototype.firstOne = null;\n" +
> @@ -1077,7 +1076,6 @@ public class TestRoyaleMXMLApplication extends
> RoyaleTestBase
>                         "\n" +
>                                 "\n" +
>                         "/**\n" +
> -                       " * @export\n" +
>                         " * @type {XML}\n" +
>                         " */\n" +
>                         "AppName.prototype.xml = null;\n" +
> diff --git
> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLScript.java
> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLScript.java
> index e42f4a1..cfd5acf 100644
> ---
> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLScript.java
> +++
> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLScript.java
> @@ -274,7 +274,6 @@ public class TestRoyaleMXMLScript extends
> RoyaleTestBase
>                         "\n" +
>                                 "\n" +
>                                 "/**\n" +
> -                               " * @export\n" +
>                                 " * @type {Array}\n" +
>                                 " */\n" +
>                                 "AppName.prototype.foo;\n" +
> @@ -378,14 +377,12 @@ public class TestRoyaleMXMLScript extends
> RoyaleTestBase
>                                 "  Object.defineProperty(AppName, 'foo', {
> value: value, writable: true });\n" +
>                                 "};\n" +
>                                 "/**\n" +
> -                               " * @export\n" +
>                                 " * @type {string}\n" +
>                                 " */\n" +
>                                 "AppName.foo;\n" +
>                                 "\n" +
>                                 "Object.defineProperties(AppName, /**
> @lends {AppName} */ {\n" +
>                                 "/**\n" +
> -                               " * @export\n" +
>                                 " * @type {string}\n" +
>                                 " */\n" +
>                                 "foo: {\n" +
> @@ -482,7 +479,6 @@ public class TestRoyaleMXMLScript extends
> RoyaleTestBase
>                         "\n" +
>                                 "\n" +
>                                 "/**\n" +
> -                               " * @export\n" +
>                                 " * @type {string}\n" +
>                                 " */\n" +
>                                 "AppName.foo = 'foo';\n" +
> @@ -576,7 +572,6 @@ public class TestRoyaleMXMLScript extends
> RoyaleTestBase
>                         "\n" +
>                                 "\n" +
>                                 "/**\n" +
> -                               " * @export\n" +
>                                 " * @type {Array}\n" +
>                                 " */\n" +
>                                 "AppName.foo = ['foo'];\n" +
> @@ -677,7 +672,6 @@ public class TestRoyaleMXMLScript extends
> RoyaleTestBase
>                                 "  return value;\n" +
>                                 "};\n" +
>                                 "/**\n" +
> -                               " * @export\n" +
>                                 " * @const\n" +
>                                 " * @type {string}\n" +
>                                 " */\n" +
> @@ -685,7 +679,6 @@ public class TestRoyaleMXMLScript extends
> RoyaleTestBase
>                                 "\n" +
>                                 "Object.defineProperties(AppName, /**
> @lends {AppName} */ {\n" +
>                                 "/**\n" +
> -                               " * @export\n" +
>                                 " * @const\n" +
>                                 " * @type {string}\n" +
>                                 " */\n" +
> diff --git
> a/compiler-jx/src/test/resources/royale/projects/internal/MainClass_result.js
> b/compiler-jx/src/test/resources/royale/projects/internal/MainClass_result.js
> index 266e02b..52e26f7 100644
> ---
> a/compiler-jx/src/test/resources/royale/projects/internal/MainClass_result.js
> +++
> b/compiler-jx/src/test/resources/royale/projects/internal/MainClass_result.js
> @@ -73,7 +73,6 @@ MainClass.InternalClass = function() {
>
>
>  /**
> - * @export
>   * @type {OtherClass}
>   */
>  MainClass.InternalClass.prototype.foo = null;
>
>