mmm, makes sense. That's worth a try! 2015-09-22 14:04 GMT+02:00 Jamie Echlin <jamie.ech...@gmail.com>:
> > The question is what you would use that information for > > So, basically, users provide a script in the UI, the value that it > returned is indexed (in Lucene) by one of several various indexers that is > configured elsewhere. You use JIRA, so you know what I'm talking about... > it's JIRA. > > Only certain return types make sense depending on the configured indexer. > > Let's say I'm using the indexer that requires a Double. It occurs to me > (actually my colleague) that the script could implicitly extend some other > class than Script, eg: > > class DoubleScript { > abstract Double run() > } > > This could be set on the compilerconfiguration. > > I think if we do that the type-checker would point out the errors in the > following script: > > if (xyz()) { > > 111D > > } > > else { > > "sss" > > } > > > which would solve the problem. Sounds sensible? > cheers, jamie > > > > On Tue, Sep 22, 2015 at 10:39 AM, Cédric Champeau < > cedric.champ...@gmail.com> wrote: > >> Not necessarily. The question is what you would use that information for. >> >> 2015-09-22 11:36 GMT+02:00 Jamie Echlin <jamie.ech...@gmail.com>: >> >>> No, I guess so. So it sounds like you're saying I should forget it and >>> move on to the next thing? I.e. it's not feasible to get at this in a >>> static analysis context? >>> >>> On Tue, Sep 22, 2015 at 10:24 AM, Cédric Champeau < >>> cedric.champ...@gmail.com> wrote: >>> >>>> Just for context and history, early versions of the type checker had >>>> return type inference for methods too. However, we removed it for a good >>>> reason: overrides. A method "foo" in class A can have an inferred type T, >>>> but "foo" from B extends A could very well have a different inferred type >>>> T2. So you can make no guarantee, at least for non private methods. >>>> >>>> >>>> 2015-09-22 11:19 GMT+02:00 Jamie Echlin <jamie.ech...@gmail.com>: >>>> >>>>> Hi Shil, >>>>> >>>>> I did that actually, but it tells me the return type of the run method >>>>> of Script is Object. Which is expected, if it's just looking at the actual >>>>> method signature. >>>>> >>>>> But what I was hoping for is that given a script: >>>>> "new Double(2)" >>>>> >>>>> it would be able to infer the actual return type is a Double. Now, I >>>>> can imagine scripts where you randomly pick from any class on the >>>>> classpath, invoke a no-args constructor, and return that... in that case I >>>>> don't expect magic. But most scripts have one or two possible return >>>>> statements (maybe implicit), I'm wondering if there is already code that >>>>> can statically analyse a method/script and say that there are only one, >>>>> two >>>>> or whatever possible return types. >>>>> >>>>> I'll take a look at ReturnAdder, thanks for that. >>>>> >>>>> cheers, jamie >>>>> >>>>> >>>>> On Mon, Sep 21, 2015 at 11:55 PM, Shil Sinha <shil.si...@gmail.com> >>>>> wrote: >>>>> >>>>>> Actually, the second option can be made safe by initializing >>>>>> ReturnAdder with a listener, which will allow you to 'visit' all implicit >>>>>> returns without actually adding return statements. >>>>>> >>>>>> On Mon, Sep 21, 2015 at 5:30 PM, Shil Sinha <shil.si...@gmail.com> >>>>>> wrote: >>>>>> >>>>>>> You could call 'getInferredReturnType' on the 'run' method node of >>>>>>> your script class, but inferred return types only appear to be stored >>>>>>> for >>>>>>> closures and certain binary expressions (based on the usages of the >>>>>>> INFERRED_RETURN_TYPE marker and the storeInferredReturnType method). >>>>>>> >>>>>>> You could also add all implicit return statements to the 'run' >>>>>>> method via ReturnAdder, and then infer a return type by visiting all of >>>>>>> the >>>>>>> return statements, but I'm not sure if that kind of AST modification in >>>>>>> a >>>>>>> type checking extension is safe. >>>>>>> >>>>>>> Shil >>>>>>> >>>>>>> On Mon, Sep 21, 2015 at 4:34 PM, Jamie Echlin < >>>>>>> jamie.ech...@gmail.com> wrote: >>>>>>> >>>>>>>> Hi... >>>>>>>> >>>>>>>> Is it possible to infer the return type, or types of a script >>>>>>>> during static compilation? Presumably there is always a finite list of >>>>>>>> branches where the script could end. >>>>>>>> >>>>>>>> I'm looking >>>>>>>> at >>>>>>>> org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor#getInferredReturnType, >>>>>>>> but I'm not really sure how to call it from a type checking script, nor >>>>>>>> what adds the inferred return type to the metadata which is used in >>>>>>>> that >>>>>>>> method. >>>>>>>> >>>>>>>> cheers, jamie >>>>>>>> >>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >> >