Thanks for detailed explanation Mike!
Everything below that, is actually clear without getting into details of recursive methods itself.


On 11/29/2012 3:30 PM, Michael Schmalle 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






Reply via email to