RFR: JDK-8239447: compiler error for annotations applied to record components with target METHOD
Vicente Romero
vicente.romero at oracle.com
Fri Mar 13 06:02:20 UTC 2020
Hi
On 3/12/20 8:13 PM, Maurizio Cimadamore wrote:
> Looks good - I wonder: why wasn't this failing if TYPE_USE was used as
> a target? I know that processing for type annotations is quite
> different, but I'm still a bit surprised to see that the data from
> previous rounds doesn't cause issues in that case.
I also thought that the difference was due to the different nature of
type annotations. But while double checking to answer you I discovered
that the cause is a bug in the records implementation, let's assume we have:
record R(@MyAnno int i) {}
currently what is happening is that the same AST created by the parser
for the annotation in the record header is shared by the generated
field, the record component, the accessor and the parameter in the
generated constructor. Exactly the same AST. This is the root cause
behind the reason why in some cases the information from a previous
round was being cleared and sometimes not. I think that a cleaner
solution should be to create different ASTs per each record member. So
this way each member including record components will have their own
AST. This fixes this bug and probably others that were potentially
lurking in this area. I have uploaded a new iteration to [1].
>
> Maurizio
Thanks,
Vicente
[1] http://cr.openjdk.java.net/~vromero/8239447/webrev.01/
>
> On 12/03/2020 17:57, Vicente Romero wrote:
>> ping
>>
>> On 3/7/20 12:34 AM, Vicente Romero wrote:
>>> Please review fix for [1] at [2]. When there are APs involved, every
>>> time a new round of annotation processing will start, a visitor, see
>>> [3], sets the attribute field of annotation ASTs to null. This
>>> visitor was not visiting some annotations stored at the record
>>> component. This provoked that data from previous rounds could be
>>> accessible to later rounds provoking later annotation validation
>>> code to fail. Just visiting the annotations at the record component
>>> as it is done for the rest of the annotations has fixed the issue.
>>>
>>> Thanks,
>>> Vicente
>>>
>>> [1] https://bugs.openjdk.java.net/browse/JDK-8239447
>>> [2] http://cr.openjdk.java.net/~vromero/8239447/webrev.00/
>>> [3]
>>> http://hg.openjdk.java.net/jdk/jdk/file/7af6364e1792/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java#l1591
>>
More information about the compiler-dev
mailing list