Repository: flex-falcon Updated Branches: refs/heads/develop f05424470 -> bd111dd43
In JS, initial property (non-literal) value assignments must take place in the constructor, not on the property definition itself 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/af39216a Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/af39216a Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/af39216a Branch: refs/heads/develop Commit: af39216ad987f80d16888b3f77929c504b15a084 Parents: 0734ae4 Author: Erik de Bruin <[email protected]> Authored: Fri Oct 31 17:36:56 2014 +0100 Committer: Erik de Bruin <[email protected]> Committed: Fri Oct 31 17:44:03 2014 +0100 ---------------------------------------------------------------------- .../codegen/js/vf2js/JSVF2JSEmitter.java | 83 +++++++++++++++++++- 1 file changed, 80 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/af39216a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/vf2js/JSVF2JSEmitter.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/vf2js/JSVF2JSEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/vf2js/JSVF2JSEmitter.java index 1ff495c..939b2bf 100644 --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/vf2js/JSVF2JSEmitter.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/vf2js/JSVF2JSEmitter.java @@ -33,12 +33,14 @@ import org.apache.flex.compiler.codegen.IDocEmitter; import org.apache.flex.compiler.codegen.js.vf2js.IJSVF2JSEmitter; 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.IClassDefinition; import org.apache.flex.compiler.definitions.IDefinition; import org.apache.flex.compiler.definitions.IFunctionDefinition; import org.apache.flex.compiler.definitions.IFunctionDefinition.FunctionClassification; import org.apache.flex.compiler.definitions.INamespaceDefinition; import org.apache.flex.compiler.definitions.IPackageDefinition; +import org.apache.flex.compiler.definitions.IParameterDefinition; import org.apache.flex.compiler.definitions.ITypeDefinition; import org.apache.flex.compiler.internal.codegen.as.ASEmitterTokens; import org.apache.flex.compiler.internal.codegen.js.JSEmitterTokens; @@ -71,6 +73,7 @@ import org.apache.flex.compiler.tree.as.IASNode; import org.apache.flex.compiler.tree.as.IAccessorNode; import org.apache.flex.compiler.tree.as.IBinaryOperatorNode; 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.IEmbedNode; import org.apache.flex.compiler.tree.as.IExpressionNode; @@ -80,6 +83,7 @@ import org.apache.flex.compiler.tree.as.IFunctionNode; import org.apache.flex.compiler.tree.as.IGetterNode; import org.apache.flex.compiler.tree.as.IIdentifierNode; import org.apache.flex.compiler.tree.as.IInterfaceNode; +import org.apache.flex.compiler.tree.as.IKeywordNode; import org.apache.flex.compiler.tree.as.ILanguageIdentifierNode; import org.apache.flex.compiler.tree.as.ILiteralNode; import org.apache.flex.compiler.tree.as.ILiteralNode.LiteralType; @@ -256,11 +260,81 @@ public class JSVF2JSEmitter extends JSGoogEmitter implements IJSVF2JSEmitter } @Override + public void emitFunctionBlockHeader(IFunctionNode node) + { + IDefinition def = node.getDefinition(); + boolean isStatic = false; + if (def != null && def.isStatic()) + isStatic = true; + boolean isLocal = false; + if (node.getFunctionClassification() == IFunctionDefinition.FunctionClassification.LOCAL) + isLocal = true; + if (hasBody(node) && !isStatic && !isLocal) + emitSelfReference(node); + + emitRestParameterCodeBlock(node); + + emitDefaultParameterCodeBlock(node); + + if (node.isConstructor()) + { + emitVarNonLiteralAssignments(); + } + + if (node.isConstructor() + && hasSuperClass(node) && !hasSuperCall(node.getScopedNode())) + emitSuperCall(node, CONSTRUCTOR_FULL); + } + + private void emitVarNonLiteralAssignments() + { + // (erikdebruin): If the initial value of a variable is set using + // a method, JS needs this initialization to be done + // in the constructor + IClassNode cdnode = (IClassNode) thisClass.getNode(); + IDefinitionNode[] dnodes = cdnode.getAllMemberNodes(); + for (IDefinitionNode dnode : dnodes) + { + if (dnode.getNodeID() == ASTNodeID.VariableID) + { + IVariableNode vnode = (IVariableNode) dnode; + IExpressionNode avnode = vnode.getAssignedValueNode(); + if (avnode != null && + !(avnode instanceof ILiteralNode) && + !(avnode instanceof IEmbedNode)) + { + writeNewline("", true); + if (vnode.hasModifier(ASModifier.STATIC)) + { + write(cdnode.getQualifiedName()); + } + else + { + write(ASEmitterTokens.THIS); + } + write(ASEmitterTokens.MEMBER_ACCESS); + writeToken(vnode.getName()); + writeToken(ASEmitterTokens.EQUAL); + getWalker().walk(avnode); + indentPop(); + writeNewline(ASEmitterTokens.SEMICOLON); + } + } + } + } + + @Override public void emitVarDeclaration(IVariableNode node) { if (!(node instanceof ChainedVariableNode)) { - emitMemberKeyword(node); + // (erikdebruin): check for 'var i:int = 0, j:int = 0' containers + IASNode pnode = node.getParent(); + if (!(pnode instanceof IVariableExpressionNode) || + node.getChild(0) instanceof IKeywordNode) + { + emitMemberKeyword(node); + } } IExpressionNode avnode = node.getAssignedValueNode(); @@ -332,7 +406,7 @@ public class JSVF2JSEmitter extends JSGoogEmitter implements IJSVF2JSEmitter + node.getName()); IExpressionNode vnode = node.getAssignedValueNode(); - if (vnode != null && !(vnode instanceof IEmbedNode)) + if (vnode != null && vnode instanceof ILiteralNode) { write(ASEmitterTokens.SPACE); writeToken(ASEmitterTokens.EQUAL); @@ -454,9 +528,12 @@ public class JSVF2JSEmitter extends JSGoogEmitter implements IJSVF2JSEmitter { write(ASEmitterTokens.SPACE); write(ASEmitterTokens.BLOCK_OPEN); + emitVarNonLiteralAssignments(); if (hasSuperClass) + { emitSuperCall(node, CONSTRUCTOR_EMPTY); - writeNewline(); + writeNewline(); + } write(ASEmitterTokens.BLOCK_CLOSE); }
