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/04/06 17:02:32 UTC
[23/50] git commit: [flex-falcon] [refs/heads/master] - initial
support for QName and Namespace
initial support for QName and Namespace
Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/92d2b983
Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/92d2b983
Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/92d2b983
Branch: refs/heads/master
Commit: 92d2b983ad00b8d8c68490afe0d66bc66c6687cf
Parents: 8e27013
Author: Alex Harui <ah...@apache.org>
Authored: Thu Mar 10 19:27:09 2016 -0800
Committer: Alex Harui <ah...@apache.org>
Committed: Thu Mar 10 19:32:14 2016 -0800
----------------------------------------------------------------------
.../js/flexjs/TestFlexJSGlobalClasses.java | 34 +++++-------
.../internal/codegen/as/ASBlockWalker.java | 1 +
.../codegen/js/flexjs/JSFlexJSEmitter.java | 21 ++++++++
.../codegen/js/jx/MemberAccessEmitter.java | 55 ++++++++++++++++++++
.../codegen/js/jx/PackageHeaderEmitter.java | 5 +-
.../internal/projects/FlexJSProject.java | 12 ++++-
6 files changed, 105 insertions(+), 23 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/92d2b983/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
index a3a50c1..96a9a0a 100644
--- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
+++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
@@ -519,60 +519,52 @@ public class TestFlexJSGlobalClasses extends TestGoogGlobalClasses
assertOut("var foreachiter0_target = a;\nfor (var foreachiter0 in foreachiter0_target.elementNames()) \n{\nvar p = foreachiter0_target.child(foreachiter0);\n\n var /** @type {number} */ i = p.length();}\n");
}
- @Ignore
+ @Test
public void testNamespaceNoArg()
{
IVariableNode node = getVariable("var a:Namespace = new Namespace();");
asBlockWalker.visitVariable(node);
- assertOut("var /** @type {Array} */ a = new Array(['Hello', 'World'])");
+ assertOut("var /** @type {Namespace} */ a = new Namespace()");
}
- @Ignore
+ @Test
public void testNamespaceOneArg()
{
IVariableNode node = getVariable("var a:Namespace = new Namespace('foo');");
asBlockWalker.visitVariable(node);
- assertOut("var /** @type {Array} */ a = new Array(['Hello', 'World'])");
+ assertOut("var /** @type {Namespace} */ a = new Namespace('foo')");
}
- @Ignore
+ @Test
public void testNamespaceTwoArg()
{
IVariableNode node = getVariable("var a:Namespace = new Namespace('foo', 'bar');");
asBlockWalker.visitVariable(node);
- assertOut("var /** @type {Array} */ a = new Array(['Hello', 'World'])");
+ assertOut("var /** @type {Namespace} */ a = new Namespace('foo', 'bar')");
}
-
- @Ignore
- public void testNamespaceThreeArg()
- {
- IVariableNode node = getVariable("var a:Namespace = new Namespace('foo', 'bar', 'baz');");
- asBlockWalker.visitVariable(node);
- assertOut("var /** @type {Array} */ a = new Array(['Hello', 'World'])");
- }
-
- @Ignore
+
+ @Test
public void testQNameNoArg()
{
IVariableNode node = getVariable("var a:QName = new QName();");
asBlockWalker.visitVariable(node);
- assertOut("var /** @type {Array} */ a = new Array(['Hello', 'World'])");
+ assertOut("var /** @type {QName} */ a = new QName()");
}
- @Ignore
+ @Test
public void testQNameTwoArg()
{
IVariableNode node = getVariable("var a:QName = new QName(new Namespace('foo'), 'bar');");
asBlockWalker.visitVariable(node);
- assertOut("var /** @type {Array} */ a = new Array(['Hello', 'World'])");
+ assertOut("var /** @type {QName} */ a = new QName(new Namespace('foo'), 'bar')");
}
- @Ignore
+ @Test
public void testQNameOneArg()
{
IVariableNode node = getVariable("var a:QName = new QName(new QName(new Namespace('foo'), 'bar'));");
asBlockWalker.visitVariable(node);
- assertOut("var /** @type {Array} */ a = new Array(['Hello', 'World'])");
+ assertOut("var /** @type {QName} */ a = new QName(new QName(new Namespace('foo'), 'bar'))");
}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/92d2b983/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASBlockWalker.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASBlockWalker.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASBlockWalker.java
index d31ea74..aa29f4d 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASBlockWalker.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASBlockWalker.java
@@ -201,6 +201,7 @@ public class ASBlockWalker implements IASBlockVisitor, IASBlockWalker
isAllowedAfterPackage = pnode instanceof IInterfaceNode
|| pnode instanceof IClassNode
|| pnode instanceof IFunctionNode
+ || pnode instanceof INamespaceNode
|| pnode instanceof IVariableNode;
}
if(isPackage || isAllowedAfterPackage)
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/92d2b983/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
index de50ace..d4325a7 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
@@ -25,6 +25,7 @@ import java.util.List;
import org.apache.flex.compiler.codegen.js.flexjs.IJSFlexJSEmitter;
import org.apache.flex.compiler.codegen.js.goog.IJSGoogDocEmitter;
+import org.apache.flex.compiler.constants.IASLanguageConstants;
import org.apache.flex.compiler.definitions.IClassDefinition;
import org.apache.flex.compiler.definitions.IDefinition;
import org.apache.flex.compiler.definitions.IPackageDefinition;
@@ -83,6 +84,7 @@ import org.apache.flex.compiler.tree.as.IInterfaceNode;
import org.apache.flex.compiler.tree.as.ILiteralContainerNode;
import org.apache.flex.compiler.tree.as.ILiteralNode;
import org.apache.flex.compiler.tree.as.IMemberAccessExpressionNode;
+import org.apache.flex.compiler.tree.as.INamespaceNode;
import org.apache.flex.compiler.tree.as.IPackageNode;
import org.apache.flex.compiler.tree.as.IScopedNode;
import org.apache.flex.compiler.tree.as.ISetterNode;
@@ -317,6 +319,20 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
writeToken(ASEmitterTokens.VAR);
}
}
+
+ @Override
+ public void emitNamespace(INamespaceNode node)
+ {
+ write(formatQualifiedName(node.getName()));
+ write(ASEmitterTokens.SPACE);
+ writeToken(ASEmitterTokens.EQUAL);
+ writeToken(ASEmitterTokens.NEW);
+ write(IASLanguageConstants.Namespace);
+ write(ASEmitterTokens.PAREN_OPEN);
+ getWalker().walk(node.getNamespaceURINode());
+ write(ASEmitterTokens.PAREN_CLOSE);
+ write(ASEmitterTokens.SEMICOLON);
+ }
@Override
public void emitMemberName(IDefinitionNode node)
@@ -397,6 +413,11 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
String className = ((IFunctionNode)pnode).getQualifiedName();
getModel().getInternalClasses().put(className, mainClassName + "." + className);
}
+ else if (pnode instanceof INamespaceNode)
+ {
+ String className = ((INamespaceNode)pnode).getQualifiedName();
+ getModel().getInternalClasses().put(className, mainClassName + "." + className);
+ }
else if (pnode instanceof IVariableNode)
{
String className = ((IVariableNode)pnode).getQualifiedName();
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/92d2b983/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
index 2fcc160..305b2e9 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
@@ -21,6 +21,7 @@ package org.apache.flex.compiler.internal.codegen.js.jx;
import org.apache.flex.compiler.codegen.ISubEmitter;
import org.apache.flex.compiler.codegen.js.IJSEmitter;
+import org.apache.flex.compiler.constants.IASLanguageConstants;
import org.apache.flex.compiler.definitions.IDefinition;
import org.apache.flex.compiler.internal.codegen.as.ASEmitterTokens;
import org.apache.flex.compiler.internal.codegen.js.JSSubEmitter;
@@ -31,7 +32,9 @@ import org.apache.flex.compiler.internal.definitions.FunctionDefinition;
import org.apache.flex.compiler.internal.projects.FlexJSProject;
import org.apache.flex.compiler.internal.tree.as.FunctionCallNode;
import org.apache.flex.compiler.internal.tree.as.GetterNode;
+import org.apache.flex.compiler.internal.tree.as.IdentifierNode;
import org.apache.flex.compiler.internal.tree.as.MemberAccessExpressionNode;
+import org.apache.flex.compiler.internal.tree.as.NamespaceAccessExpressionNode;
import org.apache.flex.compiler.projects.ICompilerProject;
import org.apache.flex.compiler.tree.ASTNodeID;
import org.apache.flex.compiler.tree.as.IASNode;
@@ -61,6 +64,11 @@ public class MemberAccessEmitter extends JSSubEmitter implements
IASNode leftNode = node.getLeftOperandNode();
IASNode rightNode = node.getRightOperandNode();
+ String leftName = "";
+ if (leftNode instanceof IdentifierNode)
+ {
+ leftName = ((IdentifierNode)leftNode).getName();
+ }
JSFlexJSEmitter fjs = (JSFlexJSEmitter)getEmitter();
IDefinition def = node.resolve(getProject());
if (def == null)
@@ -136,6 +144,31 @@ public class MemberAccessEmitter extends JSSubEmitter implements
return;
}
}
+ else if (rightNode instanceof NamespaceAccessExpressionNode)
+ {
+ // if you define a local variable with the same URI as a
+ // namespace that defines a namespaced property
+ // it doesn't resolve above so we handle it here
+ NamespaceAccessExpressionNode naen = (NamespaceAccessExpressionNode)rightNode;
+ IDefinition d = naen.getLeftOperandNode().resolve(getProject());
+ IdentifierNode r = (IdentifierNode)(naen.getRightOperandNode());
+ // output bracket access with QName
+ writeLeftSide(node, leftNode, rightNode);
+ write(ASEmitterTokens.SQUARE_OPEN);
+ write(ASEmitterTokens.NEW);
+ write(ASEmitterTokens.SPACE);
+ write(IASLanguageConstants.QName);
+ write(ASEmitterTokens.PAREN_OPEN);
+ write(d.getBaseName());
+ write(ASEmitterTokens.COMMA);
+ write(ASEmitterTokens.SPACE);
+ write(ASEmitterTokens.SINGLE_QUOTE);
+ write(r.getName());
+ write(ASEmitterTokens.SINGLE_QUOTE);
+ write(ASEmitterTokens.PAREN_CLOSE);
+ write(ASEmitterTokens.SQUARE_CLOSE);
+ return;
+ }
}
else if (fjs.isDateProperty(node))
{
@@ -167,6 +200,28 @@ public class MemberAccessEmitter extends JSSubEmitter implements
return;
}
}
+ else if (rightNode instanceof NamespaceAccessExpressionNode)
+ {
+ NamespaceAccessExpressionNode naen = (NamespaceAccessExpressionNode)rightNode;
+ IDefinition d = naen.getLeftOperandNode().resolve(getProject());
+ IdentifierNode r = (IdentifierNode)(naen.getRightOperandNode());
+ // output bracket access with QName
+ writeLeftSide(node, leftNode, rightNode);
+ write(ASEmitterTokens.SQUARE_OPEN);
+ write(ASEmitterTokens.NEW);
+ write(ASEmitterTokens.SPACE);
+ write(IASLanguageConstants.QName);
+ write(ASEmitterTokens.PAREN_OPEN);
+ write(fjs.formatQualifiedName(d.getBaseName()));
+ write(ASEmitterTokens.COMMA);
+ write(ASEmitterTokens.SPACE);
+ write(ASEmitterTokens.SINGLE_QUOTE);
+ write(r.getName());
+ write(ASEmitterTokens.SINGLE_QUOTE);
+ write(ASEmitterTokens.PAREN_CLOSE);
+ write(ASEmitterTokens.SQUARE_CLOSE);
+ return;
+ }
boolean isStatic = false;
if (def != null && def.isStatic())
isStatic = true;
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/92d2b983/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/PackageHeaderEmitter.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/PackageHeaderEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/PackageHeaderEmitter.java
index d026e9c..64b560a 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/PackageHeaderEmitter.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/PackageHeaderEmitter.java
@@ -205,7 +205,10 @@ public class PackageHeaderEmitter extends JSSubEmitter implements
continue;
if (NativeUtils.isNative(imp))
- continue;
+ {
+ if (!(imp.equals("QName") || imp.equals("Namespace")))
+ continue;
+ }
if (writtenRequires.indexOf(imp) == -1)
{
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/92d2b983/compiler.jx/src/org/apache/flex/compiler/internal/projects/FlexJSProject.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/projects/FlexJSProject.java b/compiler.jx/src/org/apache/flex/compiler/internal/projects/FlexJSProject.java
index ff668c6..bcae9ef 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/projects/FlexJSProject.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/projects/FlexJSProject.java
@@ -100,7 +100,7 @@ public class FlexJSProject extends FlexProject
reqs.put(qname, dt);
}
}
- else if (!isExternalLinkage(to))
+ else if (!isExternalLinkage(to) || qname.equals("Namespace"))
reqs.put(qname, dt);
}
}
@@ -165,6 +165,16 @@ public class FlexJSProject extends FlexProject
return false;
}
+ List<String> qnames;
+ try {
+ qnames = cu.getQualifiedNames();
+ String qname = qnames.get(0);
+ if (qname.equals("QName"))
+ return false;
+ } catch (InterruptedException e1) {
+ // TODO Auto-generated catch block
+ e1.printStackTrace();
+ }
try
{
return linkageChecker.isExternal(cu);