incubator-flex-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Michael Schmalle <apa...@teotigraphix.com>
Subject [FlaconJS] pseudo emitter algorithm
Date Thu, 29 Nov 2012 15:30:12 GMT
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





-- 
Michael Schmalle - Teoti Graphix, LLC
http://www.teotigraphix.com
http://blog.teotigraphix.com


Mime
View raw message