reducing use of TypeAnnotations constructor

Jonathan Gibbons jonathan.gibbons at oracle.com
Tue Aug 27 11:12:02 PDT 2013


On 08/26/2013 09:55 PM, Jonathan Gibbons wrote:
> On 08/26/2013 07:23 PM, Jonathan Gibbons wrote:
>> Werner,
>>
>> As you know, we're looking to improve the representation of annotated 
>> types in javac, perhaps by replacing AnnotatedType, in order to 
>> reduce "those pesky calls of unannotatedType".
>>
>> I've attached a patch for your consideration to replace direct use of 
>> the AnnotatedType constructor with a factory method on the underlying 
>> type to be annotated.
>>
>> This isn't the whole story about replacing AnnotatedType: just think 
>> of it as clearing out the easy bits first.  I do feel this is a step 
>> in the right direction, and will allow us to focus on the remaining 
>> uses of AnnotatedType.  As such, I may push this to TL soon enough, 
>> but you might want to preview it in the type-annotations forest 
>> before then.
>>
>> And, if you're interested, I'd be interested to hear any suggestions 
>> you may have on further reducing direct use of the TypeAnnotations 
>> type, by replacing such usages with virtual methods on Type, with 
>> appropriate impls in Type and AnnotatedType.
>>
>> -- Jon
>>
>>
>>
>>
>
> Werner,
>
> The next stage in reducing/eliminating the use of AnnotatedType is to 
> work on the two fields it provides, replacing direct access with 
> "reasonable" methods on Type. As far I can see, this is 3/4 easy.
>
> The two fields are typeAnnotations and underlyingType.
>
> Read access to typeAnnotations is available via 
> Type.getAnnotationMirrors() and read access to underlyingType is 
> available via Type.unannotatedType().  Yes, I know we want to get rid 
> of that method eventually, but for now it is convenient to use it. (We 
> can eliminate the method, eventually, when it is effectively a no-op 
> for all types)  So that takes care of read access to the fields of 
> AnnotatedType.
>
> Write access to trickier. It is reasonable to image we could have a 
> method on Type to set the annotations on a type. Such a method can 
> fail with IllegalStateException if the instance does not support 
> mutable annotations (e.g. if it is a shared Type object.) So that one 
> is OK, and that completes my 3 out of 4.
>
> That leaves 7 or so occurrences where you assign directly to 
> AnnotatedType.underlyingType.  I haven't yet been able to figure out 
> the abstract operation you are doing on a type when you change the 
> underlying type of an AnnotatedType -- are you conceptually creating a 
> new annotated type with a different underlying type? Is it important 
> that you mutate the instance?  For example, how hard would it be for 
> you to make the "underlyingType" field final, and fixup the code 
> accordingly?
>
> -- Jon
>
>
>


Werner,

Here's another simplification for you to consider, in TypeAnnotations.  
This is in the typeWithAnnotations method.  I created this cleanup by 
replacing direct use of AnnotatedType with appropriate methods on Type, 
simplified the code a bit, and hoisted identical code out of the then 
and else clauses, to get something that looks a lot cleaner, and doesn't 
not directly reference the AnnotatedType class.     With the 
refactoring, all the jtreg tests pass (of course.)

What do you think?

-- Jon




More information about the type-annotations-dev mailing list