JSRoyaleDocEmitter: consolidated at-nocollapse annotation and added it to static methods too when -prevent-rename compiler args are present

Eventually, this should be generated for release builds only, but better to make it work in the easy way first to help with converting at-export to release builds only
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 37d38f8..959f3aa 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
@@ -147,7 +147,7 @@
             emitExports = !suppressExports;
             exportProtected = false;
         }
-        emitExports = emitExports && !node.getFunctionClassification().equals(FunctionClassification.PACKAGE_MEMBER);
+        emitExports = emitExports && !node.hasModifier(ASModifier.STATIC) && !node.getFunctionClassification().equals(FunctionClassification.PACKAGE_MEMBER);
         
         coercionList = null;
         ignoreList = null;
@@ -286,6 +286,7 @@
                     else
                         begin();
                     emitMethodAccess(node);
+                    emitMethodNoCollapse(node, fjp);
                     hasDoc = true;
                 }
             }
@@ -303,6 +304,7 @@
 	                    else
 	                        begin();
 	                    emitMethodAccess(node);
+                        emitMethodNoCollapse(node, fjp);
 	                    hasDoc = true;
 	                }
 	
@@ -332,6 +334,7 @@
 	                        else
 	                            begin();
 	                        emitMethodAccess(node);
+                            emitMethodNoCollapse(node, fjp);
 	                        hasDoc = true;
 	                    }
 	
@@ -354,6 +357,7 @@
                         else
                             begin();
                         emitMethodAccess(node);
+                        emitMethodNoCollapse(node, fjp);
                         hasDoc = true;
                     }
 
@@ -542,13 +546,47 @@
         {
             emitProtected(node);
         }
-        else /*if (ns != null && ns == IASKeywordConstants.PUBLIC)*/
+        else // public or custom namespace
         {
-            if(!node.hasModifier(ASModifier.STATIC))
-                emitPublic(node);
+            emitPublic(node);
         }
     }
 
+    protected void emitMethodNoCollapse(IFunctionNode node, RoyaleJSProject fjp)
+    {
+        String ns = node.getNamespace();
+        if (ns == IASKeywordConstants.PROTECTED)
+        {
+            boolean preventRenameProtected = fjp.config != null && fjp.config.getPreventRenameProtectedSymbols();
+            if (preventRenameProtected)
+            {
+                emitNoCollapse(node);
+            }
+        }
+        else if(ns != IASKeywordConstants.PRIVATE) // public or custom namespace
+        {
+            boolean preventRenamePublic = fjp.config != null && fjp.config.getPreventRenamePublicSymbols();
+            if (preventRenamePublic)
+            {
+                emitNoCollapse(node);
+            }
+        }
+    }
+
+    protected void emitNoCollapse(IDefinitionNode node)
+    {
+        if (!node.hasModifier(ASModifier.STATIC)
+                || node instanceof IAccessorNode
+                || IASKeywordConstants.PRIVATE.equals(node.getNamespace()))
+        {
+            return;
+        }
+        //dynamically getting/setting a static field won't
+        //work properly if it is collapsed in a release build,
+        //even when it has been exported
+        emitJSDocLine(JSGoogDocEmitterTokens.NOCOLLAPSE);
+    }
+
     @Override
     public void emitFieldDoc(IVariableNode node, IDefinition def, ICompilerProject project)
     {
@@ -580,12 +618,9 @@
         {
             emitProtected(node);
             boolean preventRename = fjp.config != null && fjp.config.getPreventRenameProtectedSymbols();
-            if(preventRename && node.hasModifier(ASModifier.STATIC) && !(node instanceof IAccessorNode))
+            if (preventRename)
             {
-                //dynamically getting/setting a static variable won't
-                //work properly if it is collapsed in a release build,
-                //even when it has been exported
-                emitJSDocLine(JSGoogDocEmitterTokens.NOCOLLAPSE);
+                emitNoCollapse(node);
             }
         }
         else
@@ -631,12 +666,9 @@
                 {
                     emitPublic(node);
                     boolean preventRename = fjp.config != null && fjp.config.getPreventRenamePublicSymbols();
-                    if(preventRename && node.hasModifier(ASModifier.STATIC) && !(node instanceof IAccessorNode))
+                    if(preventRename)
                     {
-                        //dynamically getting/setting a static variable won't
-                        //work properly if it is collapsed in a release build,
-                        //even when it has been exported
-                        emitJSDocLine(JSGoogDocEmitterTokens.NOCOLLAPSE);
+                        emitNoCollapse(node);
                     }
                 }
             } else {
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 c1fdcac..39f85dd 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
@@ -701,7 +701,7 @@
                 + "public static function foo7(value:Object):void{}"
                 + "custom_namespace static function foo7(value:Object):void{}" + "}");
         asBlockWalker.visitClass(node);
