OK, I think I get it now. Sounds like it is worth exploring.
On 11/29/12 10:02 AM, "Michael Schmalle" <apa...@teotigraphix.com> wrote: > Quoting Alex Harui <aha...@adobe.com>: > >> So if I understand you, the notion of traits is a SWF thing? The AST has >> different representations maybe like member, variable, function? > > Well yes and no. > > Traits IS an SWF thing. The AST is represented by like IClassNode, > IPackageNode etc. > > Than we have an even more fun framework in the IDefinition like > IClassDefinition which basically wraps the INode ast. > > We also have the IScopeNode which then blocks our code into the scope chunks. > > If we eliminate the SWF traits stuff and use IASNode or IDefinition > API we would be solid and developers could easily get involved down > the road. > > PS i know there might be things I am over looking but Jangroo uses > this method, we just have to have some analyzers and such I would > imagine. > > Theoretically using the IDefinition interfaces I could create that > same MainCode.js output, which I am going to try and to. > > The IDefinition API is were you get your supers, resolving classes, > getting super class members etc. > > Mike > > > >> >> On 11/29/12 9:42 AM, "Michael Schmalle" <apa...@teotigraphix.com> wrote: >> >>> Quoting Alex Harui <aha...@adobe.com>: >>> >>>> Very nice. Have you figured out the role of the generated CMCEmitter in >>>> this process? >>> >>> Yes, >>> >>> The CmcJSEmitter (autogenerated by cmc-js.jbg) is used to traverse the >>> ISWF that is created. >>> >>> The CmcJSEmitter and JSGeneratingReducer are created in the >>> JSGenerator constructor. >>> >>> The actual CmcJSEmitter is used during the >>> JSClassDirectiveProcessor.delcareVariable() etc. methods. >>> >>> Basically the processor is using the emitter to create SWF >>> instructions that ultimately end up creating class traits. Once the >>> tratis are created, they just keep getting recursively visited and >>> more instructions created. >>> >>> So it's like >>> >>> - JSCompilationUnit.processABCBytesRequest() >>> - handleABCBytesRequest() >>> - JSGenerator.generate() >>> - then see below .... >>> >>> When it gets to methods called declarePackage() for instance, block >>> code instructions are created using the cmc emitter. Traits are then >>> created based of them. >>> >>> For FalconJS this process is totally bound to SWF format. >>> >>> This was my point. For any developer to fix bugs here they have to >>> know the SWF format. Which I don't. >>> >>> This is why I propsed another solution using pure AST like Jangaroo does. >>> >>> I am not skilled enough to understand the trade offs currently. But I >>> am going to try and see if I can create the same JS code using a >>> different algorithm. >>> >>> Mike >>> >>> >>> >>>> >>>> On 11/29/12 7:30 AM, "Michael Schmalle" <apa...@teotigraphix.com> wrote: >>>> >>>>> Hi, >>>>> >>>>> For those asking question about "where to alter" code, it's not pretty >>>>> but I think I know exactly what is going on now. >>>>> >>>>> If you can understand below, you will now have some insight to where >>>>> and how the JS code actually gets created. >>>>> >>>>> >>>>> ! Call the compiler load config compile(). >>>>> >>>>> >>>>> JSGenerator.generate() - creates the package, class, member traits >>>>> >>>>> - DirectiveProcessor.processNode(IFileNode) >>>>> - recusrsivly fill traits >>>>> >>>>> ----------------------------------------------------- >>>>> >>>>> Basically a snippet of the recursion; >>>>> >>>>> DirectiveProcessor.processNode(IFileNode) >>>>> - declarePackage(PackageNode) >>>>> - emitter.visitPackage(packageName) >>>>> - data.registerPackage(packageName) >>>>> - super.declarePackage(PackageNode) >>>>> - DirectiveProcessor.traverse(p.getScopedNode()) <- >>>>> ClassNode (class >>>>> {}) >>>>> - for each ClassNode.getChild(i) >>>>> - processNode(ScopedBlockNode) >>>>> - JSGlobalDirectiveProcessor.declareClass(ClassNode) >>>>> - verifyClassModifiers(ClassNode) >>>>> - skins >>>>> - JSClassDirectiveProcessor cp = >>>>> backend.createClassDirectiveProcessor() >>>>> - cp.traverse(ClassNode.getScopedNode()) <- TypeScope >>>>> - for each TypeScope.getChild(i) >>>>> - processNode(TypeScope) >>>>> - >>>>> JSGlobalDirectiveProcessor.declareFunction(FunctionNode) >>>>> >>>>> >>>>> -------------------------------------------------------- >>>>> >>>>> !!!! >>>>> JavaScript source code creation after class traits have been traversed >>>>> and created; >>>>> >>>>> >>>>> JSEmiter.emit() >>>>> - emitClass(EmitterClassVisitor) >>>>> - IClassDefinition = getDefinition(ii.name) >>>>> - write class JSDoc >>>>> >>>>> >>>>> >>>>> - JSEmitter.emitClass() >>>>> - Line: 3267 - 3269 is What creates a class >>>>> - "MainCode=adobe.extend("MainCode",Object,{ ... });" >>>>> >>>>> >>>>> >>>>> - JSEmitter.emitInstanceTraits() is then called to write out the >>>>> class traits >>>>> - emitTraits() is then called to do the specific if the closure >>>>> compiler flag is not set >>>>> 1. emitCtor() emit constructor >>>>> - emit comma >>>>> 2. emit all variables before methods >>>>> - assembles the code "MainCode.foo" >>>>> - warns if there is a private namespace collision >>>>> - >>>>> 3. emit all methods other than constructor >>>>> - emit ",\n" >>>>> - emitMethod() >>>>> - emitJSDocForMethod() >>>>> - write("\tget_baz") >>>>> - write(" : ") <- assignmentOp >>>>> - write("function(") >>>>> - emitParameters(methodInfo) >>>>> - write("baz") >>>>> - write(")") >>>>> - if (returnType != null) >>>>> - write(JSDoc for return type) >>>>> - if interface method >>>>> - write(" {};\n") >>>>> - else >>>>> - write("\n") >>>>> - write(" {") >>>>> - write("\n") >>>>> - emitMethodBody() >>>>> ... you get the drift >>>>> - write(" }") >>>>> >>>>> - After all traits are written, control flow goes back to >>>>> JSEmitter.emitClass() line 3269 >>>>> - write("\n});\n\n") // end class >>>>> - add _CLASS member to instance >>>>> - add JSDoc for prototype._CLASS >>>>> - write("MainCode.prototype._CLASS = MainCode;\n") >>>>> >>>>> It will then go onto >>>>> - emitClassInfo() >>>>> - emitNamespaceInfo() >>>>> - emitJSONInfo() >>>>> >>>>> if (JSSharedData.JS_FRAMEWORK_NAME) >>>>> - emitFrameworkInit(); >>>>> >>>>> It will then finally emit register class >>>>> - "adobe.classes.MainCode=MainCode;" >>>>> >>>>> --------------- >>>>> MainCode._PACKAGE=adobe.globals;MainCode._NAME="MainCode"; >>>>> MainCode._FULLNAME="MainCode"; >>>>> MainCode._SUPER=Object; >>>>> MainCode._NAMESPACES={"foo::2":!0,"bar::7:MainCode":!0,"baz::2":!0,"baz::2 >>>>> ": >>>>> !0 >>>>> }; >>>>> adobe.classes.MainCode=MainCode; >>>>> --------------- >>>>> >>>>> Mike >>>>> >>>>> >>>>> >>>>> >>>> >>>> -- >>>> Alex Harui >>>> Flex SDK Team >>>> Adobe Systems, Inc. >>>> http://blogs.adobe.com/aharui >>>> >>>> >> >> -- >> Alex Harui >> Flex SDK Team >> Adobe Systems, Inc. >> http://blogs.adobe.com/aharui >> >> -- Alex Harui Flex SDK Team Adobe Systems, Inc. http://blogs.adobe.com/aharui