groovy-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jamie Echlin <>
Subject Re: infer return type of script
Date Tue, 22 Sep 2015 12:04:18 GMT
> 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()) {



       else {



which would solve the problem. Sounds sensible?
cheers, jamie

On Tue, Sep 22, 2015 at 10:39 AM, Cédric Champeau <
> wrote:

> Not necessarily. The question is what you would use that information for.
> 2015-09-22 11:36 GMT+02:00 Jamie Echlin <>:
>> 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 <
>>> 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 <>:
>>>> 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
>>>> 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 <>
>>>> 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 <>
>>>>> wrote:
>>>>>> You could call 'getInferredReturnType' on the 'run' method node of
>>>>>> your script class, but inferred return types only appear to be stored
>>>>>> 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 <
>>>>>> > wrote:
>>>>>>> Hi...
>>>>>>> Is it possible to infer the return type, or types of a script
>>>>>>> static compilation? Presumably there is always a finite list
of branches
>>>>>>> where the script could end.
>>>>>>> I'm looking
>>>>>>> at,
>>>>>>> but I'm not really sure how to call it from a type checking script,
>>>>>>> what adds the inferred return type to the metadata which is used
in that
>>>>>>> method.
>>>>>>> cheers, jamie

View raw message