You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@flex.apache.org by Frédéric THOMAS <we...@hotmail.com> on 2015/06/28 00:11:23 UTC

Re : Re: [Externs] jasmine-2.0.js

I'm out right now but will read ASAP

--- Message initial ---

De : "Michael Schmalle" <te...@gmail.com>
Envoyé : 27 juin 2015 22:59
A : dev@flex.apache.org
Objet : Re: [Externs] jasmine-2.0.js

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 <we...@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: webdoublefx@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: webdoublefx@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: webdoublefx@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: teotigraphixllc@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 <
> teotigraphixllc@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 <
> webdoublefx@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: webdoublefx@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: webdoublefx@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: teotigraphixllc@gmail.com
> >>>>>>>>> To: dev@flex.apache.org
> >>>>>>>>>
> >>>>>>>>> On Fri, Jun 26, 2015 at 4:39 PM, Frédéric THOMAS <
> >>>>>> webdoublefx@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: teotigraphixllc@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 <
> >>>>>>>>>> webdoublefx@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
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>
> >>>>>>>
> >>>>>>
> >>>>>>
> >>>>>
> >>>>>
> >>>
> >>
> >
>
>