<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Thu, Feb 22, 2018 at 11:23 AM Liam Miller-Cushon <<a href="mailto:cushon@google.com" target="_blank">cushon@google.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Feb 21, 2018 at 2:43 PM, Alex Buckley <span dir="ltr"><<a href="mailto:alex.buckley@oracle.com" class="m_2751798288169115293gmail-m_8765084999602767543gmail-m_8879847961395981154gmail-m_2955303385400387919gmail-cremed m_2751798288169115293gmail-m_8765084999602767543gmail-m_8879847961395981154gmail-m_2955303385400387919cremed m_2751798288169115293gmail-m_8765084999602767543gmail-m_8879847961395981154gmail-cremed m_2751798288169115293gmail-m_8765084999602767543gmail-m_8879847961395981154cremed" target="_blank">alex.buckley@oracle.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="m_2751798288169115293gmail-m_8765084999602767543gmail-m_8879847961395981154gmail-m_2955303385400387919gmail-">On 2/21/2018 2:34 PM, Liam Miller-Cushon wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
I'm now reading "nested type" as meaning a type that is nested inside an<br>
*annotatable* type.<br>
i.e. in A.B where B is a non-static inner class, A is an annotatable<br>
enclosing instance type, so a type path is needed to indicate that in<br>
`A.@Foo B` the annotation is on B.<br>
However in A.B where B is a static member class, A is a 'scoping<br>
construct' rather than an annotatable type, so no type path is needed<br>
for `A.@Foo B` since B is the only annotatable type.<br>
</blockquote>
<br></span>
That sounds plausible -- the "scoping construct" concept tunneled itself fairly deeply into the JLS -- but I don't especially recall that "nested type" in JVMS 4.7.20.2 meant to represent only non-static members. I can only suggest more digging on type-annotations-spec-experts, sorry.</blockquote></div></div></div></blockquote><div><br></div><div>From some offline discussion with Mike and Werner, the original intent was for "nested type" in JVMS 4.7.20.2 to only apply to non-static members.</div><div><br></div><div>I couldn't find related discussions in type-annotations-spec-experts. However there's some language in the jsr308 draft about locations where type annotations may appear, which mentions 'scoping mechanisms' and which rules out annotations on qualifiers of static members [1]. The draft section on type_path mentions it distinguishes among locations where "an annotation may appear" [2], which as defined doesn't include qualifiers of static members.</div><div><br></div><div>I see at least two options to reconcile the JVMS, javac, and core reflection.</div><div><br></div><div>(a) Update JVMS 4.7.20.2 to mention non-static members, update core reflection to match, and leave javac's current behaviour as-is.</div><div>(b) Change javac's behaviour to emit type path entries for both static and non-static member classes.</div><div><br></div><div>I think there are a couple of reasons to prefer (a).</div><div>* It results in slightly more efficient class files, with more compact type_path structures.</div><div>* it avoids breaking compatibility with the code javac and ecj have been generating since JDK 8. Changing¬†getAnnotatedOwnerType seems lower-risk since it was added more recently, and (due to the issue we're discussing) doesn't work reliably.</div><div><br></div><div>[1]¬†<a href="https://checkerframework.org/jsr308/specification/java-annotation-design.html#type-names" target="_blank">https://checkerframework.org/jsr308/specification/java-annotation-design.html#type-names</a></div><div>[2]¬†<a href="https://checkerframework.org/jsr308/specification/java-annotation-design.html#class-file%3Aext%3Atype_path" target="_blank">https://checkerframework.org/jsr308/specification/java-annotation-design.html#class-file%3Aext%3Atype_path</a></div></div></div></div></div></div></div>