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

James Daugherty updated GROOVY-11793:
-------------------------------------
    Description: 
GROOVY-3278 added support in Groovy 3 to reference String constants defined on 
other classes in annotations.  In Groovy 4, this appears to be broken when 
split up across different compilation units. 

 

For example, the following will fail: 

 
{code:java}
import java.lang.annotation.Documented
import java.lang.annotation.ElementType
import java.lang.annotation.Inherited
import java.lang.annotation.Retention
import java.lang.annotation.RetentionPolicy
import java.lang.annotation.Target
import groovy.transform.CompileStatic

@CompileStatic
class OtherExample {
     static final String 
MY_VALUE=com.sun.org.apache.xml.internal.security.c14n.Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS
}

@CompileStatic
@Target([ElementType.METHOD, ElementType.TYPE])
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@interface MyAnnotation {
    String value() default ""
}

@CompileStatic
class TheProblem {
    String foo
    
    @MyAnnotation(OtherExample.MY_VALUE)
    def myTestMethod() {
       'yello'
    }
}

new TheProblem() {code}
 

 

with this error: 
{code:java}
Expected 'OtherExample.getMY_VALUE()' to be an inline constant of type 
java.lang.String in @MyAnnotation{code}
{code:java}
Attribute 'value' should have type 'java.lang.String'; but found type 
'java.lang.Object' in @MyAnnotation            {code}
But if the constant is defined on a class in the same script, it will succeed:
{code:java}
import java.lang.annotation.Documented
import java.lang.annotation.ElementType
import java.lang.annotation.Inherited
import java.lang.annotation.Retention
import java.lang.annotation.RetentionPolicy
import java.lang.annotation.Target
import groovy.transform.CompileStatic@CompileStatic
class AnExample {
    static final String CONST = 'foo'
}

@CompileStatic
class OtherExample {
     static final String MY_VALUE=AnExample.CONST
}

@CompileStatic
@Target([ElementType.METHOD, ElementType.TYPE])
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@interface MyAnnotation {
    String value() default ""
}

@CompileStatic
class TheProblem {
    String foo
    
    @MyAnnotation(OtherExample.MY_VALUE)
    def myTestMethod() {
       'yello'
    }
}

new TheProblem() {code}
Can the Groovy 3 behavior be restored so that constants can be reassigned & 
then referenced in annotations across code that is compiled in separate stages?

 

  was:
GROOVY-3278 added support in Groovy 3 to reference String constants defined on 
other classes in annotations.  In Groovy 4, this appears to be broken when 
split up across different compilation units. 

 

For example, the following will fail: 

 
{code:java}
import java.lang.annotation.Documented
import java.lang.annotation.ElementType
import java.lang.annotation.Inherited
import java.lang.annotation.Retention
import java.lang.annotation.RetentionPolicy
import java.lang.annotation.Target
import groovy.transform.CompileStatic

@CompileStatic
class OtherExample {
     static final String 
MY_VALUE=com.sun.org.apache.xml.internal.security.c14n.Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS
}

@CompileStatic
@Target([ElementType.METHOD, ElementType.TYPE])
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@interface MyAnnotation {
    String value() default ""
}

@CompileStatic
class TheProblem {
    String foo
    
    @MyAnnotation(OtherExample.MY_VALUE)
    def myTestMethod() {
       'yello'
    }
}

new TheProblem() {code}
 

 

with this error: 
{code:java}
Expected 'OtherExample.getMY_VALUE()' to be an inline constant of type 
java.lang.String in @MyAnnotation{code}
{code:java}
Attribute 'value' should have type 'java.lang.String'; but found type 
'java.lang.Object' in @MyAnnotation            {code}

But if the constant is defined on a class in the same script, it will succeed:


