Marcin Zajaczkowski created GROOVY-10040: --------------------------------------------
Summary: @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 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} import groovy.transform.AnnotationCollector class CustomCompiler { final GroovyClassLoader loader = new GroovyClassLoader(getClass().classLoader) static void main(String[] args) { new CustomCompiler().compile() } void compile() { loader.clearCache() 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)