target_info structure of a method receiver

Joel Borggrén-Franck joel.franck at oracle.com
Fri Sep 19 11:24:08 UTC 2014


Hi Alex,

Ok, I didn’t realize you used the in scope type parameters (shouldn’t it be type variables to be extra precise?) as type arguments. Two comments inline,

On 19 sep 2014, at 00:00, Alex Buckley <alex.buckley at oracle.com> wrote:
> On 9/18/2014 1:25 AM, Joel Borggren-Franck wrote:

>> --- 8< ---
>> 
>> public class Outer<@B T, @C U> {
>> 
>>     class Inner {
>> 
>>        Inner(@A Outer<@NotB T, @NotC U> Outer.this) { ... }
>> 
>>     }
>> }
>> 
>> --- 8< —


>> The type of the receiver parameter Outer<@NotB T, @NotC U> looks like a
>> set of parameterized types to me, not "the type" in singular. Is this
>> problematic?
> 
> The type Outer<@NotB T, @NotC U> is indeed a parameterized type. The quote intends for it to be [a parameterization of] the [generic] class Outer<T,U>. Another plausible type for the receiver parameter is Outer<String,String>. Yet another plausible type is raw Outer. 

Understod. Javac only allows Outer<T, U> as the receiver type (with optimal annotations). Neither Outer<String,String> nor the raw Outer compiles.

>> After this is erased, how should runtime reflection piece together
>> the receiver type? There is no j.l.r.Type subtype that represents a
>> generic class/interface that is not a class/interface declaration. If
>> the receiver type should not be the erased type, is it desirable to
>> represent a set of parameterized types with different type parameter
>> annotations than on the class?
> 
> For your example, I'd expect j.l.r.Constructor#getAnnotatedReceiverType to return a j.l.r.AnnotatedType which exposes @A and is instanceof j.l.r.AnnotatedParameterizedType so you can obtain its annotated type arguments @NotB T and @NotC U. (You happen to have used some in-scope type parameters as the type arguments.)

Unfortunately there is no Signature for the receiver type in the class file for Inner (“LOuter<TT;, TU;>;" doesn’t occur at all in the class file for Inner). If Outer<T, U> (potentially with annotations) is the only possible recover type I can probably work around this in core reflection, if other parameterizations of Outer  should be allowed I need more info in the class file.

cheers
/Joel



More information about the compiler-dev mailing list