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

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

commit 9708c4ba3c8864780e95033e85e969a6ab70cea2
Author: greg-dove <greg.d...@gmail.com>
AuthorDate: Fri Oct 25 18:34:22 2019 +1300

    Fixes for various issues with namespaces.
    Support for custom namespaces in reflection data.
    JSRoyaleDocEmitter - emitFieldDoc : Avoided @export on fields that are not 
public (internal, and custom namespaces)
---
 .../internal/codegen/js/JSSessionModel.java        |   3 +
 .../internal/codegen/js/jx/AccessorEmitter.java    | 201 +++++++++++++--------
 .../internal/codegen/js/jx/FieldEmitter.java       |  20 +-
 .../internal/codegen/js/jx/IdentifierEmitter.java  |  53 ++++--
 .../codegen/js/jx/MemberAccessEmitter.java         |  69 ++++---
 .../codegen/js/jx/PackageFooterEmitter.java        |  57 +++++-
 .../codegen/js/royale/JSRoyaleDocEmitter.java      |   3 +-
 .../internal/codegen/js/utils/EmitterUtils.java    |  15 ++
 .../js/royale/TestRoyaleAccessorMembers.java       |   9 +-
 .../codegen/js/royale/TestRoyaleFieldMembers.java  |  54 +++---
 .../js/royale/TestRoyaleGlobalConstants.java       |   8 +-
 .../codegen/js/royale/TestRoyalePackage.java       |   2 +-
 .../js/sourcemaps/TestSourceMapFieldMembers.java   | 102 +++++------
 13 files changed, 373 insertions(+), 223 deletions(-)

diff --git 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/JSSessionModel.java
 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/JSSessionModel.java
index c0cbb2d..6b6ca6d 100644
--- 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/JSSessionModel.java
+++ 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/JSSessionModel.java
@@ -43,6 +43,9 @@ public class JSSessionModel
         public IGetterNode getter;
         public ISetterNode setter;
         public ITypeDefinition type;
+        public boolean resolvedExport;
+        public String name;
+        public String uri;
         public boolean suppressExport;
     }
 
diff --git 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/AccessorEmitter.java
 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/AccessorEmitter.java
index 0860855..cffa146 100644
--- 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/AccessorEmitter.java
+++ 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/AccessorEmitter.java
@@ -45,9 +45,11 @@ import 
org.apache.royale.compiler.internal.codegen.js.royale.JSRoyaleEmitter;
 import 
org.apache.royale.compiler.internal.codegen.js.royale.JSRoyaleEmitterTokens;
 import org.apache.royale.compiler.internal.codegen.js.goog.JSGoogDocEmitter;
 import org.apache.royale.compiler.internal.codegen.js.goog.JSGoogEmitterTokens;
+import org.apache.royale.compiler.internal.definitions.NamespaceDefinition;
 import org.apache.royale.compiler.internal.projects.RoyaleJSProject;
 import org.apache.royale.compiler.internal.semantics.SemanticUtils;
 import org.apache.royale.compiler.internal.tree.as.FunctionNode;
+import org.apache.royale.compiler.internal.tree.as.GetterNode;
 import org.apache.royale.compiler.internal.tree.as.SetterNode;
 import org.apache.royale.compiler.projects.ICompilerProject;
 import org.apache.royale.compiler.tree.ASTNodeID;
@@ -96,6 +98,7 @@ public class AccessorEmitter extends JSSubEmitter implements
                 PropertyNodes p = getModel().getPropertyMap().get(propName);
                 IGetterNode getterNode = p.getter;
                 ISetterNode setterNode = p.setter;
+                String baseName = p.name;
                 if (getModel().isExterns)
                 {
                        IAccessorNode node = (getterNode != null) ? getterNode 
: setterNode;
@@ -112,18 +115,17 @@ public class AccessorEmitter extends JSSubEmitter 
implements
                     write(getEmitter().formatQualifiedName(qname));
                     write(ASEmitterTokens.MEMBER_ACCESS);
                     write(JSEmitterTokens.PROTOTYPE);
-                    if (fjs.isCustomNamespace((FunctionNode)node))
+                    if (p.uri != null)
                     {
                                INamespaceDecorationNode ns = 
((FunctionNode)node).getActualNamespaceNode();
                                INamespaceDefinition nsDef = 
(INamespaceDefinition)ns.resolve(project);
-                               
fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names 
-                               String s = nsDef.getURI();
-                               
write(JSRoyaleEmitter.formatNamespacedProperty(s, propName, true));
+                               
fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names
+                               
write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, baseName, true));
                     }
                     else
                     {
                         write(ASEmitterTokens.MEMBER_ACCESS);
-                       write(propName);
+                       write(baseName);
                     }
                     write(ASEmitterTokens.SEMICOLON);
                 }
@@ -137,19 +139,18 @@ public class AccessorEmitter extends JSSubEmitter 
implements
                            write(getEmitter().formatQualifiedName(qname));
                            write(ASEmitterTokens.MEMBER_ACCESS);
                            write(JSEmitterTokens.PROTOTYPE);
-                           if (fjs.isCustomNamespace((FunctionNode)getterNode))
+                           if (p.uri != null)
                            {
                                        INamespaceDecorationNode ns = 
((FunctionNode)getterNode).getActualNamespaceNode();
                                        INamespaceDefinition nsDef = 
(INamespaceDefinition)ns.resolve(project);
-                                       
fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names 
-                                       String s = nsDef.getURI();
-                                       
write(JSRoyaleEmitter.formatNamespacedProperty(s, 
JSRoyaleEmitterTokens.GETTER_PREFIX.getToken() + propName, true));
+                                       
fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names
+                                       
write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, 
JSRoyaleEmitterTokens.GETTER_PREFIX.getToken() + baseName, true));
                            }
                            else
                            {
                                write(ASEmitterTokens.MEMBER_ACCESS);
                                write(JSRoyaleEmitterTokens.GETTER_PREFIX);
-                               write(propName);
+                               write(baseName);
                            }
                            write(ASEmitterTokens.SPACE);
                            write(ASEmitterTokens.EQUAL);
@@ -199,13 +200,12 @@ public class AccessorEmitter extends JSSubEmitter 
implements
                            write(getEmitter().formatQualifiedName(qname));
                            write(ASEmitterTokens.MEMBER_ACCESS);
                            write(JSEmitterTokens.PROTOTYPE);
-                           if (fjs.isCustomNamespace((FunctionNode)setterNode))
+                           if (p.uri != null)
                            {
                                        INamespaceDecorationNode ns = 
((FunctionNode)setterNode).getActualNamespaceNode();
                                        INamespaceDefinition nsDef = 
(INamespaceDefinition)ns.resolve(project);
-                                       
fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names 
-                                       String s = nsDef.getURI();
-                                       
write(JSRoyaleEmitter.formatNamespacedProperty(s, 
JSRoyaleEmitterTokens.SETTER_PREFIX.getToken() + propName, true));
+                                       
fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names
+                                       
write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, 
JSRoyaleEmitterTokens.SETTER_PREFIX.getToken() + baseName, true));
                            }
                            else
                            {
@@ -213,7 +213,7 @@ public class AccessorEmitter extends JSSubEmitter implements
                                if (isBindable)
                                        
write(JSRoyaleEmitterTokens.BINDABLE_PREFIX);
                                write(JSRoyaleEmitterTokens.SETTER_PREFIX);
-                               write(propName);
+                               write(baseName);
                            }
                            write(ASEmitterTokens.SPACE);
                            write(ASEmitterTokens.EQUAL);
@@ -235,7 +235,7 @@ public class AccessorEmitter extends JSSubEmitter implements
                                write(JSEmitterTokens.PROTOTYPE);
                                write(ASEmitterTokens.MEMBER_ACCESS);
                                write(JSRoyaleEmitterTokens.SETTER_PREFIX);
-                               write(propName);
+                               write(baseName);
                                write(ASEmitterTokens.SPACE);
                                write(ASEmitterTokens.EQUAL);
                                write(ASEmitterTokens.SPACE);
@@ -254,7 +254,7 @@ public class AccessorEmitter extends JSSubEmitter implements
                                write(ASEmitterTokens.THIS);
                                write(ASEmitterTokens.MEMBER_ACCESS);
                                write(JSRoyaleEmitterTokens.GETTER_PREFIX);
-                               write(propName);
+                               write(baseName);
                                write(ASEmitterTokens.PAREN_OPEN);
                                write(ASEmitterTokens.PAREN_CLOSE);
                                writeNewline(ASEmitterTokens.SEMICOLON);
@@ -269,13 +269,13 @@ public class AccessorEmitter extends JSSubEmitter 
implements
                                write(ASEmitterTokens.MEMBER_ACCESS);
                                write(JSRoyaleEmitterTokens.BINDABLE_PREFIX);
                                write(JSRoyaleEmitterTokens.SETTER_PREFIX);
-                               write(propName);
+                               write(baseName);
                                write(ASEmitterTokens.PAREN_OPEN);
                                write("value");
                                write(ASEmitterTokens.PAREN_CLOSE);
                                writeNewline(ASEmitterTokens.SEMICOLON);
                                writeNewline("    
this.dispatchEvent("+fjs.formatQualifiedName(BindableEmitter.VALUECHANGE_EVENT_QNAME)+".createUpdateEvent(");
-                               writeNewline("         this, \"" + propName + 
"\", oldValue, value));");
+                               writeNewline("         this, \"" + baseName + 
"\", oldValue, value));");
                                writeNewline(ASEmitterTokens.BLOCK_CLOSE);
                                write(ASEmitterTokens.BLOCK_CLOSE);
                                write(ASEmitterTokens.SEMICOLON);               
         
@@ -315,11 +315,13 @@ public class AccessorEmitter extends JSSubEmitter 
implements
 
                 boolean wroteGetter = false;
                 PropertyNodes p = getModel().getPropertyMap().get(propName);
+                String baseName = p.name;
                 IGetterNode getterNode = p.getter;
                 ISetterNode setterNode = p.setter;
                writeNewline("/**");
+               //only export if one of the options is public
                //if either one is marked as suppressed, both are considered to 
be
-                if (emitExports && !(p.suppressExport))
+                if (emitExports && p.resolvedExport && !(p.suppressExport) )
                        writeNewline("  * @export");
                 if (p.type != null)
                 {
@@ -331,16 +333,16 @@ public class AccessorEmitter extends JSSubEmitter 
implements
                 else
                        writeNewline("  */");
                 FunctionNode fnNode = getterNode != null ? (FunctionNode) 
getterNode : (FunctionNode) setterNode;
-                if (fjs.isCustomNamespace(fnNode))
+                if (p.uri != null)
                 {
                                INamespaceDecorationNode ns = 
fnNode.getActualNamespaceNode();
                                INamespaceDefinition nsDef = 
(INamespaceDefinition)ns.resolve(project);
                                
fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names 
-                               String s = nsDef.getURI();
-                               
write(JSRoyaleEmitter.formatNamespacedProperty(s, propName, false));
+                               //String s = nsDef.getURI();
+                               
write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, baseName, false));
                 }
                 else
-                       write(propName);
+                       write(baseName);
                 write(ASEmitterTokens.COLON);
                 write(ASEmitterTokens.SPACE);
                 write(ASEmitterTokens.BLOCK_OPEN);
@@ -353,19 +355,19 @@ public class AccessorEmitter extends JSSubEmitter 
implements
                     write(getEmitter().formatQualifiedName(qname));
                     write(ASEmitterTokens.MEMBER_ACCESS);
                     write(JSEmitterTokens.PROTOTYPE);
-                    if (fjs.isCustomNamespace((FunctionNode)getterNode))
+                    if (p.uri != null)
                     {
                                INamespaceDecorationNode ns = 
((FunctionNode)getterNode).getActualNamespaceNode();
                                INamespaceDefinition nsDef = 
(INamespaceDefinition)ns.resolve(project);
                                
fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names 
-                               String s = nsDef.getURI();
-                               
write(JSRoyaleEmitter.formatNamespacedProperty(s, 
JSRoyaleEmitterTokens.GETTER_PREFIX.getToken() + propName, true));
+                               //String s = nsDef.getURI();
+                               
write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, 
JSRoyaleEmitterTokens.GETTER_PREFIX.getToken() + baseName, true));
                     }
                     else
                     {
                         write(ASEmitterTokens.MEMBER_ACCESS);
                         write(JSRoyaleEmitterTokens.GETTER_PREFIX);
-                       write(propName);
+                       write(baseName);
                     }
                     wroteGetter = true;
                 }
