You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ah...@apache.org on 2016/09/21 22:22:40 UTC
[4/5] git commit: [flex-falcon] [refs/heads/develop] - custom
namespaces seems to be working
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 <ah...@apache.org>
Authored: Wed Sep 21 13:41:05 2016 -0700
Committer: Alex Harui <ah...@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(