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()