groovy-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Tommy Svensson <to...@natusoft.se>
Subject Groovy compiler bug in 3.0.0-rc-3 and 3.0.0 works in 3.0.0-beta-3.
Date Sat, 15 Feb 2020 16:55:25 GMT
Hello,

With the new Groovy 3.0.0, and 3.0.0-rc-3, which I though I were using but weren't (were actually
using 3.0.0-beta-3 which works fine) there is a compilation problem. 

I get the following errors, actually the same error in 2 different places (I'm on a Mac and
have used Menlo font for code parts, don't know how/if that translates to other platforms):
Error:(182, 9) Groovyc: [Static type checking] - Cannot call se.natusoft.osgi.aps.api.messaging.APSBus#send(java.lang.String,
java.util.Map <java.lang.String, java.lang.Object>, se.natusoft.osgi.aps.types.APSHandler
<se.natusoft.osgi.aps.types.APSResult>) with arguments [java.lang.String, java.util.Map
<String, Object>, se.natusoft.osgi.aps.types.APSHandler <APSResult>]
Error:(252, 9) Groovyc: [Static type checking] - Cannot call se.natusoft.osgi.aps.api.messaging.APSBus#send(java.lang.String,
java.util.Map <java.lang.String, java.lang.Object>, se.natusoft.osgi.aps.types.APSHandler
<se.natusoft.osgi.aps.types.APSResult>) with arguments [java.lang.String, java.util.Map
<String, Object>, se.natusoft.osgi.aps.types.APSHandler <APSResult>]

Clarification by aligning args:

Error:(182, 9) Groovyc: [Static type checking] - Cannot call se.natusoft.osgi.aps.api.messaging.APSBus#send(

                  java.lang.String, java.util.Map <java.lang.String, java.lang.Object>,
se.natusoft.osgi.aps.types.APSHandler <se.natusoft.osgi.aps.types.APSResult>) 
  
  with arguments [java.lang.String, java.util.Map <String, Object>,          
          se.natusoft.osgi.aps.types.APSHandler <APSResult>]
  

Error:(252, 9) Groovyc: [Static type checking] - Cannot call se.natusoft.osgi.aps.api.messaging.APSBus#send(

                  java.lang.String, java.util.Map <java.lang.String, java.lang.Object>,
se.natusoft.osgi.aps.types.APSHandler <se.natusoft.osgi.aps.types.APSResult>) 
  
  with arguments [java.lang.String, java.util.Map <String, Object>,          
          se.natusoft.osgi.aps.types.APSHandler <APSResult>]

  
For method declaration it sees the generics part as "java.lang.String" and "java.lang.Object"
but in the call it sees it as "String" and "Object". Should be the same thing, but clearly
it doesn't see that. Here it is a total stop since I cannot fix these using "as" keyword to
make it identical to what it wants, but actually already is :-). The compiler still reports
the same error where the package part has been removed. The parameters are exactly what is
declared and needed.

Here is the actual source code for the above 2 errors:
this.bus.send( "cluster:${serviceId}" as String, message as Map<String, Object>, resultHandler
as APSHandler<APSResult<?>> )
this.bus.send(
        "cluster:all:${this.helperForServiceId}/announce" as String,
        new ServiceAnnounceMessage( this.helperForServiceId ) as Map<String, Object>,
        resultHandler as APSHandler<APSResult<?>>
)

And no, I didn't have the "as ..." part to begin with, with the exception of the first argument
which is a GString and needs to be made into a String. But adding the "as" part doesn't help.
But from the error message above I'd say it is that it looses the packages in the generics
part of the actual call arguments that is the problem. What it expects and the real actual
arguments are the same. 

And here is the declarations of the API in interface. It is the same method called in both
cases. Ignore the annotations, they are just documentative.
void send( @NotNull String target, @NotNull Map<String, Object> message,
           @Optional @Nullable APSHandler<APSResult<?>> resultHandler );
The interface is written in Java! All Groovy classes uses @CompileStatic and @TypeChecked.


I also want to point out that for the java.util.Map<java.lang.String, java.lang.Object>
I do pass an instance of a class that implements exactly that! But compiler is not happy,
I have to add "as java.util.Map<java.lang.String, java.lang.Object>" to the argument
passed!

Here is from the code:

    MessageTypeServiceHelper announceService( APSHandler<APSResult<?>> resultHandler
) {
        this.bus.send(
                "cluster:all:${this.helperForServiceId}/announce" as String,
                new ServiceAnnounceMessage( this.helperForServiceId ) as Map<String,
Object>,
                resultHandler
        )
        

ServiceAnnounceMessage extends BaseMesage which is declared like this:

    class BaseMessage implements Map<String, Object> {
    
The compiler should figure that out IMHO. I should not be forced to add "as Map<String,
Object>" here.

3.0.0-beta-3 has none of these problems. 

Best Regards,
Tommy
Mime
View raw message