[Checkers] Declarative specification of qualifier hierarchy

Matt Papi mpapi at csail.mit.edu
Wed Mar 26 15:45:25 EDT 2008

Michael Ernst wrote:
>>> I have been working on creating a new 
>>> GraphSubtypeRelation where the checkers would simply specify the subtype 
>>> graph of the annotations.  
>> A quick note: this is an important feature, and since it's been an open 
>> issue for a while, I have some thoughts on its design,
> A declarative specification has a number of advantages.
> Here's an idea that eliminates code from the checker itself:  specify the
> qualifier hierarchy just using meta-annotations, such as
>   @Supertype(Readonly.class)
>   @interface Mutable { ... }
> Also, an @IsDefaultQualifier might specify which annotation is the default
> for backward compatibility.  (This idea of using meta-annotations might
> have come from someone else; I don't remember.)
> I imagine other approaches are possible.
> Perhaps the others could describe their approaches, so that we can choose
> the best design before implementing.

My idea was exactly that -- using meta-annotations. (I don't remember 
whose it was either, but I certainly remember discussing it at a couple 
of meetings.)

In my notes, I had

   @interface Mutable { ... }

   @interface ReadOnly { ... }

   @TypeQualifiers({ReadOnly.class, Mutable.class, ROMaybe.class, ...}
   public class JavariChecker { ... }

and note about checking bidirectionality (if you had Mutable SubtypeOf 
ReadOnly but not ReadOnly SupertypeOf Mutable).

I don't really have a preference w.r.t. using Supertype vs. SubtypeOf, etc.

I like the @IsDefaultQualifier idea.

- Matt

P.S. Incidentally, I just found a note that I'd forgotten about: using 
@ImplicitFor meta-annotations to do some of the work that the overriding 
type factories do. For instance:

@interface NonNull { ... }

and the framework's type factory could apply implicit annotations 

More information about the checkers mailing list