Hey Fred, I was out all day. I will have some time in the morning to look at what you did and comment. :)
Mike On Sat, Jun 27, 2015 at 5:27 PM, Frédéric THOMAS <webdoubl...@hotmail.com> wrote: > 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 > >>>>>>>>>> > >>>>>>>>>> > >>>>>>>> > >>>>>>> > >>>>>> > >>>>>> > >>>>> > >>>>> > >>> > >> > > > >