Ayoub Ait Abdellah created GROOVY-11838:
-------------------------------------------

             Summary: Make default annotation targets follow JLS 9.6.4.1 
(exclude TYPE_USE and TYPE_PARAMETER)
                 Key: GROOVY-11838
                 URL: https://issues.apache.org/jira/browse/GROOVY-11838
             Project: Groovy
          Issue Type: Improvement
          Components: Compiler
    Affects Versions: 5.0.3, 5.0.0
            Reporter: Ayoub Ait Abdellah
             Fix For: 6.x


h2. Summary

Annotations without explicit @Target should default to all declaration contexts 
and no type contexts, per JLS 9.6.4.1.
h2. Background

Currently, Groovy treats annotations without @Target as applicable to all 
targets including TYPE_USE and TYPE_PARAMETER. This violates JLS 9.6.4.1:
{quote}If an annotation of type java.lang.annotation.Target is not present on 
the declaration of an annotation interface A, then A is applicable in all 
declaration contexts and in no type contexts.
{quote}
h2. Proposed Change

In {{{}AnnotationNode.java{}}}, change the default {{allowedTargets}} from 
{{ALL_TARGETS}} to declaration contexts only:
{code:java}
private static final int DECLARATION_TARGETS = TYPE_TARGET | CONSTRUCTOR_TARGET 
| METHOD_TARGET
        | FIELD_TARGET | PARAMETER_TARGET | LOCAL_VARIABLE_TARGET | 
ANNOTATION_TARGET
        | PACKAGE_TARGET | RECORD_COMPONENT_TARGET;

private int allowedTargets = DECLARATION_TARGETS;  // was ALL_TARGETS
{code}
h2. Related
 * GROOVY-11831 - Compiler crash that led to this investigation (fixed with a 
guard for void methods)
 * [JLS 
9.6.4.1|https://docs.oracle.com/javase/specs/jls/se21/html/jls-9.html#jls-9.6.4.1]

h2. Note

As discussed in GROOVY-11831, this is a breaking change suitable for Groovy 6.



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

Reply via email to