{code:java}
import java.lang.annotation.Documented
import java.lang.annotation.ElementType
import java.lang.annotation.Inherited
import java.lang.annotation.Retention
import java.lang.annotation.RetentionPolicy
import java.lang.annotation.Target
import groovy.transform.CompileStatic@CompileStatic
class AnExample {
    static final String CONST = 'foo'
}

@CompileStatic
class OtherExample {
     static final String MY_VALUE=AnExample.CONST
}

@CompileStatic
@Target([ElementType.METHOD, ElementType.TYPE])
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@interface MyAnnotation {
    String value() default ""
}

@CompileStatic
class TheProblem {
    String foo
    
    @MyAnnotation(OtherExample.MY_VALUE)
    def myTestMethod() {
       'yello'
    }
}

new TheProblem() {code}
Can the Groovy 3 behavior be restored so that constants can be reassigned & 
then referenced in annotations?

 


> Cannot Reference Previously Compiled Constants from Annotations
> ---------------------------------------------------------------
>
>                 Key: GROOVY-11793
>                 URL: https://issues.apache.org/jira/browse/GROOVY-11793
>             Project: Groovy
>          Issue Type: Task
>          Components: Compiler
>    Affects Versions: 4.0.28
>         Environment: Mac OS (latest), Java 17, Groovy 4.0.28
>            Reporter: James Daugherty
>            Priority: Major
>
> GROOVY-3278 added support in Groovy 3 to reference String constants defined 
> on other classes in annotations.  In Groovy 4, this appears to be broken when 
> split up across different compilation units. 
>  
> For example, the following will fail: 
>  
> {code:java}
> import java.lang.annotation.Documented
> import java.lang.annotation.ElementType
> import java.lang.annotation.Inherited
> import java.lang.annotation.Retention
> import java.lang.annotation.RetentionPolicy
> import java.lang.annotation.Target
> import groovy.transform.CompileStatic
> @CompileStatic
> class OtherExample {
>      static final String 
> MY_VALUE=com.sun.org.apache.xml.internal.security.c14n.Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS
> }
> @CompileStatic
> @Target([ElementType.METHOD, ElementType.TYPE])
> @Retention(RetentionPolicy.RUNTIME)
> @Inherited
> @Documented
> @interface MyAnnotation {
>     String value() default ""
> }
> @CompileStatic
> class TheProblem {
>     String foo
>     
>     @MyAnnotation(OtherExample.MY_VALUE)
>     def myTestMethod() {
>        'yello'
>     }
> }
> new TheProblem() {code}
>  
>  
> with this error: 
> {code:java}
> Expected 'OtherExample.getMY_VALUE()' to be an inline constant of type 
> java.lang.String in @MyAnnotation{code}
> {code:java}
> Attribute 'value' should have type 'java.lang.String'; but found type 
> 'java.lang.Object' in @MyAnnotation            {code}
> But if the constant is defined on a class in the same script, it will succeed:
> {code:java}
> import java.lang.annotation.Documented
> import java.lang.annotation.ElementType
> import java.lang.annotation.Inherited
> import java.lang.annotation.Retention
> import java.lang.annotation.RetentionPolicy
> import java.lang.annotation.Target
> import groovy.transform.CompileStatic@CompileStatic
> class AnExample {
>     static final String CONST = 'foo'
> }
> @CompileStatic
> class OtherExample {
>      static final String MY_VALUE=AnExample.CONST
> }
> @CompileStatic
> @Target([ElementType.METHOD, ElementType.TYPE])
> @Retention(RetentionPolicy.RUNTIME)
> @Inherited
> @Documented
> @interface MyAnnotation {
>     String value() default ""
> }
> @CompileStatic
> class TheProblem {
>     String foo
>     
>     @MyAnnotation(OtherExample.MY_VALUE)
>     def myTestMethod() {
>        'yello'
>     }
> }
> new TheProblem() {code}
> Can the Groovy 3 behavior be restored so that constants can be reassigned & 
> then referenced in annotations across code that is compiled in separate 
> stages?
>  



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

Reply via email to