@@ -386,19 +388,19 @@ public class AccessorEmitter extends JSSubEmitter 
implements
                         
write(getEmitter().formatQualifiedName(other.getParent().getQualifiedName()));
                         write(ASEmitterTokens.MEMBER_ACCESS);
                         write(JSEmitterTokens.PROTOTYPE);
-                        if (fjs.isCustomNamespace((FunctionNode)setterNode))
+                        if (p.uri != null)
                         {
                                        INamespaceDecorationNode ns = 
((FunctionNode)setterNode).getActualNamespaceNode();
                                        INamespaceDefinition nsDef = 
(INamespaceDefinition)ns.resolve(project);
                                        
fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names 
-                                       String s = nsDef.getURI();
-                                       
write(JSRoyaleEmitter.formatNamespacedProperty(s, 
JSRoyaleEmitterTokens.GETTER_PREFIX.getToken() + propName, true));
+                                       //String s = nsDef.getURI();
+                                       
write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, 
JSRoyaleEmitterTokens.GETTER_PREFIX.getToken() + baseName, true));
                         }
                         else
                         {
                             write(ASEmitterTokens.MEMBER_ACCESS);
                             write(JSRoyaleEmitterTokens.GETTER_PREFIX);
-                               write(propName);
+                               write(baseName);
                         }
                         wroteGetter = true;
                        }
@@ -414,19 +416,19 @@ public class AccessorEmitter extends JSSubEmitter 
implements
                     write(getEmitter().formatQualifiedName(qname));
                     write(ASEmitterTokens.MEMBER_ACCESS);
                     write(JSEmitterTokens.PROTOTYPE);
-                    if (fjs.isCustomNamespace((FunctionNode)setterNode))
+                    if (p.uri != null)
                     {
                                INamespaceDecorationNode ns = 
((FunctionNode)setterNode).getActualNamespaceNode();
                                INamespaceDefinition nsDef = 
(INamespaceDefinition)ns.resolve(project);
                                
fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names 
-                               String s = nsDef.getURI();
-                               
write(JSRoyaleEmitter.formatNamespacedProperty(s, 
JSRoyaleEmitterTokens.SETTER_PREFIX.getToken() + propName, true));
+                               //String s = nsDef.getURI();
+                               
write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, 
JSRoyaleEmitterTokens.SETTER_PREFIX.getToken() + baseName, true));
                     }
                     else
                     {
                         write(ASEmitterTokens.MEMBER_ACCESS);
                         write(JSRoyaleEmitterTokens.SETTER_PREFIX);
-                       write(propName);
+                       write(baseName);
                     }
                 }
                 else if (getterNode != null && 
getterNode.getDefinition().isOverride())
@@ -448,19 +450,19 @@ public class AccessorEmitter extends JSSubEmitter 
implements
                         
write(getEmitter().formatQualifiedName(other.getParent().getQualifiedName()));
                         write(ASEmitterTokens.MEMBER_ACCESS);
                         write(JSEmitterTokens.PROTOTYPE);
-                        if (fjs.isCustomNamespace((FunctionNode)getterNode))
+                        if (p.uri != null)
                         {
                                        INamespaceDecorationNode ns = 
((FunctionNode)getterNode).getActualNamespaceNode();
                                        INamespaceDefinition nsDef = 
(INamespaceDefinition)ns.resolve(project);
                                        
fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names 
-                                       String s = nsDef.getURI();
-                                       
write(JSRoyaleEmitter.formatNamespacedProperty(s, 
JSRoyaleEmitterTokens.SETTER_PREFIX.getToken() + propName, true));
+                                       //String s = nsDef.getURI();
+                                       
write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, 
JSRoyaleEmitterTokens.SETTER_PREFIX.getToken() + baseName, true));
                         }
                         else
                         {
                             write(ASEmitterTokens.MEMBER_ACCESS);
                             write(JSRoyaleEmitterTokens.SETTER_PREFIX);
-                               write(propName);
+                               write(baseName);
                         }
                        }
                 }
@@ -479,6 +481,7 @@ public class AccessorEmitter extends JSSubEmitter implements
                 PropertyNodes p = 
getModel().getStaticPropertyMap().get(propName);
                 IGetterNode getterNode = p.getter;
                 ISetterNode setterNode = p.setter;
+                String baseName = p.name;
                 if (getModel().isExterns)
                 {
                        IAccessorNode node = (getterNode != null) ? getterNode 
: setterNode;
@@ -493,18 +496,18 @@ public class AccessorEmitter extends JSSubEmitter 
implements
                     else
                        writeNewline("  */");
                     write(getEmitter().formatQualifiedName(qname));
-                    if (fjs.isCustomNamespace((FunctionNode)node))
+                    if (p.uri != null)
                     {
                                INamespaceDecorationNode ns = 
((FunctionNode)node).getActualNamespaceNode();
                                INamespaceDefinition nsDef = 
(INamespaceDefinition)ns.resolve(project);
                                
fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names 
                                String s = nsDef.getURI();
-                               
write(JSRoyaleEmitter.formatNamespacedProperty(s, propName, true));
+                               
write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, baseName, true));
                     }
                     else
                     {
                         write(ASEmitterTokens.MEMBER_ACCESS);
-                       write(propName);
+                       write(baseName);
                     }
                     write(ASEmitterTokens.SEMICOLON);                  
                 }
@@ -516,19 +519,19 @@ public class AccessorEmitter extends JSSubEmitter 
implements
                            writeNewline();
                            writeNewline();
                            write(getEmitter().formatQualifiedName(qname));
-                           if (fjs.isCustomNamespace((FunctionNode)getterNode))
+                           if (p.uri != null)
                            {
                                        INamespaceDecorationNode ns = 
((FunctionNode)getterNode).getActualNamespaceNode();
                                        INamespaceDefinition nsDef = 
(INamespaceDefinition)ns.resolve(project);
                                        
fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names 
-                                       String s = nsDef.getURI();
-                                       
write(JSRoyaleEmitter.formatNamespacedProperty(s, 
JSRoyaleEmitterTokens.GETTER_PREFIX.getToken() + propName, true));
+                                       //String s = nsDef.getURI();
+                                       
write(JSRoyaleEmitter.formatNamespacedProperty(p.uri , 
JSRoyaleEmitterTokens.GETTER_PREFIX.getToken() + baseName, true));
                            }
                            else
                            {
                                write(ASEmitterTokens.MEMBER_ACCESS);
                                write(JSRoyaleEmitterTokens.GETTER_PREFIX);
-                               write(propName);
+                               write(baseName);
                            }
                            write(ASEmitterTokens.SPACE);
                            write(ASEmitterTokens.EQUAL);
@@ -546,19 +549,19 @@ public class AccessorEmitter extends JSSubEmitter 
implements
                            writeNewline();
                            writeNewline();
                            write(getEmitter().formatQualifiedName(qname));
-                           if (fjs.isCustomNamespace((FunctionNode)setterNode))
+                           if (p.uri != null)
                            {
                                        INamespaceDecorationNode ns = 
((FunctionNode)setterNode).getActualNamespaceNode();
                                        INamespaceDefinition nsDef = 
(INamespaceDefinition)ns.resolve(project);
                                        
fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names 
-                                       String s = nsDef.getURI();
-                                       
write(JSRoyaleEmitter.formatNamespacedProperty(s, 
JSRoyaleEmitterTokens.SETTER_PREFIX.getToken() + propName, true));
+                                       //String s = nsDef.getURI();
+                                       
write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, 
JSRoyaleEmitterTokens.SETTER_PREFIX.getToken() + baseName, true));
                            }
                            else
                            {
                                write(ASEmitterTokens.MEMBER_ACCESS);
                                write(JSRoyaleEmitterTokens.SETTER_PREFIX);
-                               write(propName);
+                               write(baseName);
                            }
                            write(ASEmitterTokens.SPACE);
                            write(ASEmitterTokens.EQUAL);
@@ -604,6 +607,7 @@ public class AccessorEmitter extends JSSubEmitter implements
                         propName);
                 IGetterNode getterNode = p.getter;
                 ISetterNode setterNode = p.setter;
+                String baseName = p.name;
                writeNewline("/**");
                 if (emitExports && !p.suppressExport)
                        writeNewline("  * @export");
@@ -611,7 +615,17 @@ public class AccessorEmitter extends JSSubEmitter 
implements
                        writeNewline("  * @type {" + 
JSGoogDocEmitter.convertASTypeToJSType(p.type.getBaseName(), 
p.type.getPackageName()) + "} */");
                 else
                        writeNewline("  */");
-                write(propName);
+                               FunctionNode fnNode = getterNode != null ? 
(FunctionNode) getterNode : (FunctionNode) setterNode;
+                               if (p.uri != null)
+                               {
+                                       INamespaceDecorationNode ns = 
fnNode.getActualNamespaceNode();
+                                       INamespaceDefinition nsDef = 
(INamespaceDefinition)ns.resolve(project);
+                                       
fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names
+                                       //String s = nsDef.getURI();
+                                       
write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, baseName, false));
+                               }
+                               else
+                                       write(baseName);
                 write(ASEmitterTokens.COLON);
                 write(ASEmitterTokens.SPACE);
                 write(ASEmitterTokens.BLOCK_OPEN);
@@ -622,19 +636,19 @@ public class AccessorEmitter extends JSSubEmitter 
implements
                     write(ASEmitterTokens.COLON);
                     write(ASEmitterTokens.SPACE);
                     write(getEmitter().formatQualifiedName(qname));
