Updated Branches: refs/heads/develop 6dc7db0cc -> e3a75ce56
FalconJx now produces functional (debug) FlexJS JS output The FalconJx compiler now emits a fully functional debug version of the FlexJSTest_again application. Signed-off-by: Erik de Bruin <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/e3a75ce5 Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/e3a75ce5 Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/e3a75ce5 Branch: refs/heads/develop Commit: e3a75ce562b3f6932100f80656c7909f2e4cb9f0 Parents: 6dc7db0 Author: Erik de Bruin <[email protected]> Authored: Thu Mar 28 16:58:52 2013 +0100 Committer: Erik de Bruin <[email protected]> Committed: Thu Mar 28 16:58:52 2013 +0100 ---------------------------------------------------------------------- .../codegen/js/flexjs/TestFlexJSClass.java | 9 ++ .../codegen/js/flexjs/TestFlexJSExpressions.java | 16 +++ .../js/flexjs/TestFlexJSGlobalFunctions.java | 11 ++ .../codegen/js/flexjs/JSFlexJSEmitter.java | 88 ++++++++++++--- .../codegen/mxml/flexjs/MXMLFlexJSEmitter.java | 9 ++ .../codegen/mxml/flexjs/MXMLFlexJSPublisher.java | 10 ++- 6 files changed, 127 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/e3a75ce5/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSClass.java ---------------------------------------------------------------------- diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSClass.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSClass.java index 7aed95a..6308d27 100644 --- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSClass.java +++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSClass.java @@ -40,6 +40,15 @@ public class TestFlexJSClass extends TestGoogClass assertOut(expected); } + @Test + public void testMethod_withImplicitSelfInReturnValue() + { + IClassNode node = getClassNode("public class B {public function B() {}; public var button:Button = new Button(); public function foo():String {return button.label;};}"); + asBlockWalker.visitClass(node); + String expected = "/**\n * @constructor\n */\norg.apache.flex.B = function() {\n};\n\n/**\n * @type {spark.components.Button}\n */\norg.apache.flex.B.prototype.button = new Button();\n\n/**\n * @return {string}\n */\norg.apache.flex.B.prototype.foo = function() {\n\tvar self = this;\n\treturn self.button.get_label();\n};"; + assertOut(expected); + } + @Override @Test public void testAccessors() http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/e3a75ce5/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSExpressions.java ---------------------------------------------------------------------- diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSExpressions.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSExpressions.java index 6968c38..b72571c 100644 --- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSExpressions.java +++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSExpressions.java @@ -113,6 +113,22 @@ public class TestFlexJSExpressions extends TestGoogExpressions // Other //---------------------------------- + @Test + public void testClassCast() + { + IFunctionNode node = getMethod("function foo(){A(b).text = '';}"); + asBlockWalker.visitFunction(node); + assertOut("A.prototype.foo = function() {\n\tvar self = this;\n\tb /** Cast to A */.text = '';\n}"); + } + + @Test + public void testFunctionCall() + { + IFunctionNode node = getMethod("function foo(){bar(b).text = '';}"); + asBlockWalker.visitFunction(node); + assertOut("A.prototype.foo = function() {\n\tvar self = this;\n\tbar(b).text = '';\n}"); + } + @Override @Test public void testVisitAs() http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/e3a75ce5/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalFunctions.java ---------------------------------------------------------------------- diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalFunctions.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalFunctions.java index 00566fa..79a649f 100644 --- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalFunctions.java +++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalFunctions.java @@ -22,6 +22,8 @@ package org.apache.flex.compiler.internal.codegen.js.flexjs; import org.apache.flex.compiler.driver.IBackend; import org.apache.flex.compiler.internal.codegen.js.goog.TestGoogGlobalFunctions; import org.apache.flex.compiler.internal.driver.js.flexjs.FlexJSBackend; +import org.apache.flex.compiler.tree.as.IVariableNode; +import org.junit.Test; /** * @author Erik de Bruin @@ -30,6 +32,15 @@ public class TestFlexJSGlobalFunctions extends TestGoogGlobalFunctions { @Override + @Test + public void testUint() + { + IVariableNode node = getVariable("var a:uint = uint(-100);"); + asBlockWalker.visitVariable(node); + assertOut("var /** @type {number} */ a = -100 /** Cast to uint */"); + } + + @Override protected IBackend createBackend() { return new FlexJSBackend(); http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/e3a75ce5/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 4f58975..7e59fa0 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 @@ -32,7 +32,9 @@ import org.apache.flex.compiler.internal.codegen.js.JSEmitterTokens; import org.apache.flex.compiler.internal.codegen.js.goog.JSGoogEmitter; import org.apache.flex.compiler.internal.codegen.js.goog.JSGoogEmitterTokens; import org.apache.flex.compiler.internal.definitions.AccessorDefinition; +import org.apache.flex.compiler.internal.definitions.ClassDefinition; import org.apache.flex.compiler.internal.definitions.ParameterDefinition; +import org.apache.flex.compiler.internal.definitions.VariableDefinition; 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; @@ -52,6 +54,7 @@ import org.apache.flex.compiler.tree.as.ILanguageIdentifierNode; import org.apache.flex.compiler.tree.as.IMemberAccessExpressionNode; import org.apache.flex.compiler.tree.as.ISetterNode; import org.apache.flex.compiler.utils.ASNodeUtils; +import org.apache.flex.compiler.utils.NativeUtils; /** * Concrete implementation of the 'goog' JavaScript production. @@ -81,6 +84,56 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter } @Override + public void emitFunctionCall(IFunctionCallNode node) + { + IASNode cnode = node.getChild(0); + + if (cnode.getNodeID() == ASTNodeID.MemberAccessExpressionID) + cnode = cnode.getChild(0); + + ASTNodeID id = cnode.getNodeID(); + if (id != ASTNodeID.SuperID) + { + ICompilerProject project = null; + IDefinition def = null; + + boolean isClassCast = false; + + if (node.isNewExpression()) + { + writeToken(ASEmitterTokens.NEW); + } + else + { + project = getWalker().getProject(); + def = ((IExpressionNode) cnode).resolve(project); + + isClassCast = def instanceof ClassDefinition + && !(NativeUtils.isNative(def.getBaseName())); + } + + if (!isClassCast) + { + getWalker().walk(node.getNameNode()); + write(ASEmitterTokens.PAREN_OPEN); + walkArguments(node.getArgumentNodes()); + write(ASEmitterTokens.PAREN_CLOSE); + } + else + { + walkArguments(node.getArgumentNodes()); + + write(ASEmitterTokens.SPACE); + write("/** Cast to " + def.getQualifiedName() + " */"); + } + } + else + { + emitSuperCall(node, SUPER_FUNCTION_CALL); + } + } + + @Override public void emitIdentifier(IIdentifierNode node) { ICompilerProject project = getWalker().getProject(); @@ -124,8 +177,16 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter } } } + else if (cnode == null + && inode == ASTNodeID.MemberAccessExpressionID + && def instanceof VariableDefinition) + { + writeSelf = true; + } + + boolean emitName = true; - // XXX (erikdebruin) I desperately needed a way to bypass the addition + // FIXME (erikdebruin) I desperately needed a way to bypass the addition // of the 'self' prefix when running the tests... Or // I'd have to put the prefix in ~150 asserts! boolean isRunningInTestMode = cnode != null @@ -133,21 +194,20 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter if (writeSelf && !isRunningInTestMode) { + if (inode == ASTNodeID.ContainerID) + { + write("goog.bind("); + } + write(JSGoogEmitterTokens.SELF); write(ASEmitterTokens.MEMBER_ACCESS); - } - else - { - String pname = (type != null) ? type.getPackageName() : ""; - if (cnode != null - && pname != "" - && !pname.equalsIgnoreCase(cnode.getPackageName()) - && inode != ASTNodeID.ArgumentID - && inode != ASTNodeID.VariableID - && inode != ASTNodeID.TypedExpressionID) + + if (inode == ASTNodeID.ContainerID) { - write(pname); - write(ASEmitterTokens.MEMBER_ACCESS); + write(node.getName()); + write(", self)"); + + emitName = false; } } @@ -201,7 +261,7 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter } } } - else + else if (emitName) { write(node.getName()); } http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/e3a75ce5/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java index 62cf8fb..635e630 100644 --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java @@ -209,6 +209,15 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements indentPush(); writeNewline("{"); indentPop(); + + // TODO (erikdebruin) fix properly: hack to get FlexJSAgain working + if (event.value.contains("model /**")) + event.value = event.value.replace("model /**", "this.model /**"); + + // TODO (erikdebruin) fix properly: hack to get FlexJSAgain working + if (event.value.contains("dispatchEvent")) + event.value = event.value.replace("dispatchEvent", "this.dispatchEvent"); + writeNewline(event.value + ASEmitterTokens.SEMICOLON.getToken()); writeNewline("};"); writeNewline(); http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/e3a75ce5/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSPublisher.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSPublisher.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSPublisher.java index 430ec4b..2ee179a 100644 --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSPublisher.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSPublisher.java @@ -193,13 +193,19 @@ public class MXMLFlexJSPublisher extends JSGoogPublisher implements htmlFile.append("\t<script type=\"text/javascript\">\n"); // TODO (erikdebruin) the utility methods should have their own place... - htmlFile.append("\t\tfunction is(object, type) {return object;};\n"); + htmlFile.append("\t\tfunction is(object, type) {\n"); + htmlFile.append("\t\t\treturn true;\n"); + htmlFile.append("\t\t};\n"); + htmlFile.append("\t\t\n"); + htmlFile.append("\t\tfunction Event(type) {\n"); + htmlFile.append("\t\t\treturn org.apache.flex.FlexGlobal.newObject(flash.events.Event, [type]);\n"); + htmlFile.append("\t\t};\n"); htmlFile.append("\t\t\n"); htmlFile.append("\t\tnew "); htmlFile.append(projectName); htmlFile.append("()"); - htmlFile.append(".start()\n"); + htmlFile.append(".start();\n"); htmlFile.append("\t</script>\n"); htmlFile.append("</body>\n"); htmlFile.append("</html>");
