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