-                    if (fjs.isCustomNamespace((FunctionNode)getterNode))
+                    if (p.uri != null)
                     {
                                INamespaceDecorationNode ns = 
((FunctionNode)getterNode).getActualNamespaceNode();
                                INamespaceDefinition nsDef = 
(INamespaceDefinition)ns.resolve(project);
                                
fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names 
-                               String s = nsDef.getURI();
-                               
write(JSRoyaleEmitter.formatNamespacedProperty(s, 
JSRoyaleEmitterTokens.GETTER_PREFIX.getToken() + propName, true));
+                               //String s = nsDef.getURI();
+                               
write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, 
JSRoyaleEmitterTokens.GETTER_PREFIX.getToken() + baseName, true));
                     }
                     else
                     {
                         write(ASEmitterTokens.MEMBER_ACCESS);
                         write(JSRoyaleEmitterTokens.GETTER_PREFIX);
-                       write(propName);
+                       write(baseName);
                     }
                 }
                 if (setterNode != null)
@@ -646,19 +660,19 @@ public class AccessorEmitter extends JSSubEmitter 
implements
                     write(ASEmitterTokens.COLON);
                     write(ASEmitterTokens.SPACE);
                     write(getEmitter().formatQualifiedName(qname));
-                    if (fjs.isCustomNamespace((FunctionNode)setterNode))
+                    if (p.uri != null)
                     {
                                INamespaceDecorationNode ns = 
((FunctionNode)setterNode).getActualNamespaceNode();
                                INamespaceDefinition nsDef = 
(INamespaceDefinition)ns.resolve(project);
                                
fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names 
-                               String s = nsDef.getURI();
-                               
write(JSRoyaleEmitter.formatNamespacedProperty(s, 
JSRoyaleEmitterTokens.SETTER_PREFIX.getToken() + propName, true));
+                               //String s = nsDef.getURI();
+                               
write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, 
JSRoyaleEmitterTokens.SETTER_PREFIX.getToken() + baseName, true));
                     }
                     else
                     {
                         write(ASEmitterTokens.MEMBER_ACCESS);
                         write(JSRoyaleEmitterTokens.SETTER_PREFIX);
-                       write(propName);
+                       write(baseName);
                     }
                 }
                 write(ASEmitterTokens.BLOCK_CLOSE);
@@ -673,9 +687,9 @@ public class AccessorEmitter extends JSSubEmitter implements
     {
         // TODO (mschmalle) will remove this cast as more things get abstracted
         JSRoyaleEmitter fjs = (JSRoyaleEmitter) getEmitter();
-        boolean suppress = !getModel().suppressExports &&
-                               node.getASDocComment() != null &&
-                               
((ASDocComment)node.getASDocComment()).commentNoEnd().contains(JSRoyaleEmitterTokens.SUPPRESS_EXPORT.getToken());
+        boolean suppress = getModel().suppressExports ||
+                               (node.getASDocComment() != null &&
+                               
((ASDocComment)node.getASDocComment()).commentNoEnd().contains(JSRoyaleEmitterTokens.SUPPRESS_EXPORT.getToken()));
        if (suppress) getModel().suppressedExportNodes.add(node);
                                
         IDefinition def = node.getDefinition();
@@ -685,18 +699,35 @@ public class AccessorEmitter extends JSSubEmitter 
implements
         HashMap<String, PropertyNodes> map = isStatic ? getModel()
                 .getStaticPropertyMap() : getModel().getPropertyMap();
         String name = node.getName();
-               if (!isStatic && def != null && def.isPrivate() && 
getProject().getAllowPrivateNameConflicts())
-                       name = 
fjs.formatPrivateName(def.getParent().getQualifiedName(), name);
-        PropertyNodes p = map.get(name);
+               if (!isStatic && def != null && def.isPrivate() && 
getProject().getAllowPrivateNameConflicts())
+                       name = 
fjs.formatPrivateName(def.getParent().getQualifiedName(), name);
+
+               String uri = null;
+               String key = name;
+               if (!def.getNamespaceReference().isLanguageNamespace()) {
+                       //we need to include it in the name mappings
+                       uri = ((INamespaceDefinition) ((GetterNode) 
node).getActualNamespaceNode().resolve(getProject())).getURI();
+                       //make sure the key includes the uri to avoid clashing 
with other equivalent base names
+                       key =  uri + "::" + name;
+               }
+               
+               PropertyNodes p = map.get(key);
         if (p == null)
         {
             p = new PropertyNodes();
-            map.put(name, p);
-        }
+                       //track name and uri separately:
+                       p.name = name;
+                       p.uri = uri;
+                       //resolvedExport is true if it is a custom namespace or 
one of a paired of accessor definitions is public
+                       p.resolvedExport = uri != null || def.isPublic();
+            map.put(key, p);
+        } else {
+                       p.resolvedExport = p.resolvedExport || def.isPublic();
+               }
         p.getter = node;
                if (!p.suppressExport) p.suppressExport = suppress;
-        ICompilerProject project = (ICompilerProject)getWalker().getProject();
-        if (project != null)
+        ICompilerProject project = getWalker().getProject();
+        if (p.type == null && project != null)
                p.type = node.getDefinition().resolveReturnType(project);
         FunctionNode fn = (FunctionNode) node;
         fn.parseFunctionBody(fjs.getProblems());
@@ -707,9 +738,9 @@ public class AccessorEmitter extends JSSubEmitter implements
         // TODO (mschmalle) will remove this cast as more things get abstracted
         JSRoyaleEmitter fjs = (JSRoyaleEmitter) getEmitter();
         JSRoyaleDocEmitter doc = (JSRoyaleDocEmitter) fjs.getDocEmitter();
-               boolean suppress = !getModel().suppressExports &&
-                               node.getASDocComment() != null &&
-                               
((ASDocComment)node.getASDocComment()).commentNoEnd().contains(JSRoyaleEmitterTokens.SUPPRESS_EXPORT.getToken());
+               boolean suppress = getModel().suppressExports ||
+                               (node.getASDocComment() != null &&
+                               
((ASDocComment)node.getASDocComment()).commentNoEnd().contains(JSRoyaleEmitterTokens.SUPPRESS_EXPORT.getToken()));
                if (suppress) getModel().suppressedExportNodes.add(node);
 
         IFunctionDefinition def = node.getDefinition();
@@ -721,16 +752,32 @@ public class AccessorEmitter extends JSSubEmitter 
implements
         String name = node.getName();
                if (!isStatic && def != null && def.isPrivate() && 
getProject().getAllowPrivateNameConflicts())
                        name = 
fjs.formatPrivateName(def.getParent().getQualifiedName(), name);
-        PropertyNodes p = map.get(name);
+       String uri = null;
+       String key = name;
+               if (!def.getNamespaceReference().isLanguageNamespace()) {
+                       //we need to include it in the name mappings
+                       uri = ((INamespaceDefinition) ((SetterNode) 
node).getActualNamespaceNode().resolve(getProject())).getURI();
+                       //make sure the key includes the uri to avoid clashing 
with other equivalent base names
+                       key =  uri + "::" + name;
+               }
+               
+        PropertyNodes p = map.get(key);
         if (p == null)
         {
             p = new PropertyNodes();
-            map.put(name, p);
-        }
+            //track name and uri separately:
+            p.name = name;
+            p.uri = uri;
+                       //resolvedExport is true if it is a custom namespace or 
one of a paired of accessor definitions is public
+            p.resolvedExport = uri != null || def.isPublic();
+            map.put(key, p);
+        } else {
+                       p.resolvedExport = p.resolvedExport || def.isPublic();
+               }
         p.setter = node;
         if (!p.suppressExport) p.suppressExport = suppress;
         ICompilerProject project = (ICompilerProject)getWalker().getProject();
-        if (project != null)
+        if (p.type == null && project != null)
         {
                IParameterDefinition[] params = def.getParameters();
                p.type = params[0].resolveType(project);
diff --git 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/FieldEmitter.java
 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/FieldEmitter.java
index 784c9c5..1271863 100644
--- 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/FieldEmitter.java
+++ 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/FieldEmitter.java
@@ -25,24 +25,24 @@ import 
org.apache.royale.compiler.codegen.js.goog.IJSGoogDocEmitter;
 import org.apache.royale.compiler.common.ASModifier;
 import org.apache.royale.compiler.common.ModifiersSet;
 import org.apache.royale.compiler.constants.IASKeywordConstants;
-import org.apache.royale.compiler.definitions.IClassDefinition;
-import org.apache.royale.compiler.definitions.IDefinition;
-import org.apache.royale.compiler.definitions.IFunctionDefinition;
-import org.apache.royale.compiler.definitions.IVariableDefinition;
+import org.apache.royale.compiler.definitions.*;
 import org.apache.royale.compiler.internal.codegen.as.ASEmitterTokens;
 import org.apache.royale.compiler.internal.codegen.js.JSEmitterTokens;
 import 
org.apache.royale.compiler.internal.codegen.js.JSSessionModel.BindableVarInfo;
 import org.apache.royale.compiler.internal.codegen.js.JSSubEmitter;
+import org.apache.royale.compiler.internal.codegen.js.royale.JSRoyaleEmitter;
 import org.apache.royale.compiler.internal.codegen.js.utils.EmitterUtils;
 import org.apache.royale.compiler.internal.definitions.FunctionDefinition;
 import org.apache.royale.compiler.internal.projects.RoyaleJSProject;
 import org.apache.royale.compiler.internal.tree.as.ChainedVariableNode;
 import org.apache.royale.compiler.internal.tree.as.FunctionCallNode;
 import org.apache.royale.compiler.internal.tree.as.IdentifierNode;
+import org.apache.royale.compiler.internal.tree.as.VariableNode;
 import org.apache.royale.compiler.projects.ICompilerProject;
 import org.apache.royale.compiler.tree.ASTNodeID;
 import org.apache.royale.compiler.tree.as.IASNode;
 import org.apache.royale.compiler.tree.as.IExpressionNode;
+import org.apache.royale.compiler.tree.as.INamespaceDecorationNode;
 import org.apache.royale.compiler.tree.as.IVariableNode;
 import org.apache.royale.compiler.tree.metadata.IMetaTagNode;
 import org.apache.royale.compiler.tree.metadata.IMetaTagsNode;
@@ -65,7 +65,7 @@ public class FieldEmitter extends JSSubEmitter implements
     public void emit(IVariableNode node)
     {
         IDefinition definition = EmitterUtils.getClassDefinition(node);
-
+        JSRoyaleEmitter fjs = (JSRoyaleEmitter) getEmitter();
         IDefinition def = null;
         IExpressionNode enode = 
node.getVariableTypeNode();//getAssignedValueNode();
         if (enode != null)
@@ -111,7 +111,15 @@ public class FieldEmitter extends JSSubEmitter implements
             IDefinition nodeDef = node.getDefinition();
             if (nodeDef != null && !nodeDef.isStatic() && nodeDef.isPrivate() 
&& getProject().getAllowPrivateNameConflicts())
                                qname = 
getEmitter().formatPrivateName(nodeDef.getParent().getQualifiedName(), qname);
-            write(qname);
+    
+            if (EmitterUtils.isCustomNamespace(node.getNamespace())) {
+                INamespaceDecorationNode ns = ((VariableNode) 
node).getNamespaceNode();
+                INamespaceDefinition nsDef = 
(INamespaceDefinition)ns.resolve(getProject());
+                fjs.formatQualifiedName(nsDef.getQualifiedName()); // register 
with used names
+                String s = nsDef.getURI();
+                write(JSRoyaleEmitter.formatNamespacedProperty(s, qname, 
false));
+            }
+            else write(qname);
             endMapping(node.getNameExpressionNode());
         }
 
diff --git 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/IdentifierEmitter.java
 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/IdentifierEmitter.java
index 2b1008a..a8493e1 100644
--- 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/IdentifierEmitter.java
+++ 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/IdentifierEmitter.java
@@ -24,13 +24,8 @@ import org.apache.royale.abc.semantics.Namespace;
 import org.apache.royale.compiler.codegen.ISubEmitter;
 import org.apache.royale.compiler.codegen.js.IJSEmitter;
 import org.apache.royale.compiler.constants.IASLanguageConstants;
-import org.apache.royale.compiler.definitions.IConstantDefinition;
-import org.apache.royale.compiler.definitions.IDefinition;
-import org.apache.royale.compiler.definitions.IFunctionDefinition;
+import org.apache.royale.compiler.definitions.*;
 import 
org.apache.royale.compiler.definitions.IFunctionDefinition.FunctionClassification;
-import org.apache.royale.compiler.definitions.INamespaceDefinition;
-import org.apache.royale.compiler.definitions.IParameterDefinition;
-import org.apache.royale.compiler.definitions.IVariableDefinition;
 import 
org.apache.royale.compiler.definitions.IVariableDefinition.VariableClassification;
 import 
org.apache.royale.compiler.definitions.references.INamespaceResolvedReference;
 import org.apache.royale.compiler.internal.codegen.as.ASEmitterTokens;
@@ -76,6 +71,7 @@ public class IdentifierEmitter extends JSSubEmitter implements
         boolean identifierIsPlainFunction = nodeDef instanceof 
FunctionDefinition
                 && !identifierIsAccessorFunction;
         boolean emitName = true;
+        boolean wroteMemberAccess = false;
        JSRoyaleEmitter fjs = (JSRoyaleEmitter)getEmitter();
         RoyaleJSProject project = (RoyaleJSProject)getWalker().getProject();
        boolean isCustomNamespace = false;
@@ -209,8 +205,11 @@ public class IdentifierEmitter extends JSSubEmitter 
implements
                     endMapping(prevSibling);
                     startMapping(parentNode, prevSibling);
                 }
