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(

Reply via email to