You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Jan Hackel (Jira)" <ji...@apache.org> on 2022/05/10 12:02:00 UTC

[jira] [Commented] (GROOVY-10055) STC does not support self bounded types

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

Jan Hackel commented on GROOVY-10055:
-------------------------------------

This is still not fixed up to Groovy 4.0.2!  

{code:groovy}
package de.jhunovis.fluentapi

@Grab('org.springframework.boot:spring-boot-starter-webflux:2.6.7')

import groovy.transform.CompileStatic
import org.junit.jupiter.api.Test
import org.springframework.core.ParameterizedTypeReference
import org.springframework.http.MediaType
import org.springframework.web.reactive.function.client.WebClient

import java.time.Duration

@CompileStatic
class WebFluxFluentApiBugTest {

  private static final ParameterizedTypeReference<List<BigDecimal>> TYPE_TAG
    = new ParameterizedTypeReference<List<BigDecimal>>() {}

  private static final Duration MAX_DURATION = Duration.ofSeconds(8)

  private final WebClient webClient

  List<BigDecimal> flux() {
    def response = webClient.get()
      .uri('/something?id={id}', 'id')
      .accept(MediaType.APPLICATION_JSON)
      .retrieve()
      .toEntity(TYPE_TAG)
      .block(MAX_DURATION)
    return response.getBody() ?: []
  }

  @Test
  void webflux() {
    flux()
  }
}
{code}

It produces:



{noformat}
> groovy src/test/groovy/de/jhunovis/fluentapi/WebFluxFluentApiBugTest.groovy
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
/home/jh/Code/groovy-bugs/src/test/groovy/de/jhunovis/fluentapi/WebFluxFluentApiBugTest.groovy: 27: [Static type checking] - Cannot find matching method S#retrieve(). Please check if the declared type is correct and if the method exists.
 @ line 27, column 16.
         .retrieve()
{noformat}

Please re-open and fix this. 


> STC does not support self bounded types
> ---------------------------------------
>
>                 Key: GROOVY-10055
>                 URL: https://issues.apache.org/jira/browse/GROOVY-10055
>             Project: Groovy
>          Issue Type: Bug
>          Components: Static compilation, Static Type Checker
>    Affects Versions: 3.0.8
>            Reporter: Damir Murat
>            Assignee: Eric Milles
>            Priority: Major
>             Fix For: 4.0.0-beta-2
>
>
> Some popular libraries use self bounded types for creating builder hierarchies. For example, 
>  PostgreSQLContainer (from Tescontainers library) is declared as
> {code:java}
> public class PostgreSQLContainer<SELF extends PostgreSQLContainer<SELF>> extends JdbcDatabaseContainer<SELF>
> {code}
> where JdbcDatabaseContainer is declared as
> {code:java}
> public abstract class JdbcDatabaseContainer<SELF extends JdbcDatabaseContainer<SELF>> extends GenericContainer<SELF> implements LinkableContainer
> {code}
> and so on.
> In the following example (tested with Groovy Console), I'm trying to create and modify such an object with its corresponding fluent API:
> {code:java}
> import org.testcontainers.containers.PostgreSQLContainer
> import groovy.transform.CompileStatic
> @Grab("org.testcontainers:testcontainers:1.15.3")
> @Grab("org.testcontainers:postgresql:1.15.3")
> @CompileStatic
> class TestcontainersTester {
>   static void testSome() {
>     PostgreSQLContainer postgresqlServer = new PostgreSQLContainer<>()
>         .withExposedPorts(5432)
>         .withEnv(["TZ": "Europe/Paris"])
>         .withDatabaseName("my_database")
>         .withUsername("user")
>         .withPassword("pass")
> // Working alternative 1
> //    PostgreSQLContainer postgresqlServer = new PostgreSQLContainer<PostgreSQLContainer<PostgreSQLContainer<PostgreSQLContainer<PostgreSQLContainer>>>>()
> //        .withExposedPorts(5432)
> //        .withEnv(["TZ": "Europe/Paris"])
> //        .withDatabaseName("my_database")
> //        .withUsername("user")
> //        .withPassword("pass")
> // Working alternative 2
> //    PostgreSQLContainer postgresqlServer = new PostgreSQLContainer<>()
> //    postgresqlServer.withExposedPorts(5432)
> //    postgresqlServer.withEnv(["TZ": "Europe/Paris"])
> //    postgresqlServer.withDatabaseName("my_database")
> //    postgresqlServer.withUsername("user")
> //    postgresqlServer.withPassword("pass")
>     println postgresqlServer
>   }
> }
> TestcontainersTester.testSome();
> {code}
> Unfortunately, STC complains with several errors:
> {code:java}
> 4 compilation errors:
> [Static type checking] - Cannot call SELF#withEnv(java.util.Map <java.lang.String, java.lang.String>) with arguments [java.util.LinkedHashMap <java.lang.String, java.lang.String>] 
>  at line: 11, column: 17
> [Static type checking] - Cannot find matching method java.lang.Object#withDatabaseName(java.lang.String). Please check if the declared type is correct and if the method exists.
>  at line: 12, column: 26
> [Static type checking] - Cannot find matching method java.lang.Object#withUsername(java.lang.String). Please check if the declared type is correct and if the method exists.
>  at line: 13, column: 22
> [Static type checking] - Cannot find matching method java.lang.Object#withPassword(java.lang.String). Please check if the declared type is correct and if the method exists.
>  at line: 9, column: 44
> {code}
> There are two working alternatives in the example. "Alternative 1" is not really practical, but maybe it can help with solving the issue. "Alternative 2" is an actual practical workaround that can be further improved by using the "with" method.
> Tnx



--
This message was sent by Atlassian Jira
(v8.20.7#820007)