-                if (!isCustomNamespace && (!(identifierIsAccessorFunction && 
isStatic)))
-                       write(ASEmitterTokens.MEMBER_ACCESS);
+                if (!isCustomNamespace && (!(identifierIsAccessorFunction && 
isStatic))) {
+                    write(ASEmitterTokens.MEMBER_ACCESS);
+                    wroteMemberAccess = true;
+                }
+                
                 endMapping(parentNode);
             }
         }
@@ -253,8 +252,10 @@ public class IdentifierEmitter extends JSSubEmitter 
implements
                 else
                     write(ASEmitterTokens.THIS);
 
-                if (!isCustomNamespace)
-                       write(ASEmitterTokens.MEMBER_ACCESS);
+                if (!isCustomNamespace) {
+                    write(ASEmitterTokens.MEMBER_ACCESS);
+                    wroteMemberAccess = true;
+                }
                 endMapping(node);
             }
             else if (EmitterUtils.writeE4xFilterNode(getProject(), getModel(), 
node))
@@ -292,6 +293,7 @@ public class IdentifierEmitter extends JSSubEmitter 
implements
         
         if (emitName)
         {
+            boolean accessWithNS = !wroteMemberAccess;
             if (nodeDef != null)
             {
                 // this can be optimized but this way lets
@@ -308,6 +310,21 @@ public class IdentifierEmitter extends JSSubEmitter 
implements
                     {
                         isPackageOrFileMember = true;
                     }
+                    String ns = nodeDef.getNamespaceReference().getBaseName();
+                    isCustomNamespace = EmitterUtils.isCustomNamespace(ns);
+                    if (isCustomNamespace && parentNode instanceof 
IMemberAccessExpressionNode
+                            && ((IMemberAccessExpressionNode) 
parentNode).getRightOperandNode() == node) {
+                        accessWithNS = true;
+                        boolean wasCustomNamespace = false;
+                        //duplicate some checks in MemberAccessEmitter to 
avoid double output of MEMBER_ACCESS
+                        if (nodeDef instanceof IAccessorDefinition && 
((IMemberAccessExpressionNode) parentNode).getOperator() == 
IOperatorNode.OperatorType.MEMBER_ACCESS)
+                            wasCustomNamespace = 
fjs.isCustomNamespace((FunctionDefinition)nodeDef);
+                        
+                        if (nodeDef.isStatic() || !wasCustomNamespace) {
+                            //we already wrote member access before walking to 
this node.
+                            accessWithNS = false;
+                        }
+                    }
                 }
                 else if (nodeDef instanceof IFunctionDefinition)
                 {
@@ -336,8 +353,8 @@ public class IdentifierEmitter extends JSSubEmitter 
implements
                        }
                     else if (isCustomNamespace)
                     {
-                       String ns = 
((INamespaceResolvedReference)((FunctionDefinition)nodeDef).getNamespaceReference()).resolveAETNamespace(getProject()).getName();
-                       write(JSRoyaleEmitter.formatNamespacedProperty(ns, 
qname, true));
+                       String ns = 
((INamespaceResolvedReference)(nodeDef.getNamespaceReference())).resolveAETNamespace(getProject()).getName();
+                       write(JSRoyaleEmitter.formatNamespacedProperty(ns, 
qname, accessWithNS));
                     }
                     else if (identifierIsAccessorFunction && isStatic)
                     {
@@ -345,9 +362,11 @@ public class IdentifierEmitter extends JSSubEmitter 
implements
                     }
                        else
                        {
-                               qname = node.getName();
-                       if (nodeDef != null && !isStatic && 
(nodeDef.getParent() instanceof ClassDefinition) && (!(nodeDef instanceof 
IParameterDefinition)) && nodeDef.isPrivate() && 
getProject().getAllowPrivateNameConflicts())
-                               qname = 
getEmitter().formatPrivateName(nodeDef.getParent().getQualifiedName(), qname);
+                           if (!(nodeDef.getParent() instanceof 
IPackageDefinition)) {
+                            qname = node.getName();
+                            if (nodeDef != null && !isStatic && 
(nodeDef.getParent() instanceof ClassDefinition) && (!(nodeDef instanceof 
IParameterDefinition)) && nodeDef.isPrivate() && 
getProject().getAllowPrivateNameConflicts())
+                                qname = 
getEmitter().formatPrivateName(nodeDef.getParent().getQualifiedName(), qname);
+                        }
                        write(qname);
                        }
                 }
@@ -368,8 +387,8 @@ public class IdentifierEmitter extends JSSubEmitter 
implements
                 }
                 else if (isCustomNamespace)
                 {
-                       String ns = 
((INamespaceResolvedReference)((FunctionDefinition)nodeDef).getNamespaceReference()).resolveAETNamespace(getProject()).getName();
-                       write(JSRoyaleEmitter.formatNamespacedProperty(ns, 
qname, true));
+                       String ns = 
((INamespaceResolvedReference)nodeDef.getNamespaceReference()).resolveAETNamespace(getProject()).getName();
+                       write(JSRoyaleEmitter.formatNamespacedProperty(ns, 
qname, accessWithNS));
                 }
                 else if (identifierIsAccessorFunction && isStatic)
                 {
diff --git 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
index ebbae21..b4a8271 100644
--- 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
+++ 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
@@ -26,6 +26,9 @@ import 
org.apache.royale.compiler.constants.IASKeywordConstants;
 import org.apache.royale.compiler.constants.IASLanguageConstants;
 import org.apache.royale.compiler.constants.INamespaceConstants;
 import org.apache.royale.compiler.definitions.*;
+import org.apache.royale.compiler.definitions.IDefinition;
+import org.apache.royale.compiler.definitions.INamespaceDefinition;
+import org.apache.royale.compiler.definitions.IPackageDefinition;
 import org.apache.royale.compiler.internal.codegen.as.ASEmitterTokens;
 import org.apache.royale.compiler.internal.codegen.js.JSEmitterTokens;
 import org.apache.royale.compiler.internal.codegen.js.JSSubEmitter;
@@ -288,20 +291,25 @@ public class MemberAccessEmitter extends JSSubEmitter 
implements
                        IdentifierNode r = 
(IdentifierNode)(naen.getRightOperandNode());
                        // output bracket access with QName
                        writeLeftSide(node, leftNode, rightNode);
-                       write(ASEmitterTokens.SQUARE_OPEN);
-                       write(ASEmitterTokens.NEW);
-                       write(ASEmitterTokens.SPACE);
-                       write(IASLanguageConstants.QName);
-                       write(ASEmitterTokens.PAREN_OPEN);
-                       write(fjs.formatQualifiedName(d.getQualifiedName()));
-                       write(ASEmitterTokens.COMMA);
-                       write(ASEmitterTokens.SPACE);
-                       write(ASEmitterTokens.SINGLE_QUOTE);
-                       write(r.getName());
-                       write(ASEmitterTokens.SINGLE_QUOTE);
-                       write(ASEmitterTokens.PAREN_CLOSE);
-                       write(".objectAccessFormat()");
-                       write(ASEmitterTokens.SQUARE_CLOSE);
+                               //exception: variable member access needs to 
have literal output, because there is no guarantee that string access will work 
in release mode after renaming
+                               if (((NamespaceAccessExpressionNode) 
rightNode).resolve(getProject()) instanceof IVariableDefinition) {
+                                       
write(JSRoyaleEmitter.formatNamespacedProperty(d.toString(), r.getName(),true));
+                               } else {
+                                       write(ASEmitterTokens.SQUARE_OPEN);
+                                       write(ASEmitterTokens.NEW);
+                                       write(ASEmitterTokens.SPACE);
+                                       write(IASLanguageConstants.QName);
+                                       write(ASEmitterTokens.PAREN_OPEN);
+                                       
write(fjs.formatQualifiedName(d.getQualifiedName()));
+                                       write(ASEmitterTokens.COMMA);
+                                       write(ASEmitterTokens.SPACE);
+                                       write(ASEmitterTokens.SINGLE_QUOTE);
+                                       write(r.getName());
+                                       write(ASEmitterTokens.SINGLE_QUOTE);
+                                       write(ASEmitterTokens.PAREN_CLOSE);
+                                       write(".objectAccessFormat()");
+                                       write(ASEmitterTokens.SQUARE_CLOSE);
+                               }
                        return;
                }
         }
