groovy-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jamie Echlin <jamie.ech...@gmail.com>
Subject Re: infer return type of script
Date Tue, 22 Sep 2015 12:32:13 GMT
it appears to work great, thanks Cedric!

On Tue, Sep 22, 2015 at 1:05 PM, Cédric Champeau <cedric.champeau@gmail.com>
wrote:

> mmm, makes sense. That's worth a try!
>
> 2015-09-22 14:04 GMT+02:00 Jamie Echlin <jamie.echlin@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.champeau@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.echlin@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.champeau@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.echlin@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.sinha@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.sinha@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.echlin@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
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>

Mime
View raw message