[
https://issues.apache.org/jira/browse/GROOVY-10064?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Eric Milles resolved GROOVY-10064.
----------------------------------
Resolution: Fixed
This works fine in Groovy 3.0.17:
This script recreates at least some of the conditions described:
{code:groovy}
@Grab('io.vavr:vavr:0.10.4')
import io.vavr.control.*
Either<?,?> checkActive(CharSequence sequence) {}
@groovy.transform.CompileStatic
void test(Either<Number,String> either) {
def result = either.fold(
Try.&success, // number -> Try.success(number)
string -> {
Try.success(string).andThenTry({ checkActive(string)?.isLeft() } as
io.vavr.CheckedRunnable)
}
)
}
test(Either.right('foo'))
{code}
> 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
> Assignee: Eric Milles
> 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.20.10#820010)