@@ -363,20 +371,25 @@ public class MemberAccessEmitter extends JSSubEmitter 
implements
                writeLeftSide(node, leftNode, rightNode);
                if (!d.getBaseName().equals(ASEmitterTokens.PRIVATE.getToken()))
                {
-                       write(ASEmitterTokens.SQUARE_OPEN);
-                       write(ASEmitterTokens.NEW);
-                       write(ASEmitterTokens.SPACE);
-                       write(IASLanguageConstants.QName);
-                       write(ASEmitterTokens.PAREN_OPEN);
-                       write(fjs.formatQualifiedName(d.getQualifiedName()));
-                       write(ASEmitterTokens.COMMA);
-                       write(ASEmitterTokens.SPACE);
-                       write(ASEmitterTokens.SINGLE_QUOTE);
-                       write(r.getName());
-                       write(ASEmitterTokens.SINGLE_QUOTE);
-                       write(ASEmitterTokens.PAREN_CLOSE);
-                       write(".objectAccessFormat()");
-                       write(ASEmitterTokens.SQUARE_CLOSE);
+                               //exception: variable member access needs to 
have literal output, because there is no guarantee that string access will work 
in release mode after renaming
+                       if (naen.resolve(getProject()) instanceof 
IVariableDefinition) {
+                                       
write(JSRoyaleEmitter.formatNamespacedProperty(d.toString(), r.getName(),true));
+                               } else {
+                                       write(ASEmitterTokens.SQUARE_OPEN);
+                                       write(ASEmitterTokens.NEW);
+                                       write(ASEmitterTokens.SPACE);
+                                       write(IASLanguageConstants.QName);
+                                       write(ASEmitterTokens.PAREN_OPEN);
+                                       
write(fjs.formatQualifiedName(d.getQualifiedName()));
+                                       write(ASEmitterTokens.COMMA);
+                                       write(ASEmitterTokens.SPACE);
+                                       write(ASEmitterTokens.SINGLE_QUOTE);
+                                       write(r.getName());
+                                       write(ASEmitterTokens.SINGLE_QUOTE);
+                                       write(ASEmitterTokens.PAREN_CLOSE);
+                                       write(".objectAccessFormat()");
+                                       write(ASEmitterTokens.SQUARE_CLOSE);
+                               }
                }
                else
                {
diff --git 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/PackageFooterEmitter.java
 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/PackageFooterEmitter.java
index a1cc1bf..00d4663 100644
--- 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/PackageFooterEmitter.java
+++ 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/PackageFooterEmitter.java
@@ -40,7 +40,10 @@ import 
org.apache.royale.compiler.internal.codegen.js.utils.EmitterUtils;
 import org.apache.royale.compiler.internal.definitions.ClassDefinition;
 import org.apache.royale.compiler.internal.driver.js.goog.JSGoogConfiguration;
 import org.apache.royale.compiler.internal.projects.RoyaleJSProject;
+import org.apache.royale.compiler.internal.tree.as.FunctionNode;
+import org.apache.royale.compiler.internal.tree.as.NamespaceIdentifierNode;
 import org.apache.royale.compiler.internal.tree.as.SetterNode;
+import org.apache.royale.compiler.internal.tree.as.VariableNode;
 import org.apache.royale.compiler.problems.UnknownTypeProblem;
 import org.apache.royale.compiler.projects.ICompilerProject;
 import org.apache.royale.compiler.scopes.IASScope;
@@ -222,6 +225,7 @@ public class PackageFooterEmitter extends JSSubEmitter 
implements
     public class VariableData
     {
        public String name;
+               public String customNS = null;
        public String type;
                public Boolean isStatic = false;
        public IMetaTagNode[] metaData;
@@ -230,6 +234,7 @@ public class PackageFooterEmitter extends JSSubEmitter 
implements
     public class MethodData
     {
        public String name;
+               public String customNS = null;
        public String type;
                public Boolean isStatic = false;
        public String declaredBy;
@@ -300,7 +305,11 @@ public class PackageFooterEmitter extends JSSubEmitter 
implements
                                if 
(getModel().suppressedExportNodes.contains(varNode)) {
                                        continue;
                                }
-                if (isInterface || (ns != null && 
ns.equals(IASKeywordConstants.PUBLIC )))
+                               String altNS = null;
+                               if (ns != null &&  
EmitterUtils.isCustomNamespace(ns)) {
+                                       altNS = 
((INamespaceDefinition)(((VariableNode) 
varNode).getNamespaceNode().resolve(getProject()))).getURI();
+                               }
+                if (isInterface || (ns != null && 
ns.equals(IASKeywordConstants.PUBLIC )) || altNS != null)
                 {
                        name = varNode.getName();
 
@@ -310,6 +319,7 @@ public class PackageFooterEmitter extends JSSubEmitter 
implements
                                                        && 
bindableVars.get(name).namespace.equals(IASKeywordConstants.PUBLIC)) {
 
                                                AccessorData bindableAccessor = 
new AccessorData();
+                                               bindableAccessor.customNS = 
altNS;
                                                bindableAccessor.name = name;
                                                bindableAccessor.access = 
"readwrite";
                                                bindableAccessor.type = 
bindableVars.get(name).type;
@@ -331,6 +341,7 @@ public class PackageFooterEmitter extends JSSubEmitter 
implements
                        VariableData data = new VariableData();
                        varData.add(data);
                        data.name = name;
+                       data.customNS = altNS;
                                        data.isStatic = isStatic;
                                        String qualifiedTypeName =      
varNode.getVariableTypeNode().resolveType(getProject()).getQualifiedName();
                                        data.type = 
fjs.formatQualifiedName(qualifiedTypeName, true);
@@ -385,23 +396,29 @@ public class PackageFooterEmitter extends JSSubEmitter 
implements
                IFunctionNode fnNode = (IFunctionNode)dnode;
                 String ns = fnNode.getNamespace();
                 boolean suppressed = 
getModel().suppressedExportNodes.contains(fnNode);
+       
+                               String altNS = null;
+                               if (ns != null &&  
EmitterUtils.isCustomNamespace(ns)) {
+                                       altNS = 
((INamespaceDefinition)(((FunctionNode) 
fnNode).getNamespaceNode().resolve(getProject()))).getURI();
+                               }
 
-                if (isInterface || (ns != null && 
ns.equals(IASKeywordConstants.PUBLIC)))
+                if (isInterface || (ns != null && 
ns.equals(IASKeywordConstants.PUBLIC)) || altNS != null)
                 {
                                        String accessorName = fnNode.getName();
-                       AccessorData data = accessorMap.get(accessorName);
+                                       String nameKey = altNS!=null? 
altNS+accessorName : accessorName;
+                       AccessorData data = accessorMap.get(nameKey);
                                        if (data == null) {
                                                if (suppressed) continue;
                                                data = new AccessorData();
                                        } else {
                                                if (suppressed) {
                                                        
accessorData.remove(data);
-                                                       
accessorMap.remove(accessorName);
+                                                       
accessorMap.remove(nameKey);
                                                        continue;
                                                }
                                        }
                        data.name = accessorName;
-
+                                       data.customNS = altNS;
                        if (!accessorData.contains(data)) 
accessorData.add(data);
                    if (dnode.getNodeID() == ASTNodeID.GetterID) {
                                                data.type = 
fnNode.getReturnTypeNode().resolveType(getProject()).getQualifiedName();
@@ -415,7 +432,7 @@ public class PackageFooterEmitter extends JSSubEmitter 
implements
                                                        data.access = 
"writeonly";
                                                } else data.access = 
"readwrite";
                                        }
-                       accessorMap.put(data.name, data);
+                       accessorMap.put(nameKey, data);
                    data.type = fjs.formatQualifiedName(data.type, true);
                    IClassNode declarer = 
(IClassNode)fnNode.getAncestorOfType(IClassNode.class);
                    String declarant = 
fjs.formatQualifiedName(tnode.getQualifiedName(), true);
@@ -457,13 +474,20 @@ public class PackageFooterEmitter extends JSSubEmitter 
implements
             {
                IFunctionNode fnNode = (IFunctionNode)dnode;
                 String ns = fnNode.getNamespace();
-                if (isInterface || (ns != null && 
ns.equals(IASKeywordConstants.PUBLIC)))
+       
+                               String altNS = null;
+                               if (ns != null && 
EmitterUtils.isCustomNamespace(ns)) {
+                                       altNS = 
((INamespaceDefinition)(((FunctionNode) 
fnNode).getNamespaceNode().resolve(getProject()))).getURI();
+                               }
+                
+                if (isInterface || (ns != null && 
ns.equals(IASKeywordConstants.PUBLIC)) || altNS != null)
                 {
                        if (getModel().suppressedExportNodes.contains(fnNode)) 
continue;
                        MethodData data = new MethodData();
                                        data.isStatic = isStatic;
                        methodData.add(data);
                        data.name = fnNode.getName();
+                       data.customNS = altNS;
                                        String qualifiedTypeName =      
fnNode.getReturnType();
                                        if (!(qualifiedTypeName.equals("") || 
qualifiedTypeName.equals("void"))) {
                                                        qualifiedTypeName = 
fnNode.getReturnTypeNode().resolveType(getProject()).getQualifiedName();
@@ -631,6 +655,10 @@ public class PackageFooterEmitter extends JSSubEmitter 
implements
                                        if (var.isStatic) {
                                            write("|");
                     }
+                                       if (var.customNS != null) {
+                                               write(var.customNS);
+                                               write("::");
+                                       }
                                        write(var.name);
                                        write(ASEmitterTokens.SINGLE_QUOTE);
                                        writeToken(ASEmitterTokens.COLON);
@@ -665,7 +693,12 @@ public class PackageFooterEmitter extends JSSubEmitter 
implements
                                        writeToken(ASEmitterTokens.PAREN_CLOSE);
                                        write(ASEmitterTokens.BLOCK_OPEN);
                                        String getterSetter;
-                                       String field = var.isStatic ? typeName 
+ "." + var.name : "inst." + var.name;
+                                       String varName;
+                                       if (var.customNS != null) {
+                                               varName = 
JSRoyaleEmitter.formatNamespacedProperty(var.customNS, var.name, false);
+                                       } else varName = var.name;
+                                       
+                                       String field = var.isStatic ? typeName 
+ "." + varName : "inst." + varName;
                                        if (valueIsUntyped) {
                                                //to avoid setting when type is 
'*' set the 'value' param to the function being called, which
                                                //causes a 'getter only' result
@@ -731,6 +764,10 @@ public class PackageFooterEmitter extends JSSubEmitter 
implements
                                if (accessor.isStatic) {
                                        write("|");
                                }
+                               if (accessor.customNS != null) {
+                                       write(accessor.customNS);
+                                       write("::");
+                               }
                                write(accessor.name);
                                write(ASEmitterTokens.SINGLE_QUOTE);
                                writeToken(ASEmitterTokens.COLON);
@@ -805,6 +842,10 @@ public class PackageFooterEmitter extends JSSubEmitter 
implements
                                if (method.isStatic) {
                                        write("|");
                                }
+                               if (method.customNS != null) {
+                                       write(method.customNS);
+                                       write("::");
+                               }
                                write(method.name);
                                write(ASEmitterTokens.SINGLE_QUOTE);
                                writeToken(ASEmitterTokens.COLON);
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 c14e277..d9b4c0a 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,7 +594,8 @@ public class JSRoyaleDocEmitter extends JSGoogDocEmitter
                     
.contains(JSRoyaleEmitterTokens.SUPPRESS_EXPORT.getToken()));
             
             if (!avoidExport) {
-                emitPublic(node);
+                if (ns.equals(IASKeywordConstants.PUBLIC))
+                    emitPublic(node);
             } else {
                 //we should also remove it from reflection data... provide a 
check here for that.
                 
((JSRoyaleEmitter)emitter).getModel().suppressedExportNodes.add(node);
diff --git 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/utils/EmitterUtils.java
 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/utils/EmitterUtils.java
index c227a40..24575cc 100644
--- 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/utils/EmitterUtils.java
+++ 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/utils/EmitterUtils.java
@@ -25,8 +25,10 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.royale.compiler.constants.IASKeywordConstants;
 import org.apache.royale.compiler.constants.IASLanguageConstants;
 import org.apache.royale.compiler.constants.IASLanguageConstants.BuiltinType;
+import org.apache.royale.compiler.constants.INamespaceConstants;
 import org.apache.royale.compiler.definitions.IClassDefinition;
 import org.apache.royale.compiler.definitions.IDefinition;
 import org.apache.royale.compiler.definitions.IFunctionDefinition;
@@ -884,5 +886,18 @@ public class EmitterUtils
         argsNode.addChild((NodeBase) defaultNamespace, position);
         ((NodeBase) defaultNamespace).setParent(argsNode);
     }
+    
+    public static boolean isCustomNamespace(String ns) {
+        if (ns != null)
+        {
+            return (!(  ns.equals(IASKeywordConstants.PRIVATE) ||
+                        ns.equals(IASKeywordConstants.PROTECTED) ||
+                        ns.equals(IASKeywordConstants.INTERNAL) ||
+                        ns.equals(INamespaceConstants.AS3URI) ||
+                        ns.equals(IASKeywordConstants.PUBLIC)
+                    ));
+        }
+        return false;
+    }
 
 }
diff --git 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleAccessorMembers.java
 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleAccessorMembers.java
index e330925..89e2c8d 100644
--- 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleAccessorMembers.java
+++ 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleAccessorMembers.java
@@ -39,7 +39,7 @@ public class TestRoyaleAccessorMembers extends 
TestGoogAccessorMembers
         asBlockWalker.visitClass(node);
         assertOut("/**\n * @constructor\n */\nRoyaleTest_A = function() 
{\n};\n\n\n/**\n * Prevent renaming of class. Needed for reflection.\n 
*/\ngoog.exportSymbol('RoyaleTest_A', RoyaleTest_A);\n\n\n" +
                                "RoyaleTest_A.prototype.get__foo = function() 
{\n};\n\n\n" +
-                       "Object.defineProperties(RoyaleTest_A.prototype, /** 
@lends {RoyaleTest_A.prototype} */ {\n/**\n  * @export\n  * @type {number} 
*/\nfoo: {\nget: RoyaleTest_A.prototype.get__foo}}\n);");
+                       "Object.defineProperties(RoyaleTest_A.prototype, /** 
@lends {RoyaleTest_A.prototype} */ {\n/**\n  * @type {number} */\nfoo: {\nget: 
RoyaleTest_A.prototype.get__foo}}\n);");
     }
 
     @Override
@@ -51,7 +51,7 @@ public class TestRoyaleAccessorMembers extends 
TestGoogAccessorMembers
         asBlockWalker.visitClass(node);
         assertOut("/**\n * @constructor\n */\nRoyaleTest_A = function() 
{\n};\n\n\n/**\n * Prevent renaming of class. Needed for reflection.\n 
*/\ngoog.exportSymbol('RoyaleTest_A', RoyaleTest_A);\n\n\n" +
                                "RoyaleTest_A.prototype.get__foo = function() 
{\n  return -1;\n};\n\n\n" +
-                       "Object.defineProperties(RoyaleTest_A.prototype, /** 
@lends {RoyaleTest_A.prototype} */ {\n/**\n  * @export\n  * @type {number} 
*/\nfoo: {\nget: RoyaleTest_A.prototype.get__foo}}\n);");
+                       "Object.defineProperties(RoyaleTest_A.prototype, /** 
@lends {RoyaleTest_A.prototype} */ {\n/**\n  * @type {number} */\nfoo: {\nget: 
RoyaleTest_A.prototype.get__foo}}\n);");
     }
 
     @Override
@@ -108,9 +108,10 @@ public class TestRoyaleAccessorMembers extends 
TestGoogAccessorMembers
        IClassNode node = (IClassNode) getNode("function set 
foo(value:int):void{}",
                        IClassNode.class, WRAP_LEVEL_CLASS);
         asBlockWalker.visitClass(node);
+        // /**\n * @constructor\n */\nRoyaleTest_A = function() 
{\n};\n\n\n/**\n * Prevent renaming of class. Needed for reflection.\n 
*/\ngoog.exportSymbol('RoyaleTest_A', 
RoyaleTest_A);\n\n\nRoyaleTest_A.prototype.set__foo = function(value) 
{\n};\n\n\nObject.defineProperties(RoyaleTest_A.prototype, /** @lends 
{RoyaleTest_A.prototype} */ {\n/**\n  * @type {number} */\nfoo: {\nset: 
RoyaleTest_A.prototype.set__foo}}\n);
         assertOut("/**\n * @constructor\n */\nRoyaleTest_A = function() 
{\n};\n\n\n/**\n * Prevent renaming of class. Needed for reflection.\n 
*/\ngoog.exportSymbol('RoyaleTest_A', RoyaleTest_A);\n\n\n" +
                                "RoyaleTest_A.prototype.set__foo = 
function(value) {\n};\n\n\n" +
-                       "Object.defineProperties(RoyaleTest_A.prototype, /** 
@lends {RoyaleTest_A.prototype} */ {\n/**\n  * @export\n  * @type {number} 
*/\nfoo: {\nset: RoyaleTest_A.prototype.set__foo}}\n);");
+                       "Object.defineProperties(RoyaleTest_A.prototype, /** 
@lends {RoyaleTest_A.prototype} */ {\n/**\n  * @type {number} */\nfoo: {\nset: 
RoyaleTest_A.prototype.set__foo}}\n);");
     }
 
     @Override
