You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@groovy.apache.org by Jamie Echlin <ja...@gmail.com> on 2015/09/21 22:34:57 UTC

infer return type of script

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

Re: infer return type of script

Posted by Jamie Echlin <ja...@gmail.com>.
it appears to work great, thanks Cedric!

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

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

Re: infer return type of script

Posted by Cédric Champeau <ce...@gmail.com>.
mmm, makes sense. That's worth a try!

2015-09-22 14:04 GMT+02:00 Jamie Echlin <ja...@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 <ja...@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 <ja...@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 <sh...@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 <sh...@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
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>

Re: infer return type of script

Posted by Jamie Echlin <ja...@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 <ja...@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 <ja...@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 <sh...@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 <sh...@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
>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>

Re: infer return type of script

Posted by Cédric Champeau <ce...@gmail.com>.
Not necessarily. The question is what you would use that information for.

2015-09-22 11:36 GMT+02:00 Jamie Echlin <ja...@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 <ja...@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 <sh...@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 <sh...@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 <ja...@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
>>>>>>
>>>>>
>>>>>
>>>>
>>>
>>
>

Re: infer return type of script

Posted by Jamie Echlin <ja...@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 <ja...@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 <sh...@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 <sh...@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 <ja...@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
>>>>>
>>>>
>>>>
>>>
>>
>

Re: infer return type of script

Posted by Cédric Champeau <ce...@gmail.com>.
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 <ja...@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 <sh...@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 <sh...@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 <ja...@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
>>>>
>>>
>>>
>>
>

Re: infer return type of script

Posted by Jamie Echlin <ja...@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 <sh...@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 <sh...@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 <ja...@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
>>>
>>
>>
>

Re: infer return type of script

Posted by Shil Sinha <sh...@gmail.com>.
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 <sh...@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 <ja...@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
>>
>
>

Re: infer return type of script

Posted by Shil Sinha <sh...@gmail.com>.
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 <ja...@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
>