merge develop, added insertArgumentBefore(), insertArgumentAfter(), and insertArgumentAt() in EmitterUtils to allow function call arguments to be expanded
Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/2e464eef Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/2e464eef Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/2e464eef Branch: refs/heads/develop Commit: 2e464eef22c9824b6b6abb80f861fa26cc27696f Parents: c381df3 bf746d0 Author: Josh Tynjala <[email protected]> Authored: Fri Apr 1 13:10:22 2016 -0700 Committer: Josh Tynjala <[email protected]> Committed: Fri Apr 1 13:10:22 2016 -0700 ---------------------------------------------------------------------- ApproveFalcon.xml | 9 +- .../codegen/externals/ExternalsTestUtils.java | 3 + .../codegen/externals/TestExternJQuery.java | 4 +- .../externals/TestExternalsJSCompile.java | 16 +- .../js/flexjs/TestFlexJSFieldMembers.java | 9 + .../js/flexjs/TestFlexJSGlobalClasses.java | 18 ++ .../codegen/js/flexjs/TestFlexJSProject.java | 73 ++++++- .../codegen/js/goog/TestGoogProject.java | 4 +- .../codegen/js/vf2js/TestVF2JSFile.java | 14 +- .../mxml/flexjs/TestFlexJSMXMLApplication.java | 204 ++++++++++++++++++- .../mxml/vf2js/TestVF2JSMXMLApplication.java | 8 +- .../compiler/internal/test/FlexJSTestBase.java | 6 +- .../flex/compiler/internal/test/TestBase.java | 15 +- .../compiler/internal/test/VF2JSTestBase.java | 8 +- .../flexjs/projects/bad_overrides/Test.as | 43 ++++ .../projects/bad_overrides/Test_result.js | 94 +++++++++ .../flexjs/projects/bad_overrides/classes/A.as | 41 ++++ .../projects/bad_overrides/classes/A_result.js | 92 +++++++++ .../flexjs/projects/bad_overrides/classes/B.as | 25 +++ .../projects/bad_overrides/classes/B_result.js | 69 +++++++ .../flexjs/projects/bad_overrides/classes/C.as | 25 +++ .../projects/bad_overrides/classes/C_result.js | 69 +++++++ .../projects/bad_overrides/interfaces/IA.as | 28 +++ .../bad_overrides/interfaces/IA_result.js | 69 +++++++ .../projects/bad_overrides/interfaces/IB.as | 22 ++ .../bad_overrides/interfaces/IB_result.js | 62 ++++++ .../projects/bad_overrides/interfaces/IC.as | 22 ++ .../bad_overrides/interfaces/IC_result.js | 62 ++++++ .../flexjs/projects/overrides/Test.as | 43 ++++ .../flexjs/projects/overrides/Test_result.js | 94 +++++++++ .../flexjs/projects/overrides/classes/A.as | 41 ++++ .../projects/overrides/classes/A_result.js | 92 +++++++++ .../flexjs/projects/overrides/classes/B.as | 25 +++ .../projects/overrides/classes/B_result.js | 69 +++++++ .../flexjs/projects/overrides/classes/C.as | 25 +++ .../projects/overrides/classes/C_result.js | 74 +++++++ .../flexjs/projects/overrides/interfaces/IA.as | 28 +++ .../projects/overrides/interfaces/IA_result.js | 69 +++++++ .../flexjs/projects/overrides/interfaces/IB.as | 22 ++ .../projects/overrides/interfaces/IB_result.js | 62 ++++++ .../flexjs/projects/overrides/interfaces/IC.as | 22 ++ .../projects/overrides/interfaces/IC_result.js | 65 ++++++ .../apache/flex/compiler/clients/COMPJSC.java | 4 +- .../apache/flex/compiler/clients/EXTERNC.java | 27 ++- .../flex/compiler/clients/FlexJSToolGroup.java | 1 + .../internal/codegen/js/amd/JSAMDEmitter.java | 18 +- .../codegen/js/flexjs/JSFlexJSEmitter.java | 48 +---- .../codegen/js/jx/FunctionCallEmitter.java | 22 ++ .../codegen/js/jx/MemberAccessEmitter.java | 2 +- .../internal/codegen/js/utils/EmitterUtils.java | 80 ++++++++ .../codegen/mxml/flexjs/MXMLFlexJSEmitter.java | 38 +++- .../internal/projects/FlexJSProject.java | 1 - compiler.tests/downloads.xml | 35 +++- .../org/apache/flex/utils/AntTestAdapter.java | 2 +- .../org/apache/flex/utils/MavenTestAdapter.java | 80 +++++++- .../compiler/internal/mxml/MXMLDataTests.java | 9 +- .../org/apache/flex/compiler/clients/ASC.java | 9 +- .../flex/compiler/config/Configuration.java | 18 ++ .../codegen/UnknownTreePatternInputOutput.java | 2 +- .../internal/config/TargetSettings.java | 6 + .../definitions/FunctionDefinition.java | 2 +- .../internal/projects/CompilerProject.java | 5 + .../compiler/internal/projects/FlexProject.java | 13 ++ .../compiler/projects/ICompilerProject.java | 7 + .../flex/compiler/targets/ITargetSettings.java | 6 + env-template.properties | 4 + externs/js/missing.js | 24 ++- 67 files changed, 2179 insertions(+), 129 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/2e464eef/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/amd/JSAMDEmitter.java ---------------------------------------------------------------------- diff --cc compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/amd/JSAMDEmitter.java index 27f1079,3f77efc..fd19e42 --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/amd/JSAMDEmitter.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/amd/JSAMDEmitter.java @@@ -41,12 -41,9 +41,11 @@@ import org.apache.flex.compiler.definit import org.apache.flex.compiler.internal.codegen.as.ASEmitterTokens; import org.apache.flex.compiler.internal.codegen.js.JSEmitter; import org.apache.flex.compiler.internal.codegen.js.JSEmitterTokens; ++import org.apache.flex.compiler.internal.codegen.js.utils.EmitterUtils; import org.apache.flex.compiler.internal.definitions.ClassTraitsDefinition; - import org.apache.flex.compiler.internal.tree.as.ContainerNode; 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.NodeBase; import org.apache.flex.compiler.problems.ICompilerProblem; import org.apache.flex.compiler.projects.ICompilerProject; import org.apache.flex.compiler.scopes.IASScope; @@@ -784,32 -783,28 +783,21 @@@ public class JSAMDEmitter extends JSEmi } @Override - public void walkArguments(IExpressionNode[] nodes) - { - } - - protected void walkArguments(IFunctionCallNode node) + public void emitArguments(IContainerNode node) { - FunctionCallNode fnode = (FunctionCallNode) node; - IExpressionNode[] nodes = node.getArgumentNodes(); - int len = nodes.length; + IContainerNode newNode = node; + FunctionCallNode fnode = (FunctionCallNode) node.getParent(); - int len = node.getChildCount(); if (TempTools.injectThisArgument(fnode, false)) { - ContainerNode newArgs = new ContainerNode(len + 1); - newArgs.setSourcePath(node.getSourcePath()); - newArgs.span(node); - newArgs.setParent((NodeBase) node.getParent()); - write("this"); - if (len > 0) - { - write(","); - write(" "); - } + IdentifierNode thisNode = new IdentifierNode("this"); - thisNode.setSourcePath(node.getSourcePath()); - newArgs.addItem(thisNode); - for (int i = 0; i < len; i++) - { - newArgs.addItem((NodeBase) node.getChild(i)); - } - newNode = newArgs; ++ newNode = EmitterUtils.insertArgumentsBefore(node, thisNode); } - len = newNode.getChildCount(); ++ int len = newNode.getChildCount(); + write(ASEmitterTokens.PAREN_OPEN); for (int i = 0; i < len; i++) { - IExpressionNode inode = nodes[i]; + IExpressionNode inode = (IExpressionNode) newNode.getChild(i); if (inode.getNodeID() == ASTNodeID.IdentifierID) { emitArgumentIdentifier((IIdentifierNode) inode); http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/2e464eef/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java ---------------------------------------------------------------------- diff --cc compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java index 0eaf7c9,92a722a..c45a01c --- 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 @@@ -53,6 -53,6 +53,7 @@@ import org.apache.flex.compiler.interna import org.apache.flex.compiler.internal.codegen.js.jx.SelfReferenceEmitter; import org.apache.flex.compiler.internal.codegen.js.jx.SuperCallEmitter; import org.apache.flex.compiler.internal.codegen.js.jx.VarDeclarationEmitter; ++import org.apache.flex.compiler.internal.codegen.js.utils.EmitterUtils; import org.apache.flex.compiler.internal.codegen.mxml.flexjs.MXMLFlexJSEmitter; import org.apache.flex.compiler.internal.definitions.AccessorDefinition; import org.apache.flex.compiler.internal.projects.FlexJSProject; @@@ -549,14 -531,12 +550,14 @@@ public class JSFlexJSEmitter extends JS } @Override - public void walkArguments(IExpressionNode[] nodes) + public void emitArguments(IContainerNode node) { - ContainerNode newArgs = null; - if (nodes.length == 2) ++ IContainerNode newNode = node; + int len = node.getChildCount(); + if (len == 2) { ICompilerProject project = getWalker().getProject();; - IFunctionCallNode fcNode = (IFunctionCallNode)(nodes[0].getParent().getParent()); + IFunctionCallNode fcNode = (IFunctionCallNode) node.getParent(); IExpressionNode nameNode = fcNode.getNameNode(); IDefinition def = nameNode.resolve(project); if (def != null && def.getBaseName().equals("insertAt")) @@@ -566,76 -546,45 +567,41 @@@ { if (nameNode instanceof MemberAccessExpressionNode) { - newArgs = new ContainerNode(len + 1); - newArgs.setSourcePath(node.getSourcePath()); - newArgs.span(node); - newArgs.setParent((NodeBase) node.getParent()); - newArgs.addItem((NodeBase) node.getChild(0)); - NumericLiteralNode extraNode = new NumericLiteralNode("0"); - extraNode.setSourcePath(node.getSourcePath()); - newArgs.addItem(extraNode); - newArgs.addItem((NodeBase) node.getChild(1)); - IExpressionNode[] newArgs = new IExpressionNode[3]; - newArgs[0] = nodes[0]; - newArgs[2] = nodes[1]; - newArgs[1] = new NumericLiteralNode("0"); - nodes = newArgs; ++ newNode = EmitterUtils.insertArgumentsAt(node, 1, new NumericLiteralNode("0")); } } } } - super.walkArguments(nodes); - if (nodes.length == 1) - { + if (len == 1) + { ICompilerProject project = getWalker().getProject();; - IFunctionCallNode fcNode = (IFunctionCallNode)(nodes[0].getParent().getParent()); - IExpressionNode nameNode = fcNode.getNameNode(); + IFunctionCallNode fcNode = (IFunctionCallNode) node.getParent(); + IExpressionNode nameNode = fcNode.getNameNode(); IDefinition def = nameNode.resolve(project); - if (def != null && def.getBaseName().equals("removeAt")) - { - if (def.getParent() != null && - def.getParent().getQualifiedName().equals("Array")) - { - if (nameNode instanceof MemberAccessExpressionNode) - { - write(", 1"); - } - } - } - else if (def != null && def.getBaseName().equals("parseInt")) - { - IDefinition parentDef = def.getParent(); - if (parentDef == null) - { - if (nameNode instanceof IdentifierNode) - { - write(", 10"); - } - } - } - } + if (def != null && def.getBaseName().equals("removeAt")) + { + if (def.getParent() != null && + def.getParent().getQualifiedName().equals("Array")) + { + if (nameNode instanceof MemberAccessExpressionNode) + { - newArgs = new ContainerNode(len + 1); - newArgs.setSourcePath(node.getSourcePath()); - newArgs.span(node); - newArgs.setParent((NodeBase) node.getParent()); - for (int i = 0; i < len; i++) - { - newArgs.addItem((NodeBase) node.getChild(i)); - } - NumericLiteralNode extraNode = new NumericLiteralNode("1"); - extraNode.setSourcePath(node.getSourcePath()); - newArgs.addItem(extraNode); ++ newNode = EmitterUtils.insertArgumentsAfter(node, new NumericLiteralNode("1")); + } + } + } + else if (def != null && def.getBaseName().equals("parseInt")) + { + IDefinition parentDef = def.getParent(); + if (parentDef == null) + { + if (nameNode instanceof IdentifierNode) + { - newArgs = new ContainerNode(len + 1); - newArgs.setSourcePath(node.getSourcePath()); - newArgs.span(node); - newArgs.setParent((NodeBase) node.getParent()); - for (int i = 0; i < len; i++) - { - newArgs.addItem((NodeBase) node.getChild(i)); - } - NumericLiteralNode extraNode = new NumericLiteralNode("10"); - extraNode.setSourcePath(node.getSourcePath()); - newArgs.addItem(extraNode); ++ newNode = EmitterUtils.insertArgumentsAfter(node, new NumericLiteralNode("10")); + } + } + } + } - if (newArgs != null) - { - super.emitArguments(newArgs); - } - else - { - super.emitArguments(node); - } ++ super.emitArguments(newNode); } @Override http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/2e464eef/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/FunctionCallEmitter.java ---------------------------------------------------------------------- diff --cc compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/FunctionCallEmitter.java index 0b8df4e,475541e..ed55481 --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/FunctionCallEmitter.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/FunctionCallEmitter.java @@@ -28,6 -28,6 +28,7 @@@ import org.apache.flex.compiler.interna import org.apache.flex.compiler.internal.codegen.js.JSSubEmitter; 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.utils.EmitterUtils; import org.apache.flex.compiler.internal.definitions.AppliedVectorDefinition; import org.apache.flex.compiler.internal.definitions.ClassDefinition; import org.apache.flex.compiler.internal.definitions.InterfaceDefinition; @@@ -37,6 -40,6 +41,7 @@@ import org.apache.flex.compiler.interna import org.apache.flex.compiler.projects.ICompilerProject; import org.apache.flex.compiler.tree.ASTNodeID; import org.apache.flex.compiler.tree.as.IASNode; ++import org.apache.flex.compiler.tree.as.IContainerNode; import org.apache.flex.compiler.tree.as.IExpressionNode; import org.apache.flex.compiler.tree.as.IFunctionCallNode; import org.apache.flex.compiler.utils.NativeUtils; @@@ -144,21 -141,30 +149,38 @@@ public class FunctionCallEmitter extend write(ASEmitterTokens.MEMBER_ACCESS); if (isInt) write(JSFlexJSEmitterTokens.UNDERSCORE); + getEmitter().endMapping(node.getNameNode()); } + else if (def != null && def.getBaseName().equals("sortOn")) + { + if (def.getParent() != null && + def.getParent().getQualifiedName().equals("Array")) + { + ICompilerProject project = this.getProject(); + if (project instanceof FlexJSProject) + ((FlexJSProject) project).needLanguage = true; + write(JSFlexJSEmitterTokens.LANGUAGE_QNAME); + write(ASEmitterTokens.MEMBER_ACCESS); + write("sortOn"); - write(ASEmitterTokens.PAREN_OPEN); - write(((IdentifierNode)cnode).getName()); // will this always be an indentifer node - writeToken(ASEmitterTokens.COMMA); - fjs.walkArguments(node.getArgumentNodes()); - write(ASEmitterTokens.PAREN_CLOSE); ++ IContainerNode newArgs = EmitterUtils.insertArgumentsBefore(node.getArgumentsNode(), cnode); ++ fjs.emitArguments(newArgs); + return; + } + } + else if (def instanceof AppliedVectorDefinition) { - fjs.walkArguments(node.getArgumentNodes()); + IExpressionNode[] argumentNodes = node.getArgumentNodes(); + int len = argumentNodes.length; + for (int i = 0; i < len; i++) + { + IExpressionNode argumentNode = argumentNodes[i]; + getWalker().walk(argumentNode); + if(i < len - 1) + { + write(", "); + } + } write(".slice()"); return; } http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/2e464eef/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/2e464eef/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/utils/EmitterUtils.java ---------------------------------------------------------------------- diff --cc compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/utils/EmitterUtils.java index 471e5b7,471e5b7..3e59a8d --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/utils/EmitterUtils.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/utils/EmitterUtils.java @@@ -44,11 -44,11 +44,15 @@@ import org.apache.flex.compiler.interna import org.apache.flex.compiler.internal.definitions.VariableDefinition; import org.apache.flex.compiler.internal.projects.CompilerProject; import org.apache.flex.compiler.internal.scopes.TypeScope; ++import org.apache.flex.compiler.internal.tree.as.ContainerNode; ++import org.apache.flex.compiler.internal.tree.as.IdentifierNode; ++import org.apache.flex.compiler.internal.tree.as.NodeBase; import org.apache.flex.compiler.internal.tree.as.ParameterNode; import org.apache.flex.compiler.projects.ICompilerProject; import org.apache.flex.compiler.tree.ASTNodeID; import org.apache.flex.compiler.tree.as.IASNode; import org.apache.flex.compiler.tree.as.IClassNode; ++import org.apache.flex.compiler.tree.as.IContainerNode; import org.apache.flex.compiler.tree.as.IDefinitionNode; import org.apache.flex.compiler.tree.as.IExpressionNode; import org.apache.flex.compiler.tree.as.IFunctionNode; @@@ -425,4 -425,4 +429,80 @@@ public class EmitterUtil return false; } ++ public static IContainerNode insertArgumentsBefore(IContainerNode argumentsNode, IASNode... nodes) ++ { ++ int originalLength = argumentsNode.getChildCount(); ++ int extraLength = nodes.length; ++ ContainerNode result = new ContainerNode(originalLength + extraLength); ++ result.setSourcePath(argumentsNode.getSourcePath()); ++ result.span(argumentsNode); ++ result.setParent((NodeBase) argumentsNode.getParent()); ++ for (int i = 0; i < extraLength; i++) ++ { ++ NodeBase node = (NodeBase) nodes[i]; ++ node.setSourcePath(argumentsNode.getSourcePath()); ++ result.addItem(node); ++ } ++ for (int i = 0; i < originalLength; i++) ++ { ++ result.addItem((NodeBase) argumentsNode.getChild(i)); ++ } ++ return result; ++ } ++ ++ public static IContainerNode insertArgumentsAfter(IContainerNode argumentsNode, IASNode... nodes) ++ { ++ int originalLength = argumentsNode.getChildCount(); ++ int extraLength = nodes.length; ++ ContainerNode result = new ContainerNode(originalLength + extraLength); ++ result.setSourcePath(argumentsNode.getSourcePath()); ++ result.span(argumentsNode); ++ result.setParent((NodeBase) argumentsNode.getParent()); ++ for (int i = 0; i < originalLength; i++) ++ { ++ result.addItem((NodeBase) argumentsNode.getChild(i)); ++ } ++ for (int i = 0; i < extraLength; i++) ++ { ++ NodeBase node = (NodeBase) nodes[i]; ++ node.setSourcePath(argumentsNode.getSourcePath()); ++ result.addItem(node); ++ } ++ return result; ++ } ++ ++ public static IContainerNode insertArgumentsAt(IContainerNode argumentsNode, int index, IASNode... nodes) ++ { ++ int originalLength = argumentsNode.getChildCount(); ++ int extraLength = nodes.length; ++ ContainerNode result = new ContainerNode(originalLength + extraLength); ++ result.setSourcePath(argumentsNode.getSourcePath()); ++ result.span(argumentsNode); ++ result.setParent((NodeBase) argumentsNode.getParent()); ++ for (int i = 0; i < originalLength; i++) ++ { ++ if(i < originalLength) ++ { ++ result.addItem((NodeBase) argumentsNode.getChild(i)); ++ } ++ else ++ { ++ int j = i; ++ if (i >= index + extraLength) ++ { ++ j -= extraLength; ++ result.addItem((NodeBase) argumentsNode.getChild(j)); ++ } ++ else ++ { ++ j -= originalLength; ++ NodeBase node = (NodeBase) nodes[j]; ++ node.setSourcePath(argumentsNode.getSourcePath()); ++ result.addItem(node); ++ } ++ } ++ } ++ return result; ++ } ++ }
