[FalconJx] updated FlexJS emitting FlexJS was updated recently (commit fb614905ac) which meant the previous FalconJx version was unable to emit a functional JS application from the source. Various minor changes fix the issues that caused the JS error and the app is again output correctly:
http://people.apache.org/~erikdebruin/flexjs/ Signed-off-by: Erik de Bruin <e...@ixsoftware.nl> Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/cdff845a Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/cdff845a Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/cdff845a Branch: refs/heads/develop Commit: cdff845ad050b2597d0e334f46d21851add50eff Parents: 414bf81 Author: Erik de Bruin <e...@ixsoftware.nl> Authored: Fri Mar 29 19:54:36 2013 +0100 Committer: Erik de Bruin <e...@ixsoftware.nl> Committed: Fri Mar 29 19:54:36 2013 +0100 ---------------------------------------------------------------------- .../codegen/js/flexjs/JSFlexJSEmitter.java | 107 +++++++++++++- .../codegen/mxml/flexjs/MXMLFlexJSEmitter.java | 79 +++++++---- .../codegen/mxml/flexjs/MXMLFlexJSPublisher.java | 4 - 3 files changed, 148 insertions(+), 42 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/cdff845a/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 7e59fa0..4d0b3e9 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 @@ -23,6 +23,7 @@ import java.io.FilterWriter; import org.apache.flex.compiler.codegen.js.flexjs.IJSFlexJSEmitter; import org.apache.flex.compiler.common.ASModifier; +import org.apache.flex.compiler.common.ModifiersSet; import org.apache.flex.compiler.constants.IASLanguageConstants; import org.apache.flex.compiler.definitions.IDefinition; import org.apache.flex.compiler.definitions.IFunctionDefinition; @@ -33,11 +34,14 @@ 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.ClassTraitsDefinition; 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.ChainedVariableNode; 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.ParameterNode; import org.apache.flex.compiler.projects.ICompilerProject; import org.apache.flex.compiler.tree.ASTNodeID; import org.apache.flex.compiler.tree.as.IASNode; @@ -53,6 +57,7 @@ import org.apache.flex.compiler.tree.as.IIdentifierNode; 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.tree.as.IVariableNode; import org.apache.flex.compiler.utils.ASNodeUtils; import org.apache.flex.compiler.utils.NativeUtils; @@ -71,6 +76,61 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter } @Override + public void emitField(IVariableNode node) + { + ICompilerProject project = getWalker().getProject(); + + IDefinition definition = getClassDefinition(node); + + IDefinition def = null; + IExpressionNode enode = node.getVariableTypeNode();//getAssignedValueNode(); + if (enode != null) + def = enode.resolveType(project); + + getDoc().emitFieldDoc(node, def); + + IDefinition ndef = node.getDefinition(); + + ModifiersSet modifierSet = ndef.getModifiers(); + String root = ""; + if (modifierSet != null && !modifierSet.hasModifier(ASModifier.STATIC)) + { + root = JSEmitterTokens.PROTOTYPE.getToken(); + root += ASEmitterTokens.MEMBER_ACCESS.getToken(); + } + + if (definition == null) + definition = ndef.getContainingScope().getDefinition(); + + write(definition.getQualifiedName() + + ASEmitterTokens.MEMBER_ACCESS.getToken() + root + + node.getName()); + + IExpressionNode vnode = node.getAssignedValueNode(); + if (vnode != null) + { + write(ASEmitterTokens.SPACE); + writeToken(ASEmitterTokens.EQUAL); + getWalker().walk(vnode); + } + + if (!(node instanceof ChainedVariableNode)) + { + int len = node.getChildCount(); + for (int i = 0; i < len; i++) + { + IASNode child = node.getChild(i); + if (child instanceof ChainedVariableNode) + { + writeNewline(ASEmitterTokens.SEMICOLON); + writeNewline(); + emitField((IVariableNode) child); + } + } + } + } + + @Override protected void emitAccessors(IAccessorNode node) { if (node.getNodeID() == ASTNodeID.GetterID) @@ -123,7 +183,6 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter { walkArguments(node.getArgumentNodes()); - write(ASEmitterTokens.SPACE); write("/** Cast to " + def.getQualifiedName() + " */"); } } @@ -149,6 +208,7 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter ASTNodeID inode = pnode.getNodeID(); boolean writeSelf = false; + boolean writeThis = false; if (cnode != null && !(def instanceof ParameterDefinition)) { IDefinitionNode[] members = cnode.getAllMemberNodes(); @@ -177,11 +237,37 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter } } } - else if (cnode == null - && inode == ASTNodeID.MemberAccessExpressionID - && def instanceof VariableDefinition) + else if (cnode == null && !(type instanceof ClassTraitsDefinition)) { - writeSelf = true; + // (erikdebruin) the sequence of these conditions matters, leave + // well enough alone! + if (def instanceof VariableDefinition) + { + if (inode == ASTNodeID.MemberAccessExpressionID) + { + writeSelf = true; + } + else if (inode == ASTNodeID.ContainerID) + { + writeSelf = true; + writeThis = true; + } + else if (!(pnode instanceof ParameterNode)) + { + writeSelf = true; + } + } + else if (inode == ASTNodeID.ContainerID) + { + writeSelf = true; + } + else if (inode == ASTNodeID.FunctionCallID + && !(def instanceof AccessorDefinition) + && inode != ASTNodeID.MemberAccessExpressionID) + { + writeSelf = true; + writeThis = true; + } } boolean emitName = true; @@ -194,15 +280,20 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter if (writeSelf && !isRunningInTestMode) { - if (inode == ASTNodeID.ContainerID) + boolean useGoogBind = inode == ASTNodeID.ContainerID && !writeThis; + + if (useGoogBind) { write("goog.bind("); } - write(JSGoogEmitterTokens.SELF); + if (writeThis) + write(ASEmitterTokens.THIS); + else + write(JSGoogEmitterTokens.SELF); write(ASEmitterTokens.MEMBER_ACCESS); - if (inode == ASTNodeID.ContainerID) + if (useGoogBind) { write(node.getName()); write(", self)"); http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/cdff845a/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 635e630..f9effde 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 @@ -33,6 +33,7 @@ import org.apache.flex.compiler.internal.codegen.mxml.MXMLEmitter; import org.apache.flex.compiler.projects.ICompilerProject; import org.apache.flex.compiler.tree.as.IASNode; import org.apache.flex.compiler.tree.as.IFunctionNode; +import org.apache.flex.compiler.tree.as.IImportNode; import org.apache.flex.compiler.tree.mxml.IMXMLArrayNode; import org.apache.flex.compiler.tree.mxml.IMXMLDocumentNode; import org.apache.flex.compiler.tree.mxml.IMXMLEventSpecifierNode; @@ -51,25 +52,13 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements IMXMLFlexJSEmitter { - // list of all current instance and it's ancestors private ArrayList<MXMLDescriptorSpecifier> currentInstances; - - // list of all current property specifier and it's ancestors private ArrayList<MXMLDescriptorSpecifier> currentPropertySpecifiers; - - // tree of all contents private ArrayList<MXMLDescriptorSpecifier> descriptorTree; - - // linear list of all events private ArrayList<MXMLEventSpecifier> events; - - // linear list of all instances private ArrayList<MXMLDescriptorSpecifier> instances; - - // linear list of all scripts + private ArrayList<String> imports; private ArrayList<MXMLScriptSpecifier> scripts; - - // linear list of all styles //private ArrayList<MXMLStyleSpecifier> styles; private int eventCounter; @@ -91,6 +80,7 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements events = new ArrayList<MXMLEventSpecifier>(); instances = new ArrayList<MXMLDescriptorSpecifier>(); + imports = new ArrayList<String>(); scripts = new ArrayList<MXMLScriptSpecifier>(); //styles = new ArrayList<MXMLStyleSpecifier>(); @@ -134,6 +124,14 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements writtenInstances.add(name); } } + for (String name : imports) + { + if (writtenInstances.indexOf(name) == -1) + { + emitHeaderDoc(name, "require"); + writtenInstances.add(name); + } + } writeNewline(); writeNewline("/**"); @@ -209,16 +207,10 @@ 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("var self = this;"); writeNewline(event.value + ASEmitterTokens.SEMICOLON.getToken()); + writeNewline("};"); writeNewline(); } @@ -361,7 +353,22 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements IASEmitter asEmitter = ((IMXMLBlockWalker) getMXMLWalker()) .getASEmitter(); - eventSpecifier.value = asEmitter.stringifyNode(node.getChild(0)); + StringBuilder sb = null; + int len = node.getChildCount(); + if (len > 0) + { + sb = new StringBuilder(); + for (int i = 0; i < len; i++) + { + sb.append(asEmitter.stringifyNode(node.getChild(i))); + if (i < len - 1) + { + sb.append(ASEmitterTokens.SEMICOLON.getToken()); + sb.append(ASEmitterTokens.NEW_LINE.getToken()); + } + } + } + eventSpecifier.value = sb.toString(); if (currentDescriptor != null) currentDescriptor.eventSpecifiers.add(eventSpecifier); @@ -476,16 +483,28 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements IASNode cnode = node.getChild(i); docEmitter.setBufferWrite(true); - docEmitter.emitMethodDoc((IFunctionNode) cnode, getMXMLWalker() - .getProject()); + if (cnode instanceof IFunctionNode) + { + docEmitter.emitMethodDoc((IFunctionNode) cnode, + getMXMLWalker().getProject()); + } + else if (cnode instanceof IImportNode) + { + imports.add(((IImportNode) cnode).getImportName()); + } sb.append(docEmitter.flushBuffer()); - - sb.append(asEmitter.stringifyNode(cnode)); - if (i == len - 1) - indentPop(); + if (!(cnode instanceof IImportNode)) + { + sb.append(asEmitter.stringifyNode(cnode)); + + sb.append(ASEmitterTokens.SEMICOLON.getToken()); + + if (i == len - 1) + indentPop(); - sb.append(nl); + sb.append(nl); + } scriptSpecifier.fragment = sb.toString(); http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/cdff845a/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 2ee179a..8c29a3f 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 @@ -197,10 +197,6 @@ public class MXMLFlexJSPublisher extends JSGoogPublisher implements 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);