Just to explain what I did, especially to folks who would like to get their hand dirty on the compiler but like me, don't know how it works :-)
I was adding jasmine-2.0.js [1], a file that contains only jsDoc (parameters and return type descriptions) and declarations, no implementations. When I say "adding jasmine-2.0.js" I mean, transpile this .js file to .as and then compile it to a .swc. The transpilation part is done by EXTERNC You call it like that: <java jar="${basedir}/compiler.jx/lib/externc.jar" fork="true" failonerror="false"> <arg value="+flexlib=${env.ASJS_HOME}/frameworks" /> <arg value="-debug" /> <arg value="-load-config=${basedir}/externs/jasmine/jasmine-compile-config.xml" /> In the jasmine-compile-config.xml, you can exclude classes and member, for example, in the jasmine.Spec class, I excluded the variable $injector as its type was coming from the Angular library that is not yet transpiled. <field-exclude> <class>jasmine.Spec</class> <field>$injector</field> </field-exclude> You can also exclude classes and functions. The compile part is done by the falcon compc as follow: <java jar="${basedir}/compiler/generated/dist/sdk/lib/falcon-compc.jar" fork="true" failonerror="true"> <arg value="+flexlib=${env.ASJS_HOME}/frameworks" /> <arg value="-debug" /> <arg value="-load-config=${basedir}/externs/jasmine/compile-config.xml" /> <arg value="-output=${basedir}/externs/jasmine/out/bin/jasmine-2.0.swc" /> </java> The problem was that this last part was failing with an NPE a Type of something: org.apache.flex.compiler.internal.scopes.TypeScope.getPropertyForMemberAccess(TypeScope.java:344) Even looking closely at the code, I didn't get why it was failing but for sure, because it was trying to compile one of the transpiled .as file, this transpiled code was wrong. Looking at those .as, it was easy to see that some import were missing. So, why the 2 others externs (js and jquery) had no issues ? It is always surprising to see something working on all the things except of yours, but it can help you too :-) So, I've been looking at those other transpiled .as files from existing externs to see if they had imports and they were some. I then created a mini jasmine.js containing only the faulty case only, that, from what I've been able to determinate, was that the import was not generated when a static function had a return type of a class created via a function constructor, so, I filled this mini jasmine.js with the equivalent of a static function like this: /** * @return {!jasmine.Clock} */ jasmine.clock = function() {}; Which should transpile in AS3, something like: import jasmine.Clock; public static function clock():Clock {} and a function constructor like this: /** @constructor */ jasmine.Clock = function() {}; which transpile: package jasmine { public class Clock {} } Created a test class based on those Mike created for the previous externs doing: // jasmine, the main jasmine class. ClassReference jasmine = model.getClassReference("jasmine"); assertNotNull(jasmine); assertTrue(jasmine.hasImport("jasmine.Clock")); The hasImport method didn't exist on ClassReference but it was a addImport(), I follow to where it was called in ResolvePackagesPass hoping to find a missing case but after debug spin I wasn't able to do what I expected, I'm not sure I understood all the logic in this class but it looked like the Node of my return type was never visited and therefore wasn't able to add my import here. But wait, in the ClassReference, I have a public MethodReference addMethod(Node node, String functionName, JSDocInfo comment, boolean isStatic) To me it would be enough to add the import to the list of imports to be emitted when the MethodReference is to be added, I just had to determinate if the return type given in the jsDoc was not from the current package, the given method not excluded, the given return type neither ! My test was passing was I was able to compile with this new code the old externs. The only thing I had to do to finish to compile the jasmine extern was to emit the imports for the global functions too as they shown to be faulty for the same reasons. Mike will probably tell me now where my logic was wrong now :-) Frédéric THOMAS ---------------------------------------- > From: webdoubl...@hotmail.com > To: dev@flex.apache.org > Subject: RE: [Externs] jasmine-2.0.js > Date: Sat, 27 Jun 2015 20:43:43 +0100 > > Ok, done ! > > I forgot to uncomment the externc build of jasmine and print the global > function imports ! > > Frédéric THOMAS > > > ---------------------------------------- >> From: webdoubl...@hotmail.com >> To: dev@flex.apache.org >> Subject: RE: [Externs] jasmine-2.0.js >> Date: Sat, 27 Jun 2015 20:12:16 +0100 >> >>> I pushed the changes which are ready to be reviewed. >> >> oups, hold on, I had some things commented that hidden other problems, I >> will continue on it. >> >> Frédéric THOMAS >> >> >> ---------------------------------------- >>> From: webdoubl...@hotmail.com >>> To: dev@flex.apache.org >>> Subject: RE: [Externs] jasmine-2.0.js >>> Date: Sat, 27 Jun 2015 18:31:32 +0100 >>> >>> Hi Mike, >>> >>> I pushed the changes which are ready to be reviewed. >>> >>> Note: The jasmine-2.0.js is not committed as it should be downloaded with >>> the unpack-externs target of the download.xml, I followed the model. >>> >>> Thanks, >>> Frédéric THOMAS >>> >>> >>> ---------------------------------------- >>>> Date: Sat, 27 Jun 2015 05:31:50 -0400 >>>> Subject: Re: [Externs] jasmine-2.0.js >>>> From: teotigraphix...@gmail.com >>>> To: dev@flex.apache.org >>>> >>>> I just noticed you said today or tomorrow, whatever man. doesn't matter. >>>> >>>> Mike >>>> >>>> On Sat, Jun 27, 2015 at 5:17 AM, Michael Schmalle >>>> <teotigraphix...@gmail.com >>>>> wrote: >>>> >>>>> Well its the practice. I know the pattern I am using so if I have to >>>>> adjust it to fit I will. You can tell that with AST type stuff, it has to >>>>> follow a specific pattern or everything turns to crap when trying to add >>>>> stuff down the road. >>>>> >>>>> Commit it sooner than later as I have a couple hours to check it out this >>>>> morning. >>>>> >>>>> Mike >>>>> >>>>> On Sat, Jun 27, 2015 at 3:15 AM, Frédéric THOMAS <webdoubl...@hotmail.com> >>>>> wrote: >>>>> >>>>>> Hi Mike, >>>>>> >>>>>> I can now compile jasmine, I'm not sure my fix is very clean but it >>>>>> works, I've been able to compile all the externs with. >>>>>> I will commit it later today or tomorrow as I need to clean a bit before >>>>>> and it would be nice if you can review it. >>>>>> >>>>>> Thanks, >>>>>> Frédéric THOMAS >>>>>> >>>>>> >>>>>> ---------------------------------------- >>>>>>> From: webdoubl...@hotmail.com >>>>>>> To: dev@flex.apache.org >>>>>>> Subject: RE: [Externs] jasmine-2.0.js >>>>>>> Date: Fri, 26 Jun 2015 22:43:30 +0100 >>>>>>> >>>>>>> Hey Mike, it looks like "import jasmine.Clock;" is missing in the >>>>>> generated jasmine.as, that's it ! >>>>>>> >>>>>>> Frédéric THOMAS >>>>>>> >>>>>>> >>>>>>> ---------------------------------------- >>>>>>>> From: webdoubl...@hotmail.com >>>>>>>> To: dev@flex.apache.org >>>>>>>> Subject: RE: [Externs] jasmine-2.0.js >>>>>>>> Date: Fri, 26 Jun 2015 22:26:32 +0100 >>>>>>>> >>>>>>>>> HAHA, ah that is a hard one man, thanks for the offer but I think I am >>>>>>>>> going to need to get this one. There are a couple places it could be >>>>>> though >>>>>>>>> if you are curious. >>>>>>>>> >>>>>>>>> First you really need to understand the problem, I am typing this >>>>>> stuff in >>>>>>>>> between installing a bathroom vanity and sink, so I haven't looked at >>>>>> the >>>>>>>>> code yet. :) >>>>>>>>> >>>>>>>>> So I can't really give you an answer since I don't quite know the >>>>>> problem >>>>>>>>> yet. >>>>>>>> >>>>>>>> Ok, I will check your solution :-) >>>>>>>> >>>>>>>> Frédéric THOMAS >>>>>>>> >>>>>>>> >>>>>>>> ---------------------------------------- >>>>>>>>> Date: Fri, 26 Jun 2015 16:59:58 -0400 >>>>>>>>> Subject: Re: [Externs] jasmine-2.0.js >>>>>>>>> From: teotigraphix...@gmail.com >>>>>>>>> To: dev@flex.apache.org >>>>>>>>> >>>>>>>>> On Fri, Jun 26, 2015 at 4:39 PM, Frédéric THOMAS < >>>>>> webdoubl...@hotmail.com> >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>>>> Yeah, this "jasmine.Clock" >>>>>>>>>>> >>>>>>>>>>> The error means that the Falcon compiler is trying to resolve a >>>>>> member >>>>>>>>>>> expression and it can't resolve it. >>>>>>>>>>> >>>>>>>>>>> So this means there is a bug in the AST resolver. You are using the >>>>>>>>>> extern >>>>>>>>>>> in the GCC project correct? >>>>>>>>>> >>>>>>>>>> Yes, >>>>>>>>>> >>>>>> https://raw.githubusercontent.com/google/closure-compiler/master/contrib/externs/jasmine-2.0.js >>>>>>>>>> >>>>>>>>>>> If so, I need to take a look at it. >>>>>>>>>>> >>>>>>>>>>> Everyone, I did one pass and tests on packages and class creation, >>>>>> so >>>>>>>>>> these >>>>>>>>>>> types of bugs are to be expected as the AST/Type resolver is >>>>>> "asked" to >>>>>>>>>> do >>>>>>>>>>> more work then my initial implementation. >>>>>>>>>>> >>>>>>>>>>> Make sense? >>>>>>>>>> >>>>>>>>>> Well, kind of :-) >>>>>>>>>> What classes would you check for this ? >>>>>>>>>> >>>>>>>>> >>>>>>>>> HAHA, ah that is a hard one man, thanks for the offer but I think I am >>>>>>>>> going to need to get this one. There are a couple places it could be >>>>>> though >>>>>>>>> if you are curious. >>>>>>>>> >>>>>>>>> First you really need to understand the problem, I am typing this >>>>>> stuff in >>>>>>>>> between installing a bathroom vanity and sink, so I haven't looked at >>>>>> the >>>>>>>>> code yet. :) >>>>>>>>> >>>>>>>>> So I can't really give you an answer since I don't quite know the >>>>>> problem >>>>>>>>> yet. >>>>>>>>> >>>>>>>>> Mike >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>>> >>>>>>>>>> Thanks, >>>>>>>>>> Frédéric THOMAS >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> ---------------------------------------- >>>>>>>>>>> Date: Fri, 26 Jun 2015 16:32:16 -0400 >>>>>>>>>>> Subject: Re: [Externs] jasmine-2.0.js >>>>>>>>>>> From: teotigraphix...@gmail.com >>>>>>>>>>> To: dev@flex.apache.org >>>>>>>>>>> >>>>>>>>>>> Yeah, this "jasmine.Clock" >>>>>>>>>>> >>>>>>>>>>> The error means that the Falcon compiler is trying to resolve a >>>>>> member >>>>>>>>>>> expression and it can't resolve it. >>>>>>>>>>> >>>>>>>>>>> So this means there is a bug in the AST resolver. You are using the >>>>>>>>>> extern >>>>>>>>>>> in the GCC project correct? >>>>>>>>>>> >>>>>>>>>>> If so, I need to take a look at it. >>>>>>>>>>> >>>>>>>>>>> Everyone, I did one pass and tests on packages and class creation, >>>>>> so >>>>>>>>>> these >>>>>>>>>>> types of bugs are to be expected as the AST/Type resolver is >>>>>> "asked" to >>>>>>>>>> do >>>>>>>>>>> more work then my initial implementation. >>>>>>>>>>> >>>>>>>>>>> Make sense? >>>>>>>>>>> >>>>>>>>>>> Mike >>>>>>>>>>> >>>>>>>>>>> On Fri, Jun 26, 2015 at 3:27 PM, Frédéric THOMAS < >>>>>>>>>> webdoubl...@hotmail.com> >>>>>>>>>>> wrote: >>>>>>>>>>> >>>>>>>>>>>> Hi Mike, >>>>>>>>>>>> >>>>>>>>>>>> Any idea why ? >>>>>>>>>>>> >>>>>>>>>>>> U:\sources\asf\flex\falcon\externs\jasmine\out\as\classes\ >>>>>> jasmine.as:26 >>>>>>>>>>>> Erreur interne : java.lang.NullPointerException >>>>>>>>>>>> at >>>>>>>>>>>> >>>>>>>>>> >>>>>> org.apache.flex.compiler.internal.scopes.TypeScope.getPropertyForMemberAccess(TypeScope.java:344) >>>>>>>>>>>> at >>>>>>>>>>>> >>>>>>>>>> >>>>>> org.apache.flex.compiler.internal.scopes.ScopeView.getPropertyForMemberAccess(ScopeView.java:81) >>>>>>>>>>>> at >>>>>>>>>>>> >>>>>>>>>> >>>>>> org.apache.flex.compiler.internal.scopes.ASScope.getPropertyFromDef(ASScope.java:879) >>>>>>>>>>>> at >>>>>>>>>>>> >>>>>>>>>> >>>>>> org.apache.flex.compiler.internal.scopes.ASScope.getPropertyFromDef(ASScope.java:841) >>>>>>>>>>>> at >>>>>>>>>>>> >>>>>>>>>> >>>>>> org.apache.flex.compiler.internal.scopes.ASScope.getPropertyFromDef(ASScope.java:760) >>>>>>>>>>>> at >>>>>>>>>>>> >>>>>>>>>> >>>>>> org.apache.flex.compiler.internal.tree.as.IdentifierNode.resolveMemberRef(IdentifierNode.java:829) >>>>>>>>>>>> at >>>>>>>>>>>> >>>>>>>>>> >>>>>> org.apache.flex.compiler.internal.tree.as.IdentifierNode.resolve(IdentifierNode.java:377) >>>>>>>>>>>> at >>>>>>>>>>>> >>>>>>>>>> >>>>>> org.apache.flex.compiler.internal.tree.as.IdentifierNode.getMName(IdentifierNode.java:432) >>>>>>>>>>>> at >>>>>>>>>>>> >>>>>>>>>> >>>>>> org.apache.flex.compiler.internal.tree.as.MemberAccessExpressionNode.getMName(MemberAccessExpressionNode.java:158) >>>>>>>>>>>> at >>>>>>>>>>>> >>>>>>>>>> >>>>>> org.apache.flex.compiler.internal.as.codegen.ABCGeneratingReducer.dottedName(ABCGeneratingReducer.java:840) >>>>>>>>>>>> at >>>>>>>>>>>> >>>>>>>>>> >>>>>> org.apache.flex.compiler.internal.as.codegen.CmcEmitter.action_321(CmcEmitter.java:5236) >>>>>>>>>>>> ... >>>>>>>>>>>> >>>>>>>>>>>> public static function clock():jasmine.Clock { return null; } >>>>>>>>>>>> ^ >>>>>>>>>>>> >>>>>>>>>>>> ----------------------------- >>>>>>>>>>>> In the jasmine extern file >>>>>>>>>>>> ----------------------------- >>>>>>>>>>>> >>>>>>>>>>>> /** >>>>>>>>>>>> * @return {!jasmine.Clock} >>>>>>>>>>>> */ >>>>>>>>>>>> jasmine.clock = function() {}; >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> /** @constructor */ >>>>>>>>>>>> jasmine.Clock = function() {}; >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> /** */ >>>>>>>>>>>> jasmine.Clock.prototype.install = function() {}; >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> /** */ >>>>>>>>>>>> jasmine.Clock.prototype.uninstall = function() {}; >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> /** @param {number} ms */ >>>>>>>>>>>> jasmine.Clock.prototype.tick = function(ms) {}; >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> /** @param {!Date} date */ >>>>>>>>>>>> jasmine.Clock.prototype.mockDate = function(date) {}; >>>>>>>>>>>> >>>>>>>>>>>> ----------------------------- >>>>>>>>>>>> In jasmine.as >>>>>>>>>>>> ----------------------------- >>>>>>>>>>>> >>>>>>>>>>>> /** >>>>>>>>>>>> * @see [jasmine-2.0] >>>>>>>>>>>> * @returns {jasmine.Clock} >>>>>>>>>>>> */ >>>>>>>>>>>> public static function clock():jasmine.Clock { return null; } >>>>>>>>>>>> >>>>>>>>>>>> ----------------------------- >>>>>>>>>>>> clock.as >>>>>>>>>>>> ----------------------------- >>>>>>>>>>>> package jasmine { >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> /** >>>>>>>>>>>> * @see [jasmine-2.0] >>>>>>>>>>>> */ >>>>>>>>>>>> public class Clock { >>>>>>>>>>>> >>>>>>>>>>>> /** >>>>>>>>>>>> * @see [jasmine-2.0] >>>>>>>>>>>> */ >>>>>>>>>>>> public function Clock() { >>>>>>>>>>>> super(); >>>>>>>>>>>> } >>>>>>>>>>>> >>>>>>>>>>>> /** >>>>>>>>>>>> * Generated doc for missing method JSDoc. >>>>>>>>>>>> * >>>>>>>>>>>> * @see [jasmine-2.0] >>>>>>>>>>>> */ >>>>>>>>>>>> public function install():void { } >>>>>>>>>>>> >>>>>>>>>>>> /** >>>>>>>>>>>> * @param ms [number] >>>>>>>>>>>> * @see [jasmine-2.0] >>>>>>>>>>>> */ >>>>>>>>>>>> public function tick(ms:Number):void { } >>>>>>>>>>>> >>>>>>>>>>>> /** >>>>>>>>>>>> * Generated doc for missing method JSDoc. >>>>>>>>>>>> * >>>>>>>>>>>> * @see [jasmine-2.0] >>>>>>>>>>>> */ >>>>>>>>>>>> public function uninstall():void { } >>>>>>>>>>>> >>>>>>>>>>>> /** >>>>>>>>>>>> * @param date [Date] >>>>>>>>>>>> * @see [jasmine-2.0] >>>>>>>>>>>> */ >>>>>>>>>>>> public function mockDate(date:Date):void { } >>>>>>>>>>>> >>>>>>>>>>>> } >>>>>>>>>>>> } >>>>>>>>>>>> >>>>>>>>>>>> Thanks, >>>>>>>>>>>> Frédéric THOMAS >>>>>>>>>> >>>>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>>> >>>>> >>>>> >>> >> >