FlexJS MXML emitter update The FlexJS MXML emitter now uses the new FlexJS JS and JSDoc emitters.
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/797b7c81 Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/797b7c81 Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/797b7c81 Branch: refs/heads/develop Commit: 797b7c8112f5ab8103616f25dc380f4e59f5faa0 Parents: 38ca8a6 Author: Erik de Bruin <[email protected]> Authored: Wed Mar 27 16:28:35 2013 +0100 Committer: Erik de Bruin <[email protected]> Committed: Wed Mar 27 16:29:59 2013 +0100 ---------------------------------------------------------------------- .../codegen/mxml/flexjs/MXMLFlexJSEmitter.java | 128 +++------------ .../driver/mxml/flexjs/MXMLFlexJSBackend.java | 17 ++- 2 files changed, 41 insertions(+), 104 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/797b7c81/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 de8db43..62cf8fb 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 @@ -23,6 +23,7 @@ import java.io.FilterWriter; import java.util.ArrayList; import org.apache.flex.compiler.codegen.as.IASEmitter; +import org.apache.flex.compiler.codegen.js.goog.IJSGoogDocEmitter; import org.apache.flex.compiler.codegen.mxml.flexjs.IMXMLFlexJSEmitter; import org.apache.flex.compiler.definitions.IClassDefinition; import org.apache.flex.compiler.definitions.IDefinition; @@ -30,10 +31,8 @@ import org.apache.flex.compiler.internal.codegen.as.ASEmitterTokens; import org.apache.flex.compiler.internal.codegen.js.goog.JSGoogEmitterTokens; import org.apache.flex.compiler.internal.codegen.mxml.MXMLEmitter; import org.apache.flex.compiler.projects.ICompilerProject; -import org.apache.flex.compiler.tree.ASTNodeID; import org.apache.flex.compiler.tree.as.IASNode; import org.apache.flex.compiler.tree.as.IFunctionNode; -import org.apache.flex.compiler.tree.as.IScopedNode; import org.apache.flex.compiler.tree.mxml.IMXMLArrayNode; import org.apache.flex.compiler.tree.mxml.IMXMLDocumentNode; import org.apache.flex.compiler.tree.mxml.IMXMLEventSpecifierNode; @@ -350,53 +349,10 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements eventSpecifier.type = node.getEventParameterDefinition() .getTypeAsDisplayString(); - // XXX (erikdebruin) "not really sure" the next bit is generic code ;-) IASEmitter asEmitter = ((IMXMLBlockWalker) getMXMLWalker()) .getASEmitter(); - String originalHandler = asEmitter.stringifyNode(node.getChild(0)); - StringBuilder jsFormattedHandler = new StringBuilder(); - String[] splitOnFirstMethod = originalHandler.split("\\("); - if (splitOnFirstMethod[0].equals("MyModel")) - { - // MyModel(model).labelText = 'Hello World'; - // becomes: - // this.model.set_labelText("Hello World"); - String[] classPropertyAndValue = splitOnFirstMethod[1].split("\\)"); - String[] propertyAndValue = classPropertyAndValue[1].split(" = "); - - String className = classPropertyAndValue[0]; - String property = propertyAndValue[0].substring(1); - String value = propertyAndValue[1]; - - jsFormattedHandler.append(ASEmitterTokens.THIS.getToken()); - jsFormattedHandler.append(ASEmitterTokens.MEMBER_ACCESS.getToken()); - jsFormattedHandler.append(className); - jsFormattedHandler.append(ASEmitterTokens.MEMBER_ACCESS.getToken()); - jsFormattedHandler.append("set_"); - jsFormattedHandler.append(property); - jsFormattedHandler.append(ASEmitterTokens.PAREN_OPEN.getToken()); - jsFormattedHandler.append(value); - jsFormattedHandler.append(ASEmitterTokens.PAREN_CLOSE.getToken()); - } - else if (splitOnFirstMethod[0].equals("dispatchEvent")) - { - // dispatchEvent(new Event('buttonClicked')); - // becomes: - // this.dispatchEvent(org.apache.flex.FlexGlobal.newObject(flash.events.Event, ["buttonClicked"])); - String[] eventNameMain = splitOnFirstMethod[2].split("'"); - - jsFormattedHandler.append(ASEmitterTokens.THIS.getToken()); - jsFormattedHandler.append(ASEmitterTokens.MEMBER_ACCESS.getToken()); - jsFormattedHandler.append(splitOnFirstMethod[0]); - jsFormattedHandler.append(ASEmitterTokens.PAREN_OPEN.getToken()); - jsFormattedHandler - .append("org.apache.flex.FlexGlobal.newObject(flash.events.Event, [\""); - jsFormattedHandler.append(eventNameMain[1]); - jsFormattedHandler.append("\"])"); - jsFormattedHandler.append(ASEmitterTokens.PAREN_CLOSE.getToken()); - } - eventSpecifier.value = jsFormattedHandler.toString(); + eventSpecifier.value = asEmitter.stringifyNode(node.getChild(0)); if (currentDescriptor != null) currentDescriptor.eventSpecifiers.add(eventSpecifier); @@ -490,72 +446,42 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements @Override public void emitScript(IMXMLScriptNode node) { - String cname = node.getFileNode().getName(); - IASEmitter asEmitter = ((IMXMLBlockWalker) getMXMLWalker()) .getASEmitter(); + IJSGoogDocEmitter docEmitter = (IJSGoogDocEmitter) asEmitter + .getDocEmitter(); + + String nl = ASEmitterTokens.NEW_LINE.getToken(); StringBuilder sb = null; MXMLScriptSpecifier scriptSpecifier = null; - indentPush(); - String nl = ASEmitterTokens.NEW_LINE.getToken(); - String ci = getIndent(getCurrentIndent()); - indentPop(); - - IASNode[] asnodes = node.getASNodes(); - for (IASNode asnode : asnodes) + int len = node.getChildCount(); + if (len > 0) { - sb = new StringBuilder(); - scriptSpecifier = new MXMLScriptSpecifier(); - - String signature = asEmitter.stringifyNode(asnode) - + ASEmitterTokens.NEW_LINE.getToken(); - - String[] breakOnGet = signature.split("get "); - String[] breakOnParenOpen = breakOnGet[1].split("\\("); - String propertyName = breakOnParenOpen[0]; - - sb.append("/**" + nl); - sb.append(" * @this {" + cname + "}" + nl); - sb.append(" * @expose" + nl); - sb.append(" * @return {string}" + nl); - sb.append(" */" + nl); - sb.append(cname - + ".prototype.get_" + propertyName + " = function()" + nl); - sb.append("{" + nl); - - ASTNodeID nodeId = asnode.getNodeID(); - if (nodeId == ASTNodeID.FunctionID - || nodeId == ASTNodeID.GetterID - || nodeId == ASTNodeID.SetterID) + for (int i = 0; i < len; i++) { - IScopedNode snode = ((IFunctionNode) asnode).getScopedNode(); - - String body = asEmitter.stringifyNode(snode.getChild(0)); - String[] breakOnSpace = body.split(" "); - String[] breakOnMemberAccess = breakOnSpace[1].split("\\."); - - sb.append(ci); - sb.append(ASEmitterTokens.RETURN.getToken()); - sb.append(ASEmitterTokens.SPACE.getToken()); - sb.append(ASEmitterTokens.THIS.getToken()); - sb.append(ASEmitterTokens.MEMBER_ACCESS.getToken()); - sb.append(breakOnMemberAccess[0]); - sb.append(ASEmitterTokens.MEMBER_ACCESS.getToken()); - sb.append("get_"); - sb.append(breakOnMemberAccess[1]); - sb.append(ASEmitterTokens.PAREN_OPEN.getToken()); - sb.append(ASEmitterTokens.PAREN_CLOSE.getToken()); - sb.append(ASEmitterTokens.SEMICOLON.getToken()); - sb.append(nl); - } + sb = new StringBuilder(); + scriptSpecifier = new MXMLScriptSpecifier(); + + IASNode cnode = node.getChild(i); - sb.append("};" + nl); + docEmitter.setBufferWrite(true); + docEmitter.emitMethodDoc((IFunctionNode) cnode, getMXMLWalker() + .getProject()); + sb.append(docEmitter.flushBuffer()); + + sb.append(asEmitter.stringifyNode(cnode)); + + if (i == len - 1) + indentPop(); - scriptSpecifier.fragment = sb.toString(); + sb.append(nl); - scripts.add(scriptSpecifier); + scriptSpecifier.fragment = sb.toString(); + + scripts.add(scriptSpecifier); + } } } http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/797b7c81/compiler.jx/src/org/apache/flex/compiler/internal/driver/mxml/flexjs/MXMLFlexJSBackend.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/driver/mxml/flexjs/MXMLFlexJSBackend.java b/compiler.jx/src/org/apache/flex/compiler/internal/driver/mxml/flexjs/MXMLFlexJSBackend.java index c8e396a..4233931 100644 --- a/compiler.jx/src/org/apache/flex/compiler/internal/driver/mxml/flexjs/MXMLFlexJSBackend.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/driver/mxml/flexjs/MXMLFlexJSBackend.java @@ -22,12 +22,15 @@ package org.apache.flex.compiler.internal.driver.mxml.flexjs; import java.io.FilterWriter; import java.util.List; +import org.apache.flex.compiler.codegen.IDocEmitter; import org.apache.flex.compiler.codegen.as.IASEmitter; +import org.apache.flex.compiler.codegen.js.IJSEmitter; import org.apache.flex.compiler.codegen.js.IJSWriter; import org.apache.flex.compiler.codegen.mxml.IMXMLEmitter; import org.apache.flex.compiler.config.Configurator; import org.apache.flex.compiler.driver.IBackend; -import org.apache.flex.compiler.internal.codegen.as.ASEmitter; +import org.apache.flex.compiler.internal.codegen.js.flexjs.JSFlexJSEmitter; +import org.apache.flex.compiler.internal.codegen.js.goog.JSGoogDocEmitter; import org.apache.flex.compiler.internal.codegen.mxml.MXMLBlockWalker; import org.apache.flex.compiler.internal.codegen.mxml.MXMLWriter; import org.apache.flex.compiler.internal.codegen.mxml.flexjs.MXMLFlexJSBlockWalker; @@ -84,12 +87,20 @@ public class MXMLFlexJSBackend extends MXMLBackend } @Override - public IASEmitter createEmitter(FilterWriter out) + public IDocEmitter createDocEmitter(IASEmitter emitter) { - return new ASEmitter(out); + return new JSGoogDocEmitter((IJSEmitter) emitter); } @Override + public IJSEmitter createEmitter(FilterWriter out) + { + IJSEmitter emitter = new JSFlexJSEmitter(out); + emitter.setDocEmitter(createDocEmitter(emitter)); + return emitter; + } + + @Override public IJSWriter createWriter(IASProject project, List<ICompilerProblem> problems, ICompilationUnit compilationUnit, boolean enableDebug)
