[ https://issues.apache.org/jira/browse/GROOVY-10040?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17332557#comment-17332557 ]
Marcin Zajaczkowski edited comment on GROOVY-10040 at 4/26/21, 4:14 PM: ------------------------------------------------------------------------ I was able to reproduce that problem without Closure. Using any enum is also problematic {code:java} class CustomCompiler { final GroovyClassLoader loader = new GroovyClassLoader(getClass().classLoader) static void main(String[] args) { new CustomCompiler().compile() } void compile() { Class clazz = loader.parseClass(""" //@${CustomCompiler.class.packageName}.EnumAnnotation(${CustomCompiler.class.packageName}.MyEnum.BAR) //works fine @${CustomCompiler.class.packageName}.MetaEnum class Foo { void foo() { } } """) assert clazz } } enum MyEnum { FOO, BAR } @interface EnumAnnotation { MyEnum value() } @EnumAnnotation(MyEnum.BAR) @AnnotationCollector @interface MetaEnum { } {code} With an error: {code:java} Exception in thread "main" org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: Script_38dfc334e76a8e3f31d2efef7266fb23.groovy: -1: Expected enum value for attribute value in @info.solidsoft.blog.spock2.migration.EnumAnnotation @ line -1, column -1. 1 error ...{code} was (Author: szpak): I was able to reproduce that problem without Closure. Using any enum is also problematic {code:java} class CustomCompiler { final GroovyClassLoader loader = new GroovyClassLoader(getClass().classLoader) static void main(String[] args) { new CustomCompiler().compile() } void compile() { Class clazz = loader.parseClass(""" //@${CustomCompiler.class.packageName}.EnumAnnotation(${CustomCompiler.class.packageName}.MyEnum.BAR) //works fine @${CustomCompiler.class.packageName}.MetaEnum class Foo { void foo() { } } """) assert clazz } } enum MyEnum { FOO, BAR } @interface EnumAnnotation { MyEnum value() } @EnumAnnotation(MyEnum.BAR) @AnnotationCollector @interface MetaEnum { } {code} > @AnnotationCollector - Only classes and closures can be used for attribute > 'value' in ... > ----------------------------------------------------------------------------------------- > > Key: GROOVY-10040 > URL: https://issues.apache.org/jira/browse/GROOVY-10040 > Project: Groovy > Issue Type: Bug > Components: Compiler > Affects Versions: 3.0.7 > Environment: Groovy 3.0.7 > Reporter: Marcin Zajaczkowski > Priority: Minor > > I've bumped into that problem writing regression tests for using > @AnnotationCollector in Spock to achieve meta-annotation support. A custom > annotation accepting Clusure is problematic with @AnnotationCollector. It > compiles file with groovyc, but not with ClassLoader (which is used by > Spock's EmbeddedSpecCompiler). > The problem can be simply reproduced with `GroovyClassLoader`: > {code:java} > package foobar > import groovy.transform.AnnotationCollector > class CustomCompiler { > final GroovyClassLoader loader = new > GroovyClassLoader(getClass().classLoader) > static void main(String[] args) { > new CustomCompiler().compile() > } > void compile() { > Class clazz = loader.parseClass(""" > //@${CustomCompiler.class.packageName}.RetryCustom //works fine > @${CustomCompiler.class.packageName}.MetaCustom > //MultipleCompilationErrorsException exception > class Foo { > void foo() { > } > } > """) > assert clazz > } > } > @RetryCustom(1) > @RequiresCustom({ 1 == 1 }) > @AnnotationCollector > @interface MetaCustom { > } > @interface RequiresCustom { > Class<? extends Closure> value() > } > @interface RetryCustom { > int value() > } > {code} > which results in: > {code:java} > Exception in thread "main" > org.codehaus.groovy.control.MultipleCompilationErrorsException: startup > failed: > Script_45e27a459ca58d9b86efd544e2929b39.groovy: -1: Only classes and closures > can be used for attribute 'value' in @foobar.RequiresCustom > @ line -1, column -1. > 1 error > at > org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:295) > at > org.codehaus.groovy.control.CompilationUnit$IPrimaryClassNodeOperation.doPhaseOperation(CompilationUnit.java:984) > at > org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:671) > at > org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:635) > at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:389) > at > groovy.lang.GroovyClassLoader.lambda$parseClass$3(GroovyClassLoader.java:332) > at > org.codehaus.groovy.runtime.memoize.StampedCommonCache.compute(StampedCommonCache.java:163) > at > org.codehaus.groovy.runtime.memoize.StampedCommonCache.getAndPut(StampedCommonCache.java:154) > at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:330) > at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:314) > at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:257) > at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268) > at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native > Method) > at > java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > at > java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.base/java.lang.reflect.Method.invoke(Method.java:566) > at > org.codehaus.groovy.runtime.callsite.PlainObjectMetaMethodSite.doInvoke(PlainObjectMetaMethodSite.java:43) > at > org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoCachedMethodSiteNoUnwrap.invoke(PojoMetaMethodSite.java:203) > at > org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:56) > at > org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47) > at > org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) > at > org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:139) > at foobar.CustomCompiler.compile(CustomCompiler.groovy:15) > at foobar.CustomCompiler$compile.call(Unknown Source) > at > org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47) > at > org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) > at > org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:130) > at foobar.CustomCompiler.main(CustomCompiler.groovy:10) > {code} > > If it really happens only with `GroovyClassLoader`,it is a minor problem. > However, I believe, I might have observed that occasionally while compiling > with Idea 2020.3 (but I'm not able to reproduce it right now and I might > confuse parameters). -- This message was sent by Atlassian Jira (v8.3.4#803005)