RFR: JDK15-8242529: javac defines type annotations incorrectly for record members (constructor and property accessor)

Vicente Romero vicente.romero at oracle.com
Thu Jul 9 18:25:32 UTC 2020


Hi Paul,

Thanks for the feedback, I have uploaded another iteration at [1] how 
does it look?

Vicente

[1] http://cr.openjdk.java.net/~vromero/8242529/webrev.01/

On 7/9/20 12:06 PM, Paul Sandoz wrote:
> Hi Vicente,
>
> The asserts look regular in all four cases, I think :-) If so we can 
> consolidate the check into a single method, off the top of my head:
>
>   RecordComponent recordComponent = 
> RecordNotPreservingNestedTypeAnnotationsTest.class.getRecordComponents()[0];
>   check(recordComponent.getAnnotations(), 
> recordComponent.getAnnotatedType());
>
>   Method accessor = recordComponent.getAccessor();
>   check(accessor.getAnnotations(), accessor.getAnnotatedReturnType());
>
> Constructor<?> constructor = 
> RecordNotPreservingNestedTypeAnnotationsTest.class.getConstructor(Callable.class);
> check(constructor.getParameterAnnotations()[0], 
> constructor.getAnnotatedParameterTypes()[0]);
>
>   Field field = 
> RecordNotPreservingNestedTypeAnnotationsTest.class.getDeclaredField(recordComponent.getName()); 
>
>   check(field.getAnnotations(), field.getAnnotatedType());
> );
>
> Does that work?
>
> Paul.
>
>> On Jul 8, 2020, at 7:31 PM, Vicente Romero <vicente.romero at oracle.com 
>> <mailto:vicente.romero at oracle.com>> wrote:
>>
>> Hi,
>>
>> Please review fix for [1] at [2]. Current record implementation is 
>> not forward nested type annotations to generated members like in:
>>
>> record R(@RegularAnnotation @TypeAnnotation Callable<@TypeAnnotation ?> foo) {}
>> This patch is fixing one issue that show up in two different 
>> generated record members:
>>     - the accessor corresponding to the record component
>>     - the corresponding parameter in the canonical constructor
>>
>> The issue is that the current implementation is not able to correctly 
>> generate the annotated types for these components when such an 
>> annotated type has "inner" type annotations like it is the case of 
>> `foo` in the example which has `TypeAnnotation` applied to the 
>> wildcard. In the case of the corresponding parameter in the canonical 
>> constructor the annotated type was generated correctly but the class 
>> file reflected the internal type annotation as applied to a field not 
>> to a method parameter. In the case of the accessor the inner 
>> annotation was not there at all. The patch is making a copy of the 
>> expression defining the type of the record component and placing it 
>> that the right place for both generated members.
>>
>> Thanks,
>> Vicente
>>
>> [1] https://bugs.openjdk.java.net/browse/JDK-8242529
>> [2] http://cr.openjdk.java.net/~vromero/8242529/webrev.00/
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20200709/349835f8/attachment.htm>


More information about the compiler-dev mailing list