custom namespaces seems to be working
Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/896091c8 Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/896091c8 Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/896091c8 Branch: refs/heads/develop Commit: 896091c8e8e6b4119ef7656cd96fcc3d52e7ef55 Parents: 0b52f61 Author: Alex Harui <aha...@apache.org> Authored: Wed Sep 21 13:41:05 2016 -0700 Committer: Alex Harui <aha...@apache.org> Committed: Wed Sep 21 15:22:30 2016 -0700 ---------------------------------------------------------------------- .../flex/compiler/codegen/js/IJSEmitter.java | 3 +- .../compiler/internal/codegen/js/JSEmitter.java | 3 +- .../codegen/js/flexjs/JSFlexJSEmitter.java | 52 ++++++++++++++++++-- .../internal/codegen/js/goog/JSGoogEmitter.java | 17 ++++++- .../internal/codegen/js/jx/AccessorEmitter.java | 1 + .../codegen/js/jx/IdentifierEmitter.java | 26 +++++----- .../codegen/js/jx/MemberAccessEmitter.java | 7 ++- .../codegen/js/jx/PackageHeaderEmitter.java | 10 ++++ .../codegen/js/jx/SuperCallEmitter.java | 15 ++++++ .../internal/codegen/js/utils/EmitterUtils.java | 24 +++++++++ .../js/flexjs/TestFlexJSExpressions.java | 29 +++++++++++ 11 files changed, 167 insertions(+), 20 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/896091c8/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IJSEmitter.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IJSEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IJSEmitter.java index 287b8c8..eb0d748 100644 --- a/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IJSEmitter.java +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IJSEmitter.java @@ -25,6 +25,7 @@ import java.util.List; import com.google.debugging.sourcemap.FilePosition; import org.apache.flex.compiler.codegen.as.IASEmitter; import org.apache.flex.compiler.common.ISourceLocation; +import org.apache.flex.compiler.definitions.IDefinition; import org.apache.flex.compiler.internal.codegen.js.JSSessionModel; import org.apache.flex.compiler.tree.as.IASNode; import org.apache.flex.compiler.tree.as.ITypeNode; @@ -72,7 +73,7 @@ public interface IJSEmitter extends IASEmitter void emitSourceMapDirective(ITypeNode node); void emitClosureStart(); - void emitClosureEnd(IASNode node); + void emitClosureEnd(IASNode node, IDefinition nodeDef); class SourceMapMapping { http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/896091c8/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSEmitter.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSEmitter.java index 41ea685..e5d3c40 100644 --- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSEmitter.java +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSEmitter.java @@ -28,6 +28,7 @@ import org.apache.flex.compiler.codegen.ISubEmitter; import org.apache.flex.compiler.codegen.js.IJSEmitter; import org.apache.flex.compiler.common.ASModifier; import org.apache.flex.compiler.common.ISourceLocation; +import org.apache.flex.compiler.definitions.IDefinition; import org.apache.flex.compiler.definitions.ITypeDefinition; import org.apache.flex.compiler.internal.codegen.as.ASEmitter; import org.apache.flex.compiler.internal.codegen.as.ASEmitterTokens; @@ -210,7 +211,7 @@ public class JSEmitter extends ASEmitter implements IJSEmitter } - public void emitClosureEnd(IASNode node) + public void emitClosureEnd(IASNode node, IDefinition nodeDef) { } http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/896091c8/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java index d9c7bb9..4dd35eb 100644 --- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java @@ -23,11 +23,13 @@ import java.io.FilterWriter; import java.util.ArrayList; import java.util.List; +import org.apache.flex.abc.semantics.Namespace; import org.apache.flex.compiler.codegen.IASGlobalFunctionConstants; import org.apache.flex.compiler.codegen.js.flexjs.IJSFlexJSEmitter; import org.apache.flex.compiler.codegen.js.goog.IJSGoogDocEmitter; import org.apache.flex.compiler.constants.IASKeywordConstants; import org.apache.flex.compiler.constants.IASLanguageConstants; +import org.apache.flex.compiler.constants.INamespaceConstants; import org.apache.flex.compiler.definitions.IClassDefinition; import org.apache.flex.compiler.definitions.IDefinition; import org.apache.flex.compiler.definitions.INamespaceDefinition; @@ -141,6 +143,7 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter private DefinePropertyFunctionEmitter definePropertyFunctionEmitter; public ArrayList<String> usedNames = new ArrayList<String>(); + private boolean needNamespace; @Override public String postProcess(String output) @@ -151,6 +154,7 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter ArrayList<String> finalLines = new ArrayList<String>(); boolean foundLanguage = false; boolean foundXML = false; + boolean foundNamespace = false; boolean sawRequires = false; boolean stillSearching = true; int addIndex = -1; @@ -183,6 +187,10 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter { foundXML = true; } + else if (s.equals(IASLanguageConstants.Namespace)) + { + foundNamespace = true; + } sawRequires = true; if (!usedNames.contains(s)) { @@ -250,6 +258,29 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter addLineToMappings(i); } } + if (needNamespace && !foundNamespace) + { + StringBuilder appendString = new StringBuilder(); + appendString.append(JSGoogEmitterTokens.GOOG_REQUIRE.getToken()); + appendString.append(ASEmitterTokens.PAREN_OPEN.getToken()); + appendString.append(ASEmitterTokens.SINGLE_QUOTE.getToken()); + appendString.append(IASLanguageConstants.Namespace); + appendString.append(ASEmitterTokens.SINGLE_QUOTE.getToken()); + appendString.append(ASEmitterTokens.PAREN_CLOSE.getToken()); + appendString.append(ASEmitterTokens.SEMICOLON.getToken()); + if(addIndex != -1) + { + // if we didn't find other requires, this index + // points to the line after goog.provide + finalLines.add(addIndex, appendString.toString()); + addLineToMappings(addIndex); + } + else + { + finalLines.add(appendString.toString()); + addLineToMappings(i); + } + } } } } @@ -408,7 +439,8 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter @Override public void emitNamespace(INamespaceNode node) { - write(formatQualifiedName(node.getName())); + needNamespace = true; + write(formatQualifiedName(node.getQualifiedName())); write(ASEmitterTokens.SPACE); writeToken(ASEmitterTokens.EQUAL); writeToken(ASEmitterTokens.NEW); @@ -428,6 +460,7 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter if (!(nsName == IASKeywordConstants.PRIVATE || nsName == IASKeywordConstants.PROTECTED || nsName == IASKeywordConstants.INTERNAL || + nsName == INamespaceConstants.AS3URI || nsName == IASKeywordConstants.PUBLIC)) { return true; @@ -438,7 +471,11 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter public boolean isCustomNamespace(FunctionDefinition def) { - return !def.getNamespaceReference().isLanguageNamespace(); + INamespaceDefinition nsDef = def.getNamespaceReference().resolveNamespaceReference(getWalker().getProject()); + String uri = nsDef.getURI(); + if (!def.getNamespaceReference().isLanguageNamespace() && !uri.equals(INamespaceConstants.AS3URI)) + return true; + return false; } @Override @@ -452,6 +489,7 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter INamespaceDecorationNode ns = ((FunctionNode)node).getActualNamespaceNode(); ICompilerProject project = getWalker().getProject(); INamespaceDefinition nsDef = (INamespaceDefinition)ns.resolve(project); + formatQualifiedName(nsDef.getQualifiedName()); // register with used names String s = nsDef.getURI(); write("[\"" + s + "::" + node.getName() + "\"]"); return; @@ -805,13 +843,21 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter } @Override - public void emitClosureEnd(IASNode node) + public void emitClosureEnd(IASNode node, IDefinition nodeDef) { write(ASEmitterTokens.COMMA); write(ASEmitterTokens.SPACE); write(ASEmitterTokens.SINGLE_QUOTE); if (node.getNodeID() == ASTNodeID.IdentifierID) + { + if (nodeDef instanceof FunctionDefinition && + isCustomNamespace((FunctionDefinition)nodeDef)) + { + String ns = ((FunctionDefinition)nodeDef).getNamespaceReference().resolveAETNamespace(getWalker().getProject()).getName(); + write(ns + "::"); + } write(((IIdentifierNode)node).getName()); + } else if (node.getNodeID() == ASTNodeID.MemberAccessExpressionID) writeChainName(node); else http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/896091c8/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/goog/JSGoogEmitter.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/goog/JSGoogEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/goog/JSGoogEmitter.java index e08fb84..a4cbefc 100644 --- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/goog/JSGoogEmitter.java +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/goog/JSGoogEmitter.java @@ -43,6 +43,7 @@ import org.apache.flex.compiler.internal.codegen.js.JSSessionModel; import org.apache.flex.compiler.internal.codegen.js.utils.EmitterUtils; import org.apache.flex.compiler.internal.definitions.AccessorDefinition; import org.apache.flex.compiler.internal.definitions.FunctionDefinition; +import org.apache.flex.compiler.internal.definitions.NamespaceDefinition.INamepaceDeclarationDirective; import org.apache.flex.compiler.internal.scopes.PackageScope; import org.apache.flex.compiler.internal.tree.as.ChainedVariableNode; import org.apache.flex.compiler.internal.tree.as.FunctionCallNode; @@ -67,6 +68,7 @@ import org.apache.flex.compiler.tree.as.IGetterNode; import org.apache.flex.compiler.tree.as.IIdentifierNode; import org.apache.flex.compiler.tree.as.IInterfaceNode; import org.apache.flex.compiler.tree.as.INamespaceAccessExpressionNode; +import org.apache.flex.compiler.tree.as.INamespaceNode; import org.apache.flex.compiler.tree.as.IParameterNode; import org.apache.flex.compiler.tree.as.ISetterNode; import org.apache.flex.compiler.tree.as.ITypeNode; @@ -202,6 +204,17 @@ public class JSGoogEmitter extends JSEmitter implements IJSGoogEmitter getWalker().walk(vnode); } } + + INamepaceDeclarationDirective ns = EmitterUtils.findNamespace(containedScope + .getAllLocalDefinitions()); + if(ns != null) + { + INamespaceNode nsNode = EmitterUtils.findNamespaceNode(definition.getNode()); + if (nsNode != null) + { + getWalker().walk(nsNode); + } + } } // XXX DEAD @@ -904,7 +917,7 @@ public class JSGoogEmitter extends JSEmitter implements IJSGoogEmitter getWalker().walk(node); writeToken(ASEmitterTokens.COMMA); getWalker().walk(((MemberAccessExpressionNode)node).getLeftOperandNode()); - emitClosureEnd(((MemberAccessExpressionNode)node).getLeftOperandNode()); + emitClosureEnd(((MemberAccessExpressionNode)node).getLeftOperandNode(), definition); } else getWalker().walk(node); @@ -1113,7 +1126,7 @@ public class JSGoogEmitter extends JSEmitter implements IJSGoogEmitter write(ASEmitterTokens.PAREN_OPEN); } - protected void emitClosureEnd(FunctionNode node) + protected void emitClosureEnd(FunctionNode node, IDefinition nodeDef) { write(ASEmitterTokens.PAREN_CLOSE); } http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/896091c8/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/AccessorEmitter.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/AccessorEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/AccessorEmitter.java index 3f4090b..69959db 100644 --- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/AccessorEmitter.java +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/AccessorEmitter.java @@ -126,6 +126,7 @@ public class AccessorEmitter extends JSSubEmitter implements INamespaceDecorationNode ns = fnNode.getActualNamespaceNode(); ICompilerProject project = getWalker().getProject(); INamespaceDefinition nsDef = (INamespaceDefinition)ns.resolve(project); + fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names String s = nsDef.getURI(); write("\"" + s + "::" + propName + "\""); } http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/896091c8/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/IdentifierEmitter.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/IdentifierEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/IdentifierEmitter.java index 04a673e..2a3f941 100644 --- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/IdentifierEmitter.java +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/IdentifierEmitter.java @@ -19,11 +19,13 @@ package org.apache.flex.compiler.internal.codegen.js.jx; +import org.apache.flex.abc.semantics.Namespace; import org.apache.flex.compiler.codegen.ISubEmitter; import org.apache.flex.compiler.codegen.js.IJSEmitter; import org.apache.flex.compiler.definitions.IDefinition; import org.apache.flex.compiler.definitions.IFunctionDefinition; import org.apache.flex.compiler.definitions.IFunctionDefinition.FunctionClassification; +import org.apache.flex.compiler.definitions.INamespaceDefinition; import org.apache.flex.compiler.definitions.IVariableDefinition; import org.apache.flex.compiler.definitions.IVariableDefinition.VariableClassification; import org.apache.flex.compiler.internal.codegen.as.ASEmitterTokens; @@ -223,11 +225,20 @@ public class IdentifierEmitter extends JSSubEmitter implements if (generateClosure) { - write(node.getName()); + if (isCustomNamespace) + { + Namespace ns = (Namespace)((FunctionDefinition)nodeDef).getNamespaceReference().resolveAETNamespace(getProject()); + INamespaceDefinition nsDef = ((FunctionDefinition)nodeDef).getNamespaceReference().resolveNamespaceReference(getProject()); + fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names + String nsName = ns.getName(); + write("[\"" + nsName + "::" + node.getName() + "\"]"); + } + else + write(node.getName()); writeToken(ASEmitterTokens.COMMA); write(ASEmitterTokens.THIS); - getEmitter().emitClosureEnd(node); + getEmitter().emitClosureEnd(node, nodeDef); emitName = false; } } @@ -273,16 +284,9 @@ public class IdentifierEmitter extends JSSubEmitter implements needsFormattedName = parentMemberAccessNode.getLeftOperandNode() == node; } startMapping(node); - if (parentNodeId == ASTNodeID.MemberAccessExpressionID) + if (parentNodeId == ASTNodeID.MemberAccessExpressionID && needsFormattedName) { - if (needsFormattedName) - { - write(getEmitter().formatQualifiedName(qname)); - } - else - { - write(node.getName()); - } + write(getEmitter().formatQualifiedName(qname)); } else if (isPackageOrFileMember) write(getEmitter().formatQualifiedName(qname)); http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/896091c8/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java index f831b74..8778cfb 100644 --- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java @@ -217,6 +217,9 @@ public class MemberAccessEmitter extends JSSubEmitter implements write(ASEmitterTokens.SQUARE_CLOSE); return; } + boolean isCustomNamespace = false; + if (def instanceof FunctionDefinition && node.getOperator() == OperatorType.MEMBER_ACCESS) + isCustomNamespace = fjs.isCustomNamespace((FunctionDefinition)def); boolean isStatic = false; if (def != null && def.isStatic()) isStatic = true; @@ -244,7 +247,7 @@ public class MemberAccessEmitter extends JSSubEmitter implements getEmitter().emitClosureStart(); continueWalk = writeLeftSide(node, leftNode, rightNode); - if (continueWalk) + if (continueWalk && !isCustomNamespace) { startMapping(node, node.getLeftOperandNode()); write(node.getOperator().getOperatorText()); @@ -262,7 +265,7 @@ public class MemberAccessEmitter extends JSSubEmitter implements write(ASEmitterTokens.COMMA); write(ASEmitterTokens.SPACE); writeLeftSide(node, leftNode, rightNode); - getEmitter().emitClosureEnd(node); + getEmitter().emitClosureEnd(node, def); } if (ASNodeUtils.hasParenClose(node)) http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/896091c8/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/PackageHeaderEmitter.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/PackageHeaderEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/PackageHeaderEmitter.java index 6d3fb3b..585ace8 100644 --- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/PackageHeaderEmitter.java +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/PackageHeaderEmitter.java @@ -39,6 +39,7 @@ import org.apache.flex.compiler.internal.codegen.js.goog.JSGoogEmitterTokens; import org.apache.flex.compiler.internal.codegen.js.node.NodeEmitterTokens; import org.apache.flex.compiler.internal.codegen.js.utils.EmitterUtils; import org.apache.flex.compiler.internal.definitions.ClassDefinition; +import org.apache.flex.compiler.internal.definitions.NamespaceDefinition.INamepaceDeclarationDirective; import org.apache.flex.compiler.internal.projects.FlexJSProject; import org.apache.flex.compiler.internal.scopes.ASProjectScope; import org.apache.flex.compiler.internal.scopes.PackageScope; @@ -90,6 +91,15 @@ public class PackageHeaderEmitter extends JSSubEmitter implements } if (qname == null) { + INamepaceDeclarationDirective ns = EmitterUtils.findNamespace(containedScope + .getAllLocalDefinitions()); + if(ns != null) + { + qname = ns.getQualifiedName(); + } + } + if (qname == null) + { return; } http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/896091c8/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/SuperCallEmitter.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/SuperCallEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/SuperCallEmitter.java index 5546ee0..d08a13a 100644 --- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/SuperCallEmitter.java +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/SuperCallEmitter.java @@ -19,11 +19,13 @@ package org.apache.flex.compiler.internal.codegen.js.jx; +import org.apache.flex.abc.semantics.Namespace; import org.apache.flex.compiler.clients.MXMLJSC; import org.apache.flex.compiler.clients.MXMLJSC.JSOutputType; import org.apache.flex.compiler.codegen.js.IJSEmitter; import org.apache.flex.compiler.definitions.IClassDefinition; import org.apache.flex.compiler.definitions.IDefinition; +import org.apache.flex.compiler.definitions.INamespaceDefinition; import org.apache.flex.compiler.internal.codegen.as.ASEmitterTokens; import org.apache.flex.compiler.internal.codegen.js.JSSessionModel; import org.apache.flex.compiler.internal.codegen.js.JSSubEmitter; @@ -31,9 +33,11 @@ import org.apache.flex.compiler.internal.codegen.js.flexjs.JSFlexJSEmitter; import org.apache.flex.compiler.internal.codegen.js.flexjs.JSFlexJSEmitterTokens; import org.apache.flex.compiler.internal.codegen.js.goog.JSGoogEmitterTokens; import org.apache.flex.compiler.internal.codegen.js.utils.EmitterUtils; +import org.apache.flex.compiler.internal.definitions.FunctionDefinition; import org.apache.flex.compiler.internal.projects.FlexJSProject; import org.apache.flex.compiler.internal.tree.as.BinaryOperatorAssignmentNode; import org.apache.flex.compiler.internal.tree.as.FunctionCallNode; +import org.apache.flex.compiler.internal.tree.as.FunctionNode; import org.apache.flex.compiler.internal.tree.as.IdentifierNode; import org.apache.flex.compiler.internal.tree.as.MemberAccessExpressionNode; import org.apache.flex.compiler.projects.ICompilerProject; @@ -43,6 +47,7 @@ import org.apache.flex.compiler.tree.as.IClassNode; import org.apache.flex.compiler.tree.as.IExpressionNode; import org.apache.flex.compiler.tree.as.IFunctionCallNode; import org.apache.flex.compiler.tree.as.IFunctionNode; +import org.apache.flex.compiler.tree.as.INamespaceDecorationNode; public class SuperCallEmitter extends JSSubEmitter { @@ -207,6 +212,7 @@ public class SuperCallEmitter extends JSSubEmitter writeToken(ASEmitterTokens.COMMA); write(ASEmitterTokens.SINGLE_QUOTE); IExpressionNode namenode = fcnode.getNameNode(); + IDefinition def = namenode.resolve(getWalker().getProject()); String superName = fnode.getName(); if (namenode instanceof MemberAccessExpressionNode) { @@ -216,6 +222,15 @@ public class SuperCallEmitter extends JSSubEmitter superName = ((IdentifierNode)namenode).getName(); } } + if (def instanceof FunctionDefinition && fjs.isCustomNamespace((FunctionDefinition)def)) + { + Namespace ns = (Namespace)((FunctionDefinition)def).getNamespaceReference().resolveAETNamespace(getProject()); + INamespaceDefinition nsDef = ((FunctionDefinition)def).getNamespaceReference().resolveNamespaceReference(getProject()); + if (nsDef.getContainingScope() != null) // was null for flash_proxy in unit test + fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names + String s = nsDef.getURI(); + superName = s + "::" + superName; + } write(superName); write(ASEmitterTokens.SINGLE_QUOTE); } http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/896091c8/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/utils/EmitterUtils.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/utils/EmitterUtils.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/utils/EmitterUtils.java index 1180476..9ca2829 100644 --- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/utils/EmitterUtils.java +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/utils/EmitterUtils.java @@ -40,6 +40,7 @@ import org.apache.flex.compiler.internal.codegen.js.JSSessionModel; import org.apache.flex.compiler.internal.definitions.AccessorDefinition; import org.apache.flex.compiler.internal.definitions.ClassDefinition; import org.apache.flex.compiler.internal.definitions.FunctionDefinition; +import org.apache.flex.compiler.internal.definitions.NamespaceDefinition.INamepaceDeclarationDirective; import org.apache.flex.compiler.internal.definitions.ParameterDefinition; import org.apache.flex.compiler.internal.definitions.VariableDefinition; import org.apache.flex.compiler.internal.projects.CompilerProject; @@ -56,6 +57,7 @@ import org.apache.flex.compiler.tree.as.IDefinitionNode; import org.apache.flex.compiler.tree.as.IExpressionNode; import org.apache.flex.compiler.tree.as.IFunctionNode; import org.apache.flex.compiler.tree.as.IIdentifierNode; +import org.apache.flex.compiler.tree.as.INamespaceNode; import org.apache.flex.compiler.tree.as.IPackageNode; import org.apache.flex.compiler.tree.as.IParameterNode; import org.apache.flex.compiler.tree.as.IScopedNode; @@ -90,6 +92,28 @@ public class EmitterUtils return null; } + public static INamepaceDeclarationDirective findNamespace(Collection<IDefinition> definitions) + { + for (IDefinition definition : definitions) + { + if (definition instanceof INamepaceDeclarationDirective) + return (INamepaceDeclarationDirective) definition; + } + return null; + } + + public static INamespaceNode findNamespaceNode(IPackageNode node) + { + IScopedNode scope = node.getScopedNode(); + for (int i = 0; i < scope.getChildCount(); i++) + { + IASNode child = scope.getChild(i); + if (child instanceof INamespaceNode) + return (INamespaceNode) child; + } + return null; + } + public static IFunctionDefinition findFunction(Collection<IDefinition> definitions) { for (IDefinition definition : definitions) http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/896091c8/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSExpressions.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSExpressions.java b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSExpressions.java index aef3e26..87ab644 100644 --- a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSExpressions.java +++ b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSExpressions.java @@ -92,6 +92,15 @@ public class TestFlexJSExpressions extends TestGoogExpressions asBlockWalker.visitFunction(node); assertOut("FalconTest_A.prototype.foo = function() {\n if (a)\n FalconTest_A.base(this, 'foo', a, b, c);\n}"); } + + @Test + public void testVisitLanguageIdentifierNode_SuperMethodCustomNamespace() + { + IFunctionNode node = (IFunctionNode)getNode("import flash.utils.Proxy;import flash.utils.flash_proxy;use namespace flash_proxy;public class FalconTest_A extends Proxy { flash_proxy function foo(){if (a) super.setProperty(a, b);}}", + IFunctionNode.class, WRAP_LEVEL_PACKAGE); + asBlockWalker.visitFunction(node); + assertOut("/**\n * @export\n */\nFalconTest_A.prototype[\"http://www.adobe.com/2006/actionscript/flash/proxy::foo\"] = function() {\n if (a)\n FalconTest_A.base(this, 'http://www.adobe.com/2006/actionscript/flash/proxy::setProperty', a, b);\n}"); + } //---------------------------------- // Primary expression keywords @@ -714,6 +723,26 @@ public class TestFlexJSExpressions extends TestGoogExpressions } @Test + public void testCustomNamespaceMethodAsVariable() + { + IFunctionNode node = (IFunctionNode) getNode( + "import flash.utils.flash_proxy; use namespace flash_proxy;public class B {flash_proxy function b() { function c(f:Function):void {}; var f:Function = b; c(f); }}", + IFunctionNode.class, WRAP_LEVEL_PACKAGE); + asBlockWalker.visitFunction(node); + assertOut("/**\n * @export\n */\nB.prototype[\"http://www.adobe.com/2006/actionscript/flash/proxy::b\"] = function() {\n var self = this;\n function c(f) {\n };\n var /** @type {Function} */ f = org.apache.flex.utils.Language.closure(this[\"http://www.adobe.com/2006/actionscript/flash/proxy::b\"], this, 'http://www.adobe.com/2006/actionscript/flash/proxy::b');\n c(f);\n}"); + } + + @Test + public void testCustomNamespaceMethodAsVariableViaMemberAccess() + { + IFunctionNode node = (IFunctionNode) getNode( + "import flash.utils.flash_proxy; use namespace flash_proxy;public class B {flash_proxy function b():int { return this.b(); }}", + IFunctionNode.class, WRAP_LEVEL_PACKAGE); + asBlockWalker.visitFunction(node); + assertOut("/**\n * @export\n * @return {number}\n */\nB.prototype[\"http://www.adobe.com/2006/actionscript/flash/proxy::b\"] = function() {\n return this[\"http://www.adobe.com/2006/actionscript/flash/proxy::b\"]();\n}"); + } + + @Test public void testStaticMethodAsVariable() { IFunctionNode node = (IFunctionNode) getNode(