> All I meant is that 75% of the time we would just want to save things in > the model or a reference, such that you use addImport() during the > resolution. Then it keeps the emit() phase straight burn rubber and loop > through all existing model structures, where imports would be just a list > that emitImport() iterates through, no logic.
Got it ! > I AM NOT saying what you did was wrong, I am just offering a look into how > I set it up. You know how I got this pattern? From my massive mistakes in > code generators of past. :) I realized that an emit phase needs to be > stupid and not dependent on any type of intelligence, just needs to create > what already exists. I'm in a phase where I'm learning compiler things and indeed I will do some mistakes or I won't be as precise as you who have experience on it. Therefore I can accept critics and learn from your explanations :-) > This can also solve many problems at once. So I haven't got back into the > code BUT my intuition says we need a universal solution for any type of > TYPE that is attached to a member, identifier such as a param type, return > type, filed type, superclass and interface(already taken care of using > addImport()). > > See where I am coming from? We know that every type is eventually going to > need to be scanned for imports and validated. Yes, actually, I was expecting to see a specific pass for that. > Dude, I just don't want to come off bossy or condescending, I love you > help. A lot can be added to this compiler that could be very interesting. > So having you understand my design intention is really important to me. :) Don't worry, I don't think you are bossy or condescending Mike, I'm reading you and try to put in parallel the new informations you give and what I've seen in the code for a better understanding, that's it. Cheers, Frédéric THOMAS ---------------------------------------- > Date: Sun, 28 Jun 2015 13:48:02 -0400 > Subject: Re: [Externs] jasmine-2.0.js > From: teotigraphix...@gmail.com > To: dev@flex.apache.org > > Fred you did an awesome job. :) > > All I meant is that 75% of the time we would just want to save things in > the model or a reference, such that you use addImport() during the > resolution. Then it keeps the emit() phase straight burn rubber and loop > through all existing model structures, where imports would be just a list > that emitImport() iterates through, no logic. > > I AM NOT saying what you did was wrong, I am just offering a look into how > I set it up. You know how I got this pattern? From my massive mistakes in > code generators of past. :) I realized that an emit phase needs to be > stupid and not dependent on any type of intelligence, just needs to create > what already exists. > > This can also solve many problems at once. So I haven't got back into the > code BUT my intuition says we need a universal solution for any type of > TYPE that is attached to a member, identifier such as a param type, return > type, filed type, superclass and interface(already taken care of using > addImport()). > > See where I am coming from? We know that every type is eventually going to > need to be scanned for imports and validated. > > Dude, I just don't want to come off bossy or condescending, I love you > help. A lot can be added to this compiler that could be very interesting. > So having you understand my design intention is really important to me. :) > > Mike > > > > > On Sun, Jun 28, 2015 at 1:37 PM, Frédéric THOMAS <webdoubl...@hotmail.com> > wrote: > >>> Fred pretty much iterated things correctly. >>> >>> The ResolvePackageNamePass I haven't to get back to. I was in the middle >> of >>> implementing something when I got it to work in another place. >>> >>> There is a pattern to how things are parsed so most of the time it's >> better >>> to set state as nodes/references are being added to the model. In the >> case >>> of imports, I don't see any problems right now with checking during the >>> emit phase but, if the model was more interactive during the session, >> this >>> type of logic should happen during the resolve phase so the model with >> it's >>> references has a correct state if there is any logic happening between >> two >>> references. >> >> Thanks for the explanation, I will take the time to do some debug spins to >> understand >> when the phases are called, what they do and what classes are involved. >> Given it is a fairly small transpiler and despite the recursive visitor >> pattern, I guess I can do it. >> >>> How much are you working on right now Fred? I just ask because I don't >> want >>> to create any conflicts. >> >> Go ahead Mike, I'm done with that at the moment, I did my last cleanup >> already. >> Anyway, better I work on a branch and commit the branch instead for review >> next time. >> >> Frédéric THOMAS >> >> >> ---------------------------------------- >>> Date: Sun, 28 Jun 2015 13:23:15 -0400 >>> Subject: Re: [Externs] jasmine-2.0.js >>> From: teotigraphix...@gmail.com >>> To: dev@flex.apache.org >>> >>> Fred pretty much iterated things correctly. >>> >>> The ResolvePackageNamePass I haven't to get back to. I was in the middle >> of >>> implementing something when I got it to work in another place. >>> >>> There is a pattern to how things are parsed so most of the time it's >> better >>> to set state as nodes/references are being added to the model. In the >> case >>> of imports, I don't see any problems right now with checking during the >>> emit phase but, if the model was more interactive during the session, >> this >>> type of logic should happen during the resolve phase so the model with >> it's >>> references has a correct state if there is any logic happening between >> two >>> references. >>> >>> How much are you working on right now Fred? I just ask because I don't >> want >>> to create any conflicts. >>> >>> Mike >>> . >>> >>> On Sat, Jun 27, 2015 at 5:58 PM, Michael Schmalle < >> teotigraphix...@gmail.com >>>> wrote: >>> >>>> 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 >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>>>> >>>> >>>> >> >>