-        assertOut("/**\n * @constructor\n */\norg.apache.royale.A = function() {\n};\n\n\n/**\n * @export\n * @return {Object}\n */\norg.apache.royale.A.prototype.foo1 = function() {\n  return null;\n};\n\n\n/**\n * @export\n * @return {Object}\n */\norg.apache.royale.A.prototype.foo1a = function() {\n  return null;\n};\n\n\n/**\n * @export\n * @override\n */\norg.apache.royale.A.prototype.foo1b = function() {\n  return org.apache.royale.A.superClass_.foo1b.apply(this);\n};\n\n\n/**\n * @protected\n * @param {Object} value\n */\norg.apache.royale.A.prototype.foo2 = function(value) {\n};\n\n\n/**\n * @private\n * @param {Object} value\n */\norg.apache.royale.A.prototype.foo3 = function(value) {\n};\n\n\n/**\n * @export\n * @param {Object} value\n */\norg.apache.royale.A.prototype.foo5 = function(value) {\n};\n\n\n/**\n * @export\n * @param {Object} value\n */\norg.apache.royale.A.prototype.http_$$ns_apache_org$2017$custom$namespace__foo6 = function(value) {\n};\n\n\n/**\n * @param {Object} value\n */\norg.apache.royale.A.foo7 = function(value) {\n};\n\n\n/**\n * @param {Object} value\n */\norg.apache.royale.A.http_$$ns_apache_org$2017$custom$namespace__foo7 = function(value) {\n};");
+        assertOut("/**\n * @constructor\n */\norg.apache.royale.A = function() {\n};\n\n\n/**\n * @export\n * @return {Object}\n */\norg.apache.royale.A.prototype.foo1 = function() {\n  return null;\n};\n\n\n/**\n * @export\n * @return {Object}\n */\norg.apache.royale.A.prototype.foo1a = function() {\n  return null;\n};\n\n\n/**\n * @export\n * @override\n */\norg.apache.royale.A.prototype.foo1b = function() {\n  return org.apache.royale.A.superClass_.foo1b.apply(this);\n};\n\n\n/**\n * @protected\n * @param {Object} value\n */\norg.apache.royale.A.prototype.foo2 = function(value) {\n};\n\n\n/**\n * @private\n * @param {Object} value\n */\norg.apache.royale.A.prototype.foo3 = function(value) {\n};\n\n\n/**\n * @export\n * @param {Object} value\n */\norg.apache.royale.A.prototype.foo5 = function(value) {\n};\n\n\n/**\n * @export\n * @param {Object} value\n */\norg.apache.royale.A.prototype.http_$$ns_apache_org$2017$custom$namespace__foo6 = function(value) {\n};\n\n\n/**\n * @nocollapse\n * @param {Object} value\n */\norg.apache.royale.A.foo7 = function(value) {\n};\n\n\n/**\n * @nocollapse\n * @param {Object} value\n */\norg.apache.royale.A.http_$$ns_apache_org$2017$custom$namespace__foo7 = function(value) {\n};");
     }
 
     @Test
diff --git a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleExpressions.java b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleExpressions.java
index 2c4e651..8d35553 100644
--- a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleExpressions.java
+++ b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleExpressions.java
@@ -1133,7 +1133,7 @@
                 "public class B {public static function b(ff:Function) { function c(f:Function):void {}; c(ff); }}",
                 IFunctionNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitFunction(node);
