[ 
https://issues.apache.org/jira/browse/GROOVY-10064?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Christopher Smith updated GROOVY-10064:
---------------------------------------
    Description: 
I have this subroutine in some code managing DynamoDB tables; the types are 
from the Amazon 2 SDK and Vavr. The {{Either#fold}} method takes a {{Function<? 
super L, ? extends U>}} and a {{Function<? super R, ? extends U>}} (collapsing 
either a "left" or a "right" value into a single result). In this particular 
case, both types are the same {{DynamoDbTable}}, just representing different 
process states. The result type is a {{Try<DynamoDbTable>}}.

Aside from needing the workarounds that I think are related to GROOVY-10033 
({{.&}} and {{as CheckedRunnable}}), this code _works as expected_ in 
GRECLIPSE, but it fails when compiled with groovyc.

{code:groovy}
    private Try<DynamoDbTable> waitForTableActive(Either<DynamoDbTable, 
DynamoDbTable> maybeActive) {
        maybeActive.fold(
            Try.&success, // we already determined it's active
            table -> {
                log.debug('waiting for table {} to become active', 
table.tableName())
                Try.success(table)
                    .andThenTry({ poll.until { checkActive(table).isLeft() } } 
as CheckedRunnable)
            }
        )
    }

    Either<DynamoDbTable, DynamoDbTable> checkActive(DynamoDbTable table) {}
{code}

{code}
Failed to execute goal org.codehaus.gmavenplus:gmavenplus-plugin:1.10.0:compile 
(default) on project azimuth-server: Error occurred while calling a method on a 
Groovy class from classpath.: InvocationTargetException: startup failed:
DynamoDbSchemaRegistryImpl.groovy: 134: [Static type checking] - Cannot find 
matching method io.vavr.control.Try#tableName(). Please check if the declared 
type is correct and if the method exists.
 @ line 134, column 68.
   r table {} to become active', table.tabl
                                 ^

DynamoDbSchemaRegistryImpl.groovy: 136: [Static type checking] - Cannot find 
matching method 
co.vendorflow.azimuth.server.infrastructure.data.dynamodb.DynamoDbSchemaRegistryImpl#checkActive(io.vavr.control.Try
 <T>). Please check if the declared type is correct and if the method exists.
 @ line 136, column 59.
   Try({ poll.until { checkActive(table).is
                                 ^

DynamoDbSchemaRegistryImpl.groovy: 136: [Static type checking] - Cannot find 
matching method java.lang.Object#isLeft(). Please check if the declared type is 
correct and if the method exists.
 @ line 136, column 48.
      .andThenTry({ poll.until { checkActiv
                                 ^

DynamoDbSchemaRegistryImpl.groovy: 131: [Static type checking] - Cannot call 
<U> io.vavr.control.Either <DynamoDbTable, 
DynamoDbTable>#fold(java.util.function.Function <? super 
software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable, ? extends U>, 
java.util.function.Function <? super 
software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable, ? extends U>) with 
arguments [groovy.lang.Closure <io.vavr.control.Try>, groovy.lang.Closure] 
 @ line 131, column 9.
           maybeActive.fold(
           ^
{code}

I have absolutely no idea how the STC gets the idea that the _parameter_ of the 
outer closure should be a {{Try}} (the _result_ should be), and it seems 
possible that the rest of the errors are a cascade from that initial mistake.

Adding an explicit {{(DynamoDbTable table) ->}} gets groovyc to compile it, but 
then I still need to say {{as Function}} everywhere or I get complaints that 
"closure is not a function".

  was:
I have this subroutine in some code managing DynamoDB tables; the types are 
from the Amazon 2 SDK and Vavr. The {{Either#fold}} method takes a {{Function<? 
super L, ? extends U>}} and a {{Function<? super R, ? extends U>}} (collapsing 
either a "left" or a "right" value into a single result). In this particular 
case, both types are the same {{DynamoDbTable}}, just representing different 
process states. The result type is a {{Try<DynamoDbTable>}}.

Aside from needing the workarounds that I think are related to GROOVY-10033 
({{.&}} and {{as CheckedRunnable}}), this code _works as expected_ in 
GRECLIPSE, but it fails when compiled with groovyc.

{code:groovy}
    private Try<DynamoDbTable> waitForTableActive(Either<DynamoDbTable, 
DynamoDbTable> maybeActive) {
        maybeActive.fold(
            Try.&success, // we already determined it's active
            table -> {
                log.debug('waiting for table {} to become active', 
table.tableName())
                Try.success(table)
                    .andThenTry({ poll.until { checkActive(table).isLeft() } } 
as CheckedRunnable)
            }
        )
    }

    Either<DynamoDbTable, DynamoDbTable> checkActive(DynamoDbTable table) {}
{code}

{code}
Failed to execute goal org.codehaus.gmavenplus:gmavenplus-plugin:1.10.0:compile 
(default) on project azimuth-server: Error occurred while calling a method on a 
Groovy class from classpath.: InvocationTargetException: startup failed:
DynamoDbSchemaRegistryImpl.groovy: 134: [Static type checking] - Cannot find 
matching method io.vavr.control.Try#tableName(). Please check if the declared 
type is correct and if the method exists.
 @ line 134, column 68.
   r table {} to become active', table.tabl
                                 ^

DynamoDbSchemaRegistryImpl.groovy: 136: [Static type checking] - Cannot find 
matching method 
co.vendorflow.azimuth.server.infrastructure.data.dynamodb.DynamoDbSchemaRegistryImpl#checkActive(io.vavr.control.Try
 <T>). Please check if the declared type is correct and if the method exists.
 @ line 136, column 59.
   Try({ poll.until { checkActive(table).is
                                 ^

DynamoDbSchemaRegistryImpl.groovy: 136: [Static type checking] - Cannot find 
matching method java.lang.Object#isLeft(). Please check if the declared type is 
correct and if the method exists.
 @ line 136, column 48.
      .andThenTry({ poll.until { checkActiv
                                 ^

DynamoDbSchemaRegistryImpl.groovy: 131: [Static type checking] - Cannot call 
<U> io.vavr.control.Either <DynamoDbTable, 
DynamoDbTable>#fold(java.util.function.Function <? super 
software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable, ? extends U>, 
java.util.function.Function <? super 
software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable, ? extends U>) with 
arguments [groovy.lang.Closure <io.vavr.control.Try>, groovy.lang.Closure] 
 @ line 131, column 9.
           maybeActive.fold(
           ^
{code}

I have absolutely no idea how the STC gets the idea that the _parameter_ of the 
outer closure should be a {{Try}} (the _result_ should be), and it seems 
possible that the rest of the errors are a cascade from that initial mistake.


> STC infers incorrect type for closure parameter
> -----------------------------------------------
>
>                 Key: GROOVY-10064
>                 URL: https://issues.apache.org/jira/browse/GROOVY-10064
>             Project: Groovy
>          Issue Type: Bug
>          Components: Static Type Checker
>    Affects Versions: 3.0.8
>            Reporter: Christopher Smith
>            Priority: Major
>
> I have this subroutine in some code managing DynamoDB tables; the types are 
> from the Amazon 2 SDK and Vavr. The {{Either#fold}} method takes a 
> {{Function<? super L, ? extends U>}} and a {{Function<? super R, ? extends 
> U>}} (collapsing either a "left" or a "right" value into a single result). In 
> this particular case, both types are the same {{DynamoDbTable}}, just 
> representing different process states. The result type is a 
> {{Try<DynamoDbTable>}}.
> Aside from needing the workarounds that I think are related to GROOVY-10033 
> ({{.&}} and {{as CheckedRunnable}}), this code _works as expected_ in 
> GRECLIPSE, but it fails when compiled with groovyc.
> {code:groovy}
>     private Try<DynamoDbTable> waitForTableActive(Either<DynamoDbTable, 
> DynamoDbTable> maybeActive) {
>         maybeActive.fold(
>             Try.&success, // we already determined it's active
>             table -> {
>                 log.debug('waiting for table {} to become active', 
> table.tableName())
>                 Try.success(table)
>                     .andThenTry({ poll.until { checkActive(table).isLeft() } 
> } as CheckedRunnable)
>             }
>         )
>     }
>     Either<DynamoDbTable, DynamoDbTable> checkActive(DynamoDbTable table) {}
> {code}
> {code}
> Failed to execute goal 
> org.codehaus.gmavenplus:gmavenplus-plugin:1.10.0:compile (default) on project 
> azimuth-server: Error occurred while calling a method on a Groovy class from 
> classpath.: InvocationTargetException: startup failed:
> DynamoDbSchemaRegistryImpl.groovy: 134: [Static type checking] - Cannot find 
> matching method io.vavr.control.Try#tableName(). Please check if the declared 
> type is correct and if the method exists.
>  @ line 134, column 68.
>    r table {} to become active', table.tabl
>                                  ^
> DynamoDbSchemaRegistryImpl.groovy: 136: [Static type checking] - Cannot find 
> matching method 
> co.vendorflow.azimuth.server.infrastructure.data.dynamodb.DynamoDbSchemaRegistryImpl#checkActive(io.vavr.control.Try
>  <T>). Please check if the declared type is correct and if the method exists.
>  @ line 136, column 59.
>    Try({ poll.until { checkActive(table).is
>                                  ^
> DynamoDbSchemaRegistryImpl.groovy: 136: [Static type checking] - Cannot find 
> matching method java.lang.Object#isLeft(). Please check if the declared type 
> is correct and if the method exists.
>  @ line 136, column 48.
>       .andThenTry({ poll.until { checkActiv
>                                  ^
> DynamoDbSchemaRegistryImpl.groovy: 131: [Static type checking] - Cannot call 
> <U> io.vavr.control.Either <DynamoDbTable, 
> DynamoDbTable>#fold(java.util.function.Function <? super 
> software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable, ? extends U>, 
> java.util.function.Function <? super 
> software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable, ? extends U>) with 
> arguments [groovy.lang.Closure <io.vavr.control.Try>, groovy.lang.Closure] 
>  @ line 131, column 9.
>            maybeActive.fold(
>            ^
> {code}
> I have absolutely no idea how the STC gets the idea that the _parameter_ of 
> the outer closure should be a {{Try}} (the _result_ should be), and it seems 
> possible that the rest of the errors are a cascade from that initial mistake.
> Adding an explicit {{(DynamoDbTable table) ->}} gets groovyc to compile it, 
> but then I still need to say {{as Function}} everywhere or I get complaints 
> that "closure is not a function".



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to