Repository: flex-falcon Updated Branches: refs/heads/develop c899a8da7 -> 8596224ed
rough cut at switching FlexJS to defineProperty. Probably very broken so wait for future commits before trying Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/4faba4a5 Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/4faba4a5 Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/4faba4a5 Branch: refs/heads/develop Commit: 4faba4a5d3bfcdd3e4013063fc9bac85abf15abc Parents: 743fe15 Author: Alex Harui <[email protected]> Authored: Fri Jan 30 10:52:07 2015 -0800 Committer: Alex Harui <[email protected]> Committed: Fri Jan 30 10:52:07 2015 -0800 ---------------------------------------------------------------------- .../codegen/js/flexjs/JSFlexJSEmitter.java | 296 +++++++------------ .../internal/codegen/js/goog/JSGoogEmitter.java | 19 +- 2 files changed, 128 insertions(+), 187 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/4faba4a5/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 9d92c4a..37c8045 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 @@ -236,6 +236,7 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter docEmitter.classIgnoreList = ignoreList; } + /* @Override public void emitInterface(IInterfaceNode node) { @@ -291,7 +292,8 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter write(ASEmitterTokens.SEMICOLON); } } - + */ + @Override public void emitField(IVariableNode node) { @@ -394,6 +396,7 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter } } + /* @Override protected void emitAccessors(IAccessorNode node) { @@ -406,7 +409,7 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter emitSetAccessor((ISetterNode) node); } } - + @Override public void emitMethod(IFunctionNode node) { @@ -471,6 +474,7 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter write(ASEmitterTokens.PAREN_CLOSE); } } + */ @Override public void emitFunctionCall(IFunctionCallNode node) @@ -754,101 +758,7 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter IDefinition parentDef = (nodeDef != null) ? nodeDef.getParent() : null; boolean isNative = (parentDef != null) && NativeUtils.isNative(parentDef.getBaseName()); - if ((identifierIsAccessorFunction && !isNative) - || (nodeDef instanceof VariableDefinition && ((VariableDefinition) nodeDef) - .isBindable())) - { - IASNode anode = node - .getAncestorOfType(BinaryOperatorAssignmentNode.class); - - boolean isAssignment = false; - if (anode != null) - { - IASNode leftNode = anode.getChild(0); - if (anode == parentNode) - { - if (node == leftNode) - isAssignment = true; - } - else - { - IASNode pnode = parentNode; - IASNode thisNode = node; - while (anode != pnode) - { - if (pnode instanceof IMemberAccessExpressionNode) - { - if (thisNode != pnode.getChild(1)) - { - // can't be an assignment because - // we're on the left side of a memberaccessexpression - break; - } - } - if (pnode instanceof IDynamicAccessNode) - { - if (thisNode != pnode.getChild(1)) - { - // can't be an assignment because - // we're on the left side of a DynamicAccessNode - break; - } - } - if (pnode == leftNode) - { - isAssignment = true; - } - thisNode = pnode; - pnode = pnode.getParent(); - } - } - String op = ((IBinaryOperatorNode) anode).getOperator() - .getOperatorText(); - if (op.contains("==") || !op.contains("=")) - isAssignment = false; - } - - if (parentNode.getNodeID() == ASTNodeID.MemberAccessExpressionID - && parentNode.getChild(0).getNodeID() == ASTNodeID.SuperID) - { - IClassNode cnode = (IClassNode) node - .getAncestorOfType(IClassNode.class); - - // ToDo (erikdebruin): add VF2JS conditional -> only use check during full SDK compilation - if (cnode == null) - return; - - write(formatQualifiedName(cnode.getQualifiedName())); - write(ASEmitterTokens.MEMBER_ACCESS); - write(JSGoogEmitterTokens.GOOG_BASE); - write(ASEmitterTokens.PAREN_OPEN); - write(ASEmitterTokens.THIS); - writeToken(ASEmitterTokens.COMMA); - write(ASEmitterTokens.SINGLE_QUOTE); - writeGetSetPrefix(!isAssignment); - write(nodeDef.getQualifiedName()); - write(ASEmitterTokens.SINGLE_QUOTE); - if (isAssignment) - { - writeToken(ASEmitterTokens.COMMA); - } - } - else - { - writeGetSetPrefix(!isAssignment); - write(node.getName()); - write(ASEmitterTokens.PAREN_OPEN); - } - - if (anode != null && isAssignment) - { - getWalker().walk(((BinaryOperatorAssignmentNode) anode) - .getRightOperandNode()); - } - - write(ASEmitterTokens.PAREN_CLOSE); - } - else if (emitName) + if (emitName) { if (nodeDef != null) write(formatQualifiedName(nodeDef.getQualifiedName())); @@ -858,7 +768,7 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter } //-------------------------------------------------------------------------- - + /* @Override protected void emitSuperCall(IASNode node, String type) { @@ -970,7 +880,7 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter write(ASEmitterTokens.SEMICOLON); } } - + @Override protected void emitDefaultParameterCodeBlock(IFunctionNode node) { @@ -1001,7 +911,7 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter { code.setLength(0); - /* x = typeof y !== 'undefined' ? y : z;\n */ + // x = typeof y !== 'undefined' ? y : z;\n code.append(pnode.getName()); code.append(ASEmitterTokens.SPACE.getToken()); code.append(ASEmitterTokens.EQUAL.getToken()); @@ -1035,18 +945,20 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter } } } + */ @Override public void emitBinaryOperator(IBinaryOperatorNode node) { ASTNodeID id = node.getNodeID(); + /* if (id == ASTNodeID.Op_InID || id == ASTNodeID.Op_LogicalAndAssignID || id == ASTNodeID.Op_LogicalOrAssignID) { super.emitBinaryOperator(node); } - else if (id == ASTNodeID.Op_IsID || id == ASTNodeID.Op_AsID) + else */ if (id == ASTNodeID.Op_IsID || id == ASTNodeID.Op_AsID) { emitIsAs(node.getLeftOperandNode(), node.getRightOperandNode(), id, false); } @@ -1065,6 +977,8 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter } else { + super.emitBinaryOperator(node); + /* IExpressionNode leftSide = node.getLeftOperandNode(); IExpressionNode property = null; @@ -1126,6 +1040,7 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter if (ASNodeUtils.hasParenClose(node)) write(ASEmitterTokens.PAREN_CLOSE); } + */ } } @@ -1260,6 +1175,7 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter getWalker().walk(node.getRightOperandNode()); } + /* private static ITypeDefinition getTypeDefinition(IDefinitionNode node) { ITypeNode tnode = (ITypeNode) node.getAncestorOfType(ITypeNode.class); @@ -1274,7 +1190,8 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter IClassDefinition superClass = parent.resolveBaseClass(project); return superClass; } - + */ + @Override protected void emitObjectDefineProperty(IAccessorNode node) { @@ -1302,95 +1219,103 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter break; } } - if (isBindableSetter) + } + if (isBindableSetter) + { + getDoc().emitMethodDoc(fn, project); + write(formatQualifiedName(type.getQualifiedName())); + if (!node.hasModifier(ASModifier.STATIC)) + { + write(ASEmitterTokens.MEMBER_ACCESS); + write(JSEmitterTokens.PROTOTYPE); + } + + write(ASEmitterTokens.MEMBER_ACCESS); + write("__bindingWrappedSetter__"); + writeToken(node.getName()); + writeToken(ASEmitterTokens.EQUAL); + write(ASEmitterTokens.FUNCTION); + emitParameters(node.getParameterNodes()); + //writeNewline(); + emitMethodScope(node.getScopedNode()); + } + super.emitObjectDefineProperty(node); + } + + @Override + protected void emitDefinePropertyFunction(IAccessorNode node) + { + boolean isBindableSetter = false; + if (node instanceof SetterNode) + { + IMetaInfo[] metaInfos = null; + metaInfos = node.getMetaInfos(); + for (IMetaInfo metaInfo : metaInfos) { - getDoc().emitMethodDoc(fn, project); - write(formatQualifiedName(type.getQualifiedName())); - if (!node.hasModifier(ASModifier.STATIC)) + String name = metaInfo.getTagName(); + if (name.equals("Bindable") && metaInfo.getAllAttributes().length == 0) { - write(ASEmitterTokens.MEMBER_ACCESS); - write(JSEmitterTokens.PROTOTYPE); + isBindableSetter = true; + break; } - - write(ASEmitterTokens.MEMBER_ACCESS); - writeGetSetPrefix(false); - writeToken(node.getName()); - writeToken(ASEmitterTokens.EQUAL); - write(ASEmitterTokens.FUNCTION); - emitParameters(node.getParameterNodes()); - write(ASEmitterTokens.SPACE); - writeNewline(ASEmitterTokens.BLOCK_OPEN); - - write(ASEmitterTokens.VAR); - write(ASEmitterTokens.SPACE); - write("oldValue"); - write(ASEmitterTokens.SPACE); - write(ASEmitterTokens.EQUAL); - write(ASEmitterTokens.SPACE); - write(ASEmitterTokens.THIS); - write(ASEmitterTokens.MEMBER_ACCESS); - write("get_" + node.getName()); - write(ASEmitterTokens.PAREN_OPEN); - write(ASEmitterTokens.PAREN_CLOSE); - writeNewline(ASEmitterTokens.SEMICOLON); - - // add change check - write(ASEmitterTokens.IF); - write(ASEmitterTokens.SPACE); - write(ASEmitterTokens.PAREN_OPEN); - write("oldValue"); - write(ASEmitterTokens.SPACE); - write(ASEmitterTokens.STRICT_EQUAL); - write(ASEmitterTokens.SPACE); - IParameterNode[] params = node.getParameterNodes(); - write(params[0].getName()); - write(ASEmitterTokens.PAREN_CLOSE); - write(ASEmitterTokens.SPACE); - write(ASEmitterTokens.RETURN); - writeNewline(ASEmitterTokens.SEMICOLON); - - write(ASEmitterTokens.THIS); - write(ASEmitterTokens.MEMBER_ACCESS); - write("__bindingWrappedSetter__" + node.getName()); - write(ASEmitterTokens.PAREN_OPEN); - write(params[0].getName()); - write(ASEmitterTokens.PAREN_CLOSE); - writeNewline(ASEmitterTokens.SEMICOLON); - - // add dispatch of change event - writeNewline(" this.dispatchEvent(org_apache_flex_events_ValueChangeEvent.createUpdateEvent("); - writeNewline(" this, \"" + node.getName() + "\", oldValue, " + params[0].getName() + "));"); - write(ASEmitterTokens.BLOCK_CLOSE); - writeNewline(ASEmitterTokens.SEMICOLON); - writeNewline(); - writeNewline(); } } - - if (project == null) - project = getWalker().getProject(); - - getDoc().emitMethodDoc(fn, project); - write(formatQualifiedName(type.getQualifiedName())); - if (!node.hasModifier(ASModifier.STATIC)) + if (isBindableSetter) { + write(ASEmitterTokens.FUNCTION); + emitParameters(node.getParameterNodes()); + write(ASEmitterTokens.SPACE); + writeNewline(ASEmitterTokens.BLOCK_OPEN); + + write(ASEmitterTokens.VAR); + write(ASEmitterTokens.SPACE); + write("oldValue"); + write(ASEmitterTokens.SPACE); + write(ASEmitterTokens.EQUAL); + write(ASEmitterTokens.SPACE); + write(ASEmitterTokens.THIS); write(ASEmitterTokens.MEMBER_ACCESS); - write(JSEmitterTokens.PROTOTYPE); - } + write("get_" + node.getName()); + write(ASEmitterTokens.PAREN_OPEN); + write(ASEmitterTokens.PAREN_CLOSE); + writeNewline(ASEmitterTokens.SEMICOLON); + + // add change check + write(ASEmitterTokens.IF); + write(ASEmitterTokens.SPACE); + write(ASEmitterTokens.PAREN_OPEN); + write("oldValue"); + write(ASEmitterTokens.SPACE); + write(ASEmitterTokens.STRICT_EQUAL); + write(ASEmitterTokens.SPACE); + IParameterNode[] params = node.getParameterNodes(); + write(params[0].getName()); + write(ASEmitterTokens.PAREN_CLOSE); + write(ASEmitterTokens.SPACE); + write(ASEmitterTokens.RETURN); + writeNewline(ASEmitterTokens.SEMICOLON); - write(ASEmitterTokens.MEMBER_ACCESS); - if (isBindableSetter) - write("__bindingWrappedSetter__"); + write(ASEmitterTokens.THIS); + write(ASEmitterTokens.MEMBER_ACCESS); + write("__bindingWrappedSetter__" + node.getName()); + write(ASEmitterTokens.PAREN_OPEN); + write(params[0].getName()); + write(ASEmitterTokens.PAREN_CLOSE); + writeNewline(ASEmitterTokens.SEMICOLON); + + // add dispatch of change event + writeNewline(" this.dispatchEvent(org_apache_flex_events_ValueChangeEvent.createUpdateEvent("); + writeNewline(" this, \"" + node.getName() + "\", oldValue, " + params[0].getName() + "));"); + write(ASEmitterTokens.BLOCK_CLOSE); + writeNewline(ASEmitterTokens.SEMICOLON); + writeNewline(); + writeNewline(); + } else - writeGetSetPrefix(node instanceof IGetterNode); - writeToken(node.getName()); - writeToken(ASEmitterTokens.EQUAL); - write(ASEmitterTokens.FUNCTION); - emitParameters(node.getParameterNodes()); - //writeNewline(); - emitMethodScope(node.getScopedNode()); + super.emitDefinePropertyFunction(node); } - + + /* private void writeGetSetPrefix(boolean isGet) { if (isGet) @@ -1399,7 +1324,8 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter write(ASEmitterTokens.SET); write("_"); } - + */ + private JSFlexJSDocEmitter docEmitter = null; @Override @@ -1841,6 +1767,8 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter write("E4XFilter"); write(ASEmitterTokens.SINGLE_QUOTE); } + + /* @Override public void emitUnaryOperator(IUnaryOperatorNode node) { @@ -1894,8 +1822,10 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter } super.emitUnaryOperator(node); } + */ - private String formatQualifiedName(String name) + @Override + protected String formatQualifiedName(String name) { if (name.contains("goog.") || name.startsWith("Vector.")) return name; http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/4faba4a5/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/goog/JSGoogEmitter.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/goog/JSGoogEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/goog/JSGoogEmitter.java index 7050999..28e17f5 100644 --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/goog/JSGoogEmitter.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/goog/JSGoogEmitter.java @@ -455,7 +455,7 @@ public class JSGoogEmitter extends JSEmitter implements IJSGoogEmitter String qname = getTypeDefinition(node).getQualifiedName(); if (qname != null && !qname.equals("")) { - write(qname); + write(formatQualifiedName(qname)); if (!isConstructor) { write(ASEmitterTokens.MEMBER_ACCESS); @@ -496,11 +496,11 @@ public class JSGoogEmitter extends JSEmitter implements IJSGoogEmitter writeNewline(); write(JSGoogEmitterTokens.GOOG_INHERITS); write(ASEmitterTokens.PAREN_OPEN); - write(qname); + write(formatQualifiedName(qname)); writeToken(ASEmitterTokens.COMMA); String sname = getSuperClassDefinition(node, project) .getQualifiedName(); - write(sname); + write(formatQualifiedName(sname)); write(ASEmitterTokens.PAREN_CLOSE); } } @@ -1024,7 +1024,7 @@ public class JSGoogEmitter extends JSEmitter implements IJSGoogEmitter write(ASEmitterTokens.FUNCTION); emitParameters(node.getParameterNodes()); - emitMethodScope(node.getScopedNode()); + emitDefinePropertyFunction(node); writeToken(ASEmitterTokens.COMMA); write(JSEmitterTokens.CONFIGURABLE); @@ -1036,6 +1036,11 @@ public class JSGoogEmitter extends JSEmitter implements IJSGoogEmitter write(ASEmitterTokens.PAREN_CLOSE); } + protected void emitDefinePropertyFunction(IAccessorNode node) + { + emitMethodScope(node.getScopedNode()); + } + //-------------------------------------------------------------------------- // Operators //-------------------------------------------------------------------------- @@ -1151,4 +1156,10 @@ public class JSGoogEmitter extends JSEmitter implements IJSGoogEmitter } return list; } + + protected String formatQualifiedName(String name) + { + return name; + } + }
