There are several places that a declaration annotation on a record parameter can be "pushed down" to:
- The record component itself, stored in the Record attribute (if anno has target RECORD_COMPONENT) - Parameters of an implicit canonical constructor (for target PARAMETER) - An implicit accessor for the component (for target METHOD) - The component field (for target FIELD) If the anno has multiple of these targets, it is pushed down to multiple places. > On Dec 17, 2019, at 5:10 AM, Tagir Valeev <amae...@gmail.com> wrote: > > Hello! > > Current records JLS spec draft [1] says: > > a record component but T is not applicable to record component > declarations, field declarations, method declarations, or type > contexts. > > However, javac doesn't fail if the annotation target is parameter: > > import java.lang.annotation.*; > > record Foo(@Anno int x) {} > @Target(ElementType.PARAMETER) > @interface Anno {} > > This code compiles and the canonical constructor is annotated with > Anno. To me, the javac behavior is expected and spec should be updated > to include "parameters": > > a record component but T is not applicable to record component > declarations, field declarations, method declarations, parameters, or > type contexts. > > What do you think? I'm implementing error highlighting for records in > IntelliJ now. Should I follow the spec or javac behavior? > > With best regards, > Tagir Valeev. > > http://cr.openjdk.java.net/~gbierman/jep359/jep359-20191125/specs/records-jls.html#jls-9.7.4