-        assertOut("/**\n * @param {Function} ff\n */\nB.b = function(ff) {\n  function c(f) {\n  };\n  c(ff);\n}");
+        assertOut("/**\n * @nocollapse\n * @param {Function} ff\n */\nB.b = function(ff) {\n  function c(f) {\n  };\n  c(ff);\n}");
     }
 
     @Test
@@ -1153,7 +1153,7 @@
                 "public class B {static public function b() { function c(f:Function):void {}; c(b); }}",
                 IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
         asBlockWalker.visitFunction(node);
-        assertOut("/**\n */\nfoo.bar.B.b = function() {\n  function c(f) {\n  };\n  c(foo.bar.B.b);\n}");
+        assertOut("/**\n * @nocollapse\n */\nfoo.bar.B.b = function() {\n  function c(f) {\n  };\n  c(foo.bar.B.b);\n}");
     }
 
     @Test
@@ -1223,7 +1223,7 @@
                 "public class B {static public function b() { function c(f:Function):void {}; var f:Function = b; c(f); }}",
                 IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
         asBlockWalker.visitFunction(node);
-        assertOut("/**\n */\nfoo.bar.B.b = function() {\n  function c(f) {\n  };\n  var /** @type {Function} */ f = foo.bar.B.b;\n  c(f);\n}");
+        assertOut("/**\n * @nocollapse\n */\nfoo.bar.B.b = function() {\n  function c(f) {\n  };\n  var /** @type {Function} */ f = foo.bar.B.b;\n  c(f);\n}");
     }
     
     @Test
@@ -1233,7 +1233,7 @@
                 "public class B {static public function b() { function c(f:Function):void {}; var f:Function = foo.bar.B.b; c(f); }}",
                 IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
         asBlockWalker.visitFunction(node);
-        assertOut("/**\n */\nfoo.bar.B.b = function() {\n  function c(f) {\n  };\n  var /** @type {Function} */ f = foo.bar.B.b;\n  c(f);\n}");
+        assertOut("/**\n * @nocollapse\n */\nfoo.bar.B.b = function() {\n  function c(f) {\n  };\n  var /** @type {Function} */ f = foo.bar.B.b;\n  c(f);\n}");
     }
     
     @Test
@@ -1253,7 +1253,7 @@
                 "public class B {static public function b() { function c(f:Function):void {}; var f:Function = null; f = b; c(f); }}",
                 IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
         asBlockWalker.visitFunction(node);
-        assertOut("/**\n */\nfoo.bar.B.b = function() {\n  function c(f) {\n  };\n  var /** @type {Function} */ f = null;\n  f = foo.bar.B.b;\n  c(f);\n}");
+        assertOut("/**\n * @nocollapse\n */\nfoo.bar.B.b = function() {\n  function c(f) {\n  };\n  var /** @type {Function} */ f = null;\n  f = foo.bar.B.b;\n  c(f);\n}");
     }
     
     @Test
@@ -1273,7 +1273,7 @@
                 "public class B {static public function b() { function c(f:Function):void {}; var f:Array = [b]; c(f); }}",
                 IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
         asBlockWalker.visitFunction(node);
-        assertOut("/**\n */\nfoo.bar.B.b = function() {\n  function c(f) {\n  };\n  var /** @type {Array} */ f = [foo.bar.B.b];\n  c(f);\n}");
+        assertOut("/**\n * @nocollapse\n */\nfoo.bar.B.b = function() {\n  function c(f) {\n  };\n  var /** @type {Array} */ f = [foo.bar.B.b];\n  c(f);\n}");
     }
     
     @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 dfb6c30..0ca2e6a 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
@@ -722,6 +722,7 @@
 				"\n" +
 				"\n" +
 				"/**\n" +
+				" * @nocollapse\n" + 
 				" * @return {string}\n" +
 				" */\n" +
 				"foo.bar.baz.A.InternalClass.someStaticFunction = function() {\n" +