@@ -122,7 +123,7 @@ public class TestRoyaleAccessorMembers extends 
TestGoogAccessorMembers
         asBlockWalker.visitClass(node);
         assertOut("/**\n * @constructor\n */\nRoyaleTest_A = function() 
{\n};\n\n\n/**\n * Prevent renaming of class. Needed for reflection.\n 
*/\ngoog.exportSymbol('RoyaleTest_A', RoyaleTest_A);\n\n\n" +
                                "RoyaleTest_A.prototype.set__foo = 
function(value) {\n  fetch('haai');\n};\n\n\n" +
-                       "Object.defineProperties(RoyaleTest_A.prototype, /** 
@lends {RoyaleTest_A.prototype} */ {\n/**\n  * @export\n  * @type {number} 
*/\nfoo: {\nset: RoyaleTest_A.prototype.set__foo}}\n);");
+                       "Object.defineProperties(RoyaleTest_A.prototype, /** 
@lends {RoyaleTest_A.prototype} */ {\n/**\n  * @type {number} */\nfoo: {\nset: 
RoyaleTest_A.prototype.set__foo}}\n);");
     }
 
     @Override
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 5a8af9a..f92714a 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
@@ -44,13 +44,13 @@ public class TestRoyaleFieldMembers extends 
TestGoogFieldMembers
     {
         IVariableNode node = getField("var foo;");
         asBlockWalker.visitVariable(node);
-        assertOut("/**\n * @export\n * @type {*}\n 
*/\nRoyaleTest_A.prototype.foo");
+        assertOut("/**\n * @type {*}\n */\nRoyaleTest_A.prototype.foo");
     }
 
     @Test
     public void testField_withStringSetToNull()
     {
-        IVariableNode node = getField("var foo:String = null;");
+        IVariableNode node = getField("public var foo:String = null;");
         asBlockWalker.visitVariable(node);
         assertOut("/**\n * @export\n * @type {string}\n 
*/\nRoyaleTest_A.prototype.foo = null");
     }
@@ -59,7 +59,7 @@ public class TestRoyaleFieldMembers extends 
TestGoogFieldMembers
     @Test
     public void testField_withType()
     {
-        IVariableNode node = getField("var foo:int;");
+        IVariableNode node = getField("public var foo:int;");
         asBlockWalker.visitVariable(node);
         assertOut("/**\n * @export\n * @type {number}\n 
*/\nRoyaleTest_A.prototype.foo = 0");
     }
@@ -68,7 +68,7 @@ public class TestRoyaleFieldMembers extends 
TestGoogFieldMembers
     @Test
     public void testField_withTypeValue()
     {
-        IVariableNode node = getField("var foo:int = 420;");
+        IVariableNode node = getField("public var foo:int = 420;");
         asBlockWalker.visitVariable(node);
         assertOut("/**\n * @export\n * @type {number}\n 
*/\nRoyaleTest_A.prototype.foo = 420");
     }
@@ -76,7 +76,7 @@ public class TestRoyaleFieldMembers extends 
TestGoogFieldMembers
     @Test
     public void testField_withTypeValue_Negative()
     {
-        IVariableNode node = getField("var foo:int = -420;");
+        IVariableNode node = getField("public var foo:int = -420;");
         asBlockWalker.visitVariable(node);
         assertOut("/**\n * @export\n * @type {number}\n 
*/\nRoyaleTest_A.prototype.foo = -420");
     }
@@ -84,7 +84,7 @@ public class TestRoyaleFieldMembers extends 
TestGoogFieldMembers
     @Test
     public void testField_withTypeValue_IntDecimal()
     {
-        IVariableNode node = getField("var foo:int = -123.4;");
+        IVariableNode node = getField("public var foo:int = -123.4;");
         asBlockWalker.visitVariable(node);
         assertOut("/**\n * @export\n * @type {number}\n 
*/\nRoyaleTest_A.prototype.foo = -123");
     }
@@ -92,7 +92,7 @@ public class TestRoyaleFieldMembers extends 
TestGoogFieldMembers
     @Test
     public void testField_withTypeValue_UintDecimal()
     {
-        IVariableNode node = getField("var foo:uint = 123.4;");
+        IVariableNode node = getField("public var foo:uint = 123.4;");
         asBlockWalker.visitVariable(node);
         assertOut("/**\n * @export\n * @type {number}\n 
*/\nRoyaleTest_A.prototype.foo = 123");
     }
@@ -100,7 +100,7 @@ public class TestRoyaleFieldMembers extends 
TestGoogFieldMembers
     @Test
     public void testField_withTypeValue_UintNegative()
     {
-        IVariableNode node = getField("var foo:uint = -123;");
+        IVariableNode node = getField("public var foo:uint = -123;");
         asBlockWalker.visitVariable(node);
         assertOut("/**\n * @export\n * @type {number}\n 
*/\nRoyaleTest_A.prototype.foo = 4294967173");
     }
@@ -127,11 +127,12 @@ public class TestRoyaleFieldMembers extends 
TestGoogFieldMembers
     @Test
     public void testField_withCustomNamespaceTypeValue()
     {
-        IVariableNode node = getField("mx_internal var foo:int = 420;");
+        IVariableNode node = getField("import custom.custom_namespace; 
custom_namespace var foo:int = 420;");
         asBlockWalker.visitVariable(node);
         // (erikdebruin) we ignore custom namespaces completely (are there 
side effects I'm missing?)
-        assertOut("/**\n * @export\n * @type {number}\n 
*/\nRoyaleTest_A.prototype.foo = 420");
+        assertOut("/**\n * @type {number}\n 
*/\nRoyaleTest_A.prototype.http_$$ns_apache_org$2017$custom$namespace__foo = 
420");
     }
+    
 
     @Override
     @Test
@@ -166,13 +167,13 @@ public class TestRoyaleFieldMembers extends 
TestGoogFieldMembers
     {
         IVariableNode node = getField("static var foo;");
         asBlockWalker.visitVariable(node);
-        assertOut("/**\n * @export\n * @type {*}\n */\nRoyaleTest_A.foo");
+        assertOut("/**\n * @type {*}\n */\nRoyaleTest_A.foo");
     }
 
     @Test
     public void testStaticField_withType()
     {
-        IVariableNode node = getField("static var foo:int;");
+        IVariableNode node = getField("public static var foo:int;");
         asBlockWalker.visitVariable(node);
         assertOut("/**\n * @export\n * @type {number}\n */\nRoyaleTest_A.foo = 
0");
     }
@@ -182,7 +183,7 @@ public class TestRoyaleFieldMembers extends 
TestGoogFieldMembers
     {
         IVariableNode node = getField("static var foo:int = 420;");
         asBlockWalker.visitVariable(node);
-        assertOut("/**\n * @export\n * @type {number}\n */\nRoyaleTest_A.foo = 
420");
+        assertOut("/**\n * @type {number}\n */\nRoyaleTest_A.foo = 420");
     }
 
     @Test
@@ -256,7 +257,7 @@ public class TestRoyaleFieldMembers extends 
TestGoogFieldMembers
     @Test
     public void testConstant()
     {
-        IVariableNode node = getField("static const foo;");
+        IVariableNode node = getField("public static const foo;");
         asBlockWalker.visitVariable(node);
         assertOut("/**\n * @export\n * @const\n * @type {*}\n 
*/\nRoyaleTest_A.foo");
     }
@@ -264,7 +265,7 @@ public class TestRoyaleFieldMembers extends 
TestGoogFieldMembers
     @Test
     public void testConstant_nonStatic()
     {
-        IVariableNode node = getField("const foo;");
+        IVariableNode node = getField("public const foo;");
         asBlockWalker.visitVariable(node);
         assertOut("/**\n * @export\n * @const\n * @type {*}\n 
*/\nRoyaleTest_A.prototype.foo");
     }
@@ -273,7 +274,7 @@ public class TestRoyaleFieldMembers extends 
TestGoogFieldMembers
     @Test
     public void testConstant_withType()
     {
-        IVariableNode node = getField("static const foo:int;");
+        IVariableNode node = getField("public static const foo:int;");
         asBlockWalker.visitVariable(node);
         assertOut("/**\n * @export\n * @const\n * @type {number}\n 
*/\nRoyaleTest_A.foo = 0");
     }
@@ -281,7 +282,7 @@ public class TestRoyaleFieldMembers extends 
TestGoogFieldMembers
     @Test
     public void testConstant_withType_nonStatic()
     {
-        IVariableNode node = getField("const foo:int;");
+        IVariableNode node = getField("public const foo:int;");
         asBlockWalker.visitVariable(node);
         assertOut("/**\n * @export\n * @const\n * @type {number}\n 
*/\nRoyaleTest_A.prototype.foo = 0");
     }
@@ -290,7 +291,7 @@ public class TestRoyaleFieldMembers extends 
TestGoogFieldMembers
     @Test
     public void testConstant_withTypeValue()
     {
-        IVariableNode node = getField("static const foo:int = 420;");
+        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");
     }
@@ -298,7 +299,7 @@ public class TestRoyaleFieldMembers extends 
TestGoogFieldMembers
     @Test
     public void testConstant_withComplexTypeValue()
     {
-        IVariableNode node = getField("static const foo:Number = 
parseFloat('1E2');");
+        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')");
     }
@@ -306,7 +307,7 @@ public class TestRoyaleFieldMembers extends 
TestGoogFieldMembers
     @Test
     public void testConstant_withTypeValue_nonStatic()
     {
-        IVariableNode node = getField("const foo:int = 420;");
+        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");
     }
@@ -359,18 +360,19 @@ public class TestRoyaleFieldMembers extends 
TestGoogFieldMembers
     @Test
     public void testConstant_withCustomNamespaceTypeValue()
     {
-        IVariableNode node = getField("mx_internal static const foo:int = 
420;");
+        IVariableNode node = getField("import custom.custom_namespace; 
custom_namespace static const foo:int = 420;");
         asBlockWalker.visitVariable(node);
-        // (erikdebruin) we ignore custom namespaces completely (are there 
side effects I'm missing?)
-        assertOut("/**\n * @export\n * @const\n * @type {number}\n 
*/\nRoyaleTest_A.foo = 420");
+
+        assertOut("/**\n * @const\n * @type {number}\n 
*/\nRoyaleTest_A.http_$$ns_apache_org$2017$custom$namespace__foo = 420");
     }
 
     @Test
     public void testConstant_withCustomNamespaceTypeValue_nonStatic()
     {
-        IVariableNode node = getField("mx_internal const foo:int = 420;");
+        IVariableNode node = getField("import custom.custom_namespace; 
custom_namespace const foo:int = 420;");
         asBlockWalker.visitVariable(node);
-        // (erikdebruin) we ignore custom namespaces completely (are there 
side effects I'm missing?)
-        assertOut("/**\n * @export\n * @const\n * @type {number}\n 
*/\nRoyaleTest_A.prototype.foo = 420");
+
+        assertOut("/**\n * @const\n * @type {number}\n 
*/\nRoyaleTest_A.prototype.http_$$ns_apache_org$2017$custom$namespace__foo = 
420");
     }
+    
 }
diff --git 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleGlobalConstants.java
 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleGlobalConstants.java
index e2151a3..8cc7803 100644
--- 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleGlobalConstants.java
+++ 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleGlobalConstants.java
@@ -43,7 +43,7 @@ public class TestRoyaleGlobalConstants extends 
TestGoogGlobalConstants
     {
         IVariableNode node = getField("var a:Number = Infinity;");
         asBlockWalker.visitVariable(node);
-        assertOut("/**\n * @export\n * @type {number}\n 
*/\nRoyaleTest_A.prototype.a = Infinity");
+        assertOut("/**\n * @type {number}\n */\nRoyaleTest_A.prototype.a = 
Infinity");
     }
 
     @Override
@@ -52,7 +52,7 @@ public class TestRoyaleGlobalConstants extends 
TestGoogGlobalConstants
     {
         IVariableNode node = getField("var a:Number = -Infinity;");
         asBlockWalker.visitVariable(node);
-        assertOut("/**\n * @export\n * @type {number}\n 
*/\nRoyaleTest_A.prototype.a = -Infinity");
+        assertOut("/**\n * @type {number}\n */\nRoyaleTest_A.prototype.a = 
-Infinity");
     }
 
     @Override
@@ -61,7 +61,7 @@ public class TestRoyaleGlobalConstants extends 
TestGoogGlobalConstants
     {
         IVariableNode node = getField("var a:Number = NaN;");
         asBlockWalker.visitVariable(node);
-        assertOut("/**\n * @export\n * @type {number}\n 
*/\nRoyaleTest_A.prototype.a = NaN");
+        assertOut("/**\n * @type {number}\n */\nRoyaleTest_A.prototype.a = 
NaN");
     }
 
     @Override
@@ -70,6 +70,6 @@ public class TestRoyaleGlobalConstants extends 
TestGoogGlobalConstants
     {
         IVariableNode node = getField("var a:* = undefined;");
         asBlockWalker.visitVariable(node);
-        assertOut("/**\n * @export\n * @type {*}\n 
*/\nRoyaleTest_A.prototype.a = undefined");
+        assertOut("/**\n * @type {*}\n */\nRoyaleTest_A.prototype.a = 
undefined");
     }
 }
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 335b575..4260a01 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
@@ -697,7 +697,7 @@ public class TestRoyalePackage extends TestGoogPackage
                                "\n" +
                                "\n" +
                                "/**\n" +
-                               " * @export\n" +
+                               //" * @export\n" +
                                " * @type {number}\n" +
                                " */\n" +
                                "foo.bar.baz.A.internalVar = 2"
diff --git 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/sourcemaps/TestSourceMapFieldMembers.java
 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/sourcemaps/TestSourceMapFieldMembers.java
index 45badb6..503923c 100644
--- 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/sourcemaps/TestSourceMapFieldMembers.java
+++ 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/sourcemaps/TestSourceMapFieldMembers.java
@@ -32,8 +32,8 @@ public class TestSourceMapFieldMembers extends 
SourceMapTestBase
     {
         IVariableNode node = getField("var foo;");
         asBlockWalker.visitVariable(node);
-        ///**\n * @export\n * @type {*}\n */\nRoyaleTest_A.prototype.foo
-        assertMapping(node, 0, 4, 4, 0, 4, 26);  // foo
+        ///**\n * @type {*}\n */\nRoyaleTest_A.prototype.foo
+        assertMapping(node, 0, 4, 3, 0, 3, 26);  // foo
     }
 
     @Test
@@ -41,10 +41,10 @@ public class TestSourceMapFieldMembers extends 
SourceMapTestBase
     {
         IVariableNode node = getField("var foo:String = null;");
         asBlockWalker.visitVariable(node);
-        //**\n * @export\n * @type {string}\n */\nRoyaleTest_A.prototype.foo = 
null
-        assertMapping(node, 0, 4, 4, 0, 4, 26);  // foo
-        assertMapping(node, 0, 14, 4, 26, 4, 29);  // =
-        assertMapping(node, 0, 17, 4, 29, 4, 33);  // null
+        //**\n * @type {string}\n */\nRoyaleTest_A.prototype.foo = null
+        assertMapping(node, 0, 4, 3, 0, 3, 26);  // foo
+        assertMapping(node, 0, 14, 3, 26, 3, 29);  // =
+        assertMapping(node, 0, 17, 3, 29, 3, 33);  // null
     }
 
     @Test
@@ -52,8 +52,8 @@ public class TestSourceMapFieldMembers extends 
SourceMapTestBase
     {
         IVariableNode node = getField("var foo:int;");
         asBlockWalker.visitVariable(node);
-        ///**\n * @export\n * @type {number}\n */\nRoyaleTest_A.prototype.foo 
= 0
-        assertMapping(node, 0, 4, 4, 0, 4, 26);  // foo
+        ///**\n * @type {number}\n */\nRoyaleTest_A.prototype.foo = 0
+        assertMapping(node, 0, 4, 3, 0, 3, 26);  // foo
     }
 
     @Test
@@ -61,10 +61,10 @@ public class TestSourceMapFieldMembers extends 
SourceMapTestBase
     {
         IVariableNode node = getField("var foo = 420;");
         asBlockWalker.visitVariable(node);
-        ///**\n * @export\n * @type {*}\n */\nRoyaleTest_A.prototype.foo = 420
-        assertMapping(node, 0, 4, 4, 0, 4, 26);  // foo
-        assertMapping(node, 0, 7, 4, 26, 4, 29);  // =
-        assertMapping(node, 0, 10, 4, 29, 4, 32);  // 420
+        ///**\n * @type {*}\n */\nRoyaleTest_A.prototype.foo = 420
+        assertMapping(node, 0, 4, 3, 0, 3, 26);  // foo
+        assertMapping(node, 0, 7, 3, 26, 3, 29);  // =
+        assertMapping(node, 0, 10, 3, 29, 3, 32);  // 420
     }
 
     @Test
@@ -72,10 +72,10 @@ public class TestSourceMapFieldMembers extends 
SourceMapTestBase
     {
         IVariableNode node = getField("var foo:int = 420;");
         asBlockWalker.visitVariable(node);
-        ///**\n * @export\n * @type {number}\n */\nRoyaleTest_A.prototype.foo 
= 420
-        assertMapping(node, 0, 4, 4, 0, 4, 26);  // foo
-        assertMapping(node, 0, 11, 4, 26, 4, 29);  // =
-        assertMapping(node, 0, 14, 4, 29, 4, 32);  // 420
+        ///**\n * @type {number}\n */\nRoyaleTest_A.prototype.foo = 420
+        assertMapping(node, 0, 4, 3, 0, 3, 26);  // foo
+        assertMapping(node, 0, 11, 3, 26, 3, 29);  // =
+        assertMapping(node, 0, 14, 3, 29, 3, 32);  // 420
     }
 
     @Test
@@ -83,8 +83,8 @@ public class TestSourceMapFieldMembers extends 
SourceMapTestBase
     {
         IVariableNode node = getField("static var foo;");
         asBlockWalker.visitVariable(node);
-        ////**\n * @export\n * @type {*}\n */\nRoyaleTest_A.foo
-        assertMapping(node, 0, 11, 4, 0, 4, 16);  // foo
+        ////**\n * @type {*}\n */\nRoyaleTest_A.foo
+        assertMapping(node, 0, 11, 3, 0, 3, 16);  // foo
     }
 
     @Test
@@ -92,8 +92,8 @@ public class TestSourceMapFieldMembers extends 
SourceMapTestBase
     {
         IVariableNode node = getField("static var foo:int;");
         asBlockWalker.visitVariable(node);
-        ///**\n * @export\n * @type {number}\n */\nRoyaleTest_A.foo = 0
-        assertMapping(node, 0, 11, 4, 0, 4, 16);  // foo
+        ///**\n * @type {number}\n */\nRoyaleTest_A.foo = 0
+        assertMapping(node, 0, 11, 3, 0, 3, 16);  // foo
     }
 
     @Test
@@ -101,10 +101,10 @@ public class TestSourceMapFieldMembers extends 
SourceMapTestBase
     {
         IVariableNode node = getField("static var foo = 420;");
         asBlockWalker.visitVariable(node);
-        ///**\n * @export\n * @type {*}\n */\nRoyaleTest_A.foo = 420
-        assertMapping(node, 0, 11, 4, 0, 4, 16);   // foo
-        assertMapping(node, 0, 14, 4, 16, 4, 19);  // =
-        assertMapping(node, 0, 17, 4, 19, 4, 22);  // 420
+        ///**\n * @type {*}\n */\nRoyaleTest_A.foo = 420
+        assertMapping(node, 0, 11, 3, 0, 3, 16);   // foo
+        assertMapping(node, 0, 14, 3, 16, 3, 19);  // =
+        assertMapping(node, 0, 17, 3, 19, 3, 22);  // 420
     }
 
     @Test
@@ -112,10 +112,10 @@ public class TestSourceMapFieldMembers extends 
SourceMapTestBase
     {
         IVariableNode node = getField("static var foo:int = 420;");
         asBlockWalker.visitVariable(node);
-        ///**\n * @export\n * @type {number}\n */\nRoyaleTest_A.foo = 420
-        assertMapping(node, 0, 11, 4, 0, 4, 16);  // foo
-        assertMapping(node, 0, 18, 4, 16, 4, 19);  // =
-        assertMapping(node, 0, 21, 4, 19, 4, 22);  // 420
+        ///**\n * @type {number}\n */\nRoyaleTest_A.foo = 420
+        assertMapping(node, 0, 11, 3, 0, 3, 16);  // foo
+        assertMapping(node, 0, 18, 3, 16, 3, 19);  // =
+        assertMapping(node, 0, 21, 3, 19, 3, 22);  // 420
     }
 
     @Test
@@ -123,8 +123,8 @@ public class TestSourceMapFieldMembers extends 
SourceMapTestBase
     {
         IVariableNode node = getField("const foo;");
         asBlockWalker.visitVariable(node);
-        ///**\n * @export\n * @const\n * @type {*}\n 
*/\nRoyaleTest_A.prototype.foo
-        assertMapping(node, 0, 6, 5, 0, 5, 26);  // foo
+        ///**\n * @const\n * @type {*}\n */\nRoyaleTest_A.prototype.foo
+        assertMapping(node, 0, 6, 4, 0, 4, 26);  // foo
     }
 
     @Test
@@ -132,8 +132,8 @@ public class TestSourceMapFieldMembers extends 
SourceMapTestBase
     {
         IVariableNode node = getField("const foo:int;");
         asBlockWalker.visitVariable(node);
-        ///**\n * @export\n * @const\n * @type {number}\n 
*/\nRoyaleTest_A.prototype.foo = 0
-        assertMapping(node, 0, 6, 5, 0, 5, 26);  // foo
+        ///**\n * @const\n * @type {number}\n */\nRoyaleTest_A.prototype.foo = 0
+        assertMapping(node, 0, 6, 4, 0, 4, 26);  // foo
     }
 
     @Test
@@ -141,10 +141,10 @@ public class TestSourceMapFieldMembers extends 
SourceMapTestBase
     {
         IVariableNode node = getField("const foo = 420;");
         asBlockWalker.visitVariable(node);
-        ///**\n * @export\n * @const\n * @type {*}\n 
*/\nRoyaleTest_A.prototype.foo = 420
-        assertMapping(node, 0, 6, 5, 0, 5, 26);  // foo
-        assertMapping(node, 0, 9, 5, 26, 5, 29);  // =
-        assertMapping(node, 0, 12, 5, 29, 5, 32);  // 420
+        ///**\n * @const\n * @type {*}\n */\nRoyaleTest_A.prototype.foo = 420
+        assertMapping(node, 0, 6, 4, 0, 4, 26);  // foo
+        assertMapping(node, 0, 9, 4, 26, 4, 29);  // =
+        assertMapping(node, 0, 12, 4, 29, 4, 32);  // 420
     }
 
     @Test
@@ -152,10 +152,10 @@ public class TestSourceMapFieldMembers extends 
SourceMapTestBase
     {
         IVariableNode node = getField("const foo:int = 420;");
         asBlockWalker.visitVariable(node);
-        ///**\n * @export\n * @const\n * @type {number}\n 
*/\nRoyaleTest_A.prototype.foo = 420
-        assertMapping(node, 0, 6, 5, 0, 5, 26);  // foo
-        assertMapping(node, 0, 13, 5, 26, 5, 29);  // =
-        assertMapping(node, 0, 16, 5, 29, 5, 32);  // 420
+        ///**\n * @const\n * @type {number}\n */\nRoyaleTest_A.prototype.foo = 
420
+        assertMapping(node, 0, 6, 4, 0, 4, 26);  // foo
+        assertMapping(node, 0, 13, 4, 26, 4, 29);  // =
+        assertMapping(node, 0, 16, 4, 29, 4, 32);  // 420
     }
 
     @Test
@@ -163,8 +163,8 @@ public class TestSourceMapFieldMembers extends 
SourceMapTestBase
     {
         IVariableNode node = getField("static const foo;");
         asBlockWalker.visitVariable(node);
-        ///**\n * @export\n * @const\n * @type {*}\n */\nRoyaleTest_A.foo
-        assertMapping(node, 0, 13, 5, 0, 5, 16);  // foo
+        ///**\n * @const\n * @type {*}\n */\nRoyaleTest_A.foo
+        assertMapping(node, 0, 13, 4, 0, 4, 16);  // foo
     }
 
     @Test
@@ -172,8 +172,8 @@ public class TestSourceMapFieldMembers extends 
SourceMapTestBase
     {
         IVariableNode node = getField("static const foo:int;");
         asBlockWalker.visitVariable(node);
-        ///**\n * @export\n * @const\n * @type {number}\n */\nRoyaleTest_A.foo 
= 0
-        assertMapping(node, 0, 13, 5, 0, 5, 16);  // foo
+        ///**\n * @const\n * @type {number}\n */\nRoyaleTest_A.foo = 0
+        assertMapping(node, 0, 13, 4, 0, 4, 16);  // foo
     }
 
     @Test
@@ -181,10 +181,10 @@ public class TestSourceMapFieldMembers extends 
SourceMapTestBase
     {
         IVariableNode node = getField("static const foo = 420;");
         asBlockWalker.visitVariable(node);
-        ///**\n * @export\n * @const\n * @type {*}\n */\nRoyaleTest_A.foo = 420
-        assertMapping(node, 0, 13, 5, 0, 5, 16);  // foo
-        assertMapping(node, 0, 16, 5, 16, 5, 19);  // =
-        assertMapping(node, 0, 19, 5, 19, 5, 22);  // 420
+        ///**\n * @const\n * @type {*}\n */\nRoyaleTest_A.foo = 420
+        assertMapping(node, 0, 13, 4, 0, 4, 16);  // foo
+        assertMapping(node, 0, 16, 4, 16, 4, 19);  // =
+        assertMapping(node, 0, 19, 4, 19, 4, 22);  // 420
     }
 
     @Test
@@ -193,9 +193,9 @@ public class TestSourceMapFieldMembers extends 
SourceMapTestBase
         IVariableNode node = getField("static const foo:int = 420;");
         asBlockWalker.visitVariable(node);
         ///**\n * @export\n * @const\n * @type {number}\n */\nRoyaleTest_A.foo 
= 420
-        assertMapping(node, 0, 13, 5, 0, 5, 16);  // foo
-        assertMapping(node, 0, 20, 5, 16, 5, 19);  // =
-        assertMapping(node, 0, 23, 5, 19, 5, 22);  // 420
+        assertMapping(node, 0, 13, 4, 0, 4, 16);  // foo
+        assertMapping(node, 0, 20, 4, 16, 4, 19);  // =
+        assertMapping(node, 0, 23, 4, 19, 4, 22);  // 420
     }
 
     protected IBackend createBackend()

Reply via email to