You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by er...@apache.org on 2013/03/29 19:56:54 UTC
[4/5] git commit: [FalconJx] updated FlexJS emitting
[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 <er...@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 <er...@ixsoftware.nl>
Authored: Fri Mar 29 19:54:36 2013 +0100
Committer: Erik de Bruin <er...@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);