groovy-notifications mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Paul King (JIRA)" <j...@apache.org>
Subject [jira] [Comment Edited] (GROOVY-8975) GroovyCastException on the result of CliBuilder.parseFromSpec
Date Mon, 18 Feb 2019 05:10:00 GMT

    [ https://issues.apache.org/jira/browse/GROOVY-8975?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16770785#comment-16770785
] 

Paul King edited comment on GROOVY-8975 at 2/18/19 5:09 AM:
------------------------------------------------------------

I seem to get slightly different behavior with pre-compiled classes and classes in the same
compilation unit. In any case, this script in the GroovyConsole replicates the problem:
{code:java}
import groovy.cli.Option
import groovy.cli.Unparsed
import groovy.cli.picocli.CliBuilder

interface IHello {
@Option(shortName='h', description='display usage') Boolean help()
@Option(shortName='u', description='user name') String user()
@Unparsed(description = 'positional parameters') List remaining()
}

def cli = new CliBuilder(name: 'groovy Greeter')
def argz = '--user abc'.split()
IHello hello = cli.parseFromSpec(IHello, argz)
assert hello.user() == 'abc'
{code}
If I change the last line in {{CliBuilder#parseFromSpec}} as follows, it fixes the problem:
{code}
-        cliOptions as T
+        DefaultGroovyMethods.asType(cliOptions, optionsClass)
{code}
It's an easy enough change but I wonder whether there is some underlying behavioral change
elsewhere that is surfacing here and requiring this change. Perhaps it is just type erasure
surfacing here.


was (Author: paulk):
I seem to get slightly different behavior with pre-compiled classes and classes in the same
compilation unit. In any case, this script in the GroovyConsole replicates the problem:
{code:java}
import groovy.cli.Option
import groovy.cli.Unparsed
import groovy.cli.picocli.CliBuilder

interface IHello {
@Option(shortName='h', description='display usage') Boolean help()
@Option(shortName='u', description='user name') String user()
@Unparsed(description = 'positional parameters') List remaining()
}

def cli = new CliBuilder(name: 'groovy Greeter')
def argz = '--user abc'.split()
IHello hello = cli.parseFromSpec(IHello, argz)
assert hello.user() == 'abc'
{code}
If I change the last line in {{CliBuilder#parseFromSpec}} as follows, it fixes the problem:
{code}
-        cliOptions as T
+        DefaultGroovyMethods.asType(cliOptions, optionsClass)
{code}
It's an easy enough change but I wonder whether there is some underlying behavioral change
elsewhere that is surfacing here and requiring this change.

> GroovyCastException on the result of CliBuilder.parseFromSpec
> -------------------------------------------------------------
>
>                 Key: GROOVY-8975
>                 URL: https://issues.apache.org/jira/browse/GROOVY-8975
>             Project: Groovy
>          Issue Type: Bug
>          Components: groovy-runtime
>    Affects Versions: 2.5.5
>            Reporter: Mauro Molinari
>            Assignee: Remko Popma
>            Priority: Major
>         Attachments: GROOVY-8975.zip
>
>
> I'm trying to follow the tutorial about the use of CliBuilder in Groovy with Groovy 2.5.5.
Copying the code at [Annotating methods of an interface|https://github.com/remkop/picocli/wiki/Groovy-2.5-CliBuilder-Renewal#annotating-methods-of-an-interface]
paragraph, at runtime I have the following Exception:
> {noformat}
> Exception in thread "main" org.codehaus.groovy.runtime.typehandling.GroovyCastException:
Cannot cast object '{help=groovy.cli.picocli.CliBuilder$_extractAttributesFromMethod_closure12@3bb9a3ff}'
with class 'java.util.LinkedHashMap' to class 'mypackage.IHello' due to: groovy.lang.GroovyRuntimeException:
Could not find matching constructor for: mypackage.IHello(LinkedHashMap)
>         at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnSAM(DefaultTypeTransformation.java:412)
>         at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnNumber(DefaultTypeTransformation.java:328)
>         at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToType(DefaultTypeTransformation.java:242)
>         at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.java:617)
>         at mypackage.MyMain.main(MyMain.groovy:20)Exception in thread "main" org.codehaus.groovy.runtime.typehandling.GroovyCastException:
Cannot cast object '{help=groovy.cli.picocli.CliBuilder$_extractAttributesFromMethod_closure12@3bb9a3ff}'
with class 'java.util.LinkedHashMap' to class 'mypackage.IHello' due to: groovy.lang.GroovyRuntimeException:
Could not find matching constructor for: mypackage.IHello(LinkedHashMap)
>         at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnSAM(DefaultTypeTransformation.java:412)
>         at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnNumber(DefaultTypeTransformation.java:328)
>         at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToType(DefaultTypeTransformation.java:242)
>         at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.java:617)
>         at mypackage.MyMain.main(DcsServizi2Sdi.groovy:20){noformat}
> The exception occurs at this line:
>  {{IHello hello = cli.parseFromSpec(IHello, argz)}}
> The exception goes away (and all works fine) if I replace it with:
>  {{def hello = cli.parseFromSpec(IHello, argz)}}
> I tried to downgrade Groovy down to version 2.5.0 and I always get the exception. So
this really puzzles me, since the mentioned tutorial is quite simple and straight to follow...



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Mime
View raw message