You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Eric Milles (Jira)" <ji...@apache.org> on 2023/04/18 19:00:00 UTC

[jira] [Commented] (GROOVY-11019) joint compilation: public static final string does not compile

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

Eric Milles commented on GROOVY-11019:
--------------------------------------

If your string field is initialized with an expression that the groovy compiler cannot convert to an inline constant (one single string literal) then it uses "new java.lang.String(null)" as the value so that javac cannot inline the value.  There is a bug where it casts null to java.lang.Object not java.lang.String.

If you can find the initial expression that does this, you may be able to rewrite it so that it inlines properly.  If you move the initialization to a static block, it sets the value as "null" which is a bug too, so don't do that.

I have a fix for both issues.

> joint compilation:  public static final string does not compile
> ---------------------------------------------------------------
>
>                 Key: GROOVY-11019
>                 URL: https://issues.apache.org/jira/browse/GROOVY-11019
>             Project: Groovy
>          Issue Type: Bug
>          Components: Stub generator / Joint compiler
>    Affects Versions: 4.0.11
>         Environment: OpenJDK Runtime Environment Temurin-11.0.16.1+1 (build 11.0.16.1+1)
>            Reporter: Jason Garrett
>            Assignee: Eric Milles
>            Priority: Major
>
> I haven't managed to reproduce this in a simple example, but as I'm upgrading my application from groovy 3 to 4 I have run into this situation.  I have a class that defines a public static final string like this:
> {code:java}
> class PublicStaticString { 
>    public static final String NONE = "None" 
> }
> {code}
> Its java stub fails to compile with:
> {noformat}
> error: no suitable constructor found for String(Object)
> public static final java.lang.String NONE = new java.lang.String((java.lang.Object)null);{noformat}
>  
> I can remove the "public" from the declaration and the class/stub will compile, but now any java class that references that field will fail to compile with:
> {noformat}
> error: NONE has private access in PublicStaticString
>          selectNoneButton.setText(PublicStaticString.NONE);{noformat}
> The only way I know to fix this is to convert the java class to groovy.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)