[Checkers] Annotation defaults and declarative specification of type hierarchy

Michael Ernst mernst at cs.washington.edu
Thu May 21 23:42:19 EDT 2009


Mahmood-

I see that I can call QualifierDefaults.setAbsoluteDefaults to set the
default annotation for a checker.  It might be nice to permit a type system
designer to write a meta-annotation to specify this.

In particular, I would like to have the following type hierarchy:

             @PrototypeOrNot
            /               \
      (no qualifier)     @Prototype

Furthermore, I would like to avoid writing code.  (This is a mixture of
laziness and trying to understand the limits of specifying a type checker
declaratively.  I really think that users will be afraid of writing code.)

I think I can't do the above (without writing code), but I should be able
to use this type hierarchy

             @PrototypeOrNot
            /               \
      @NonPrototype     @Prototype

and make @NonPrototype the default, like so:

@TypeQualifier
@SubtypeOf(PrototypeOrNot.class)
public @interface Prototype {}

@TypeQualifier
@SubtypeOf(PrototypeOrNot.class)
public @interface NonPrototype {}

@TypeQualifier
@SubtypeOf()
public @interface PrototypeOrNot {}

To make @NonPrototype the default, I would write a meta-annotation somewhat
like @DefaultQualifier.  The meta-annotation really belongs on the checker
itself (or on the command line that invokes the Basic Checker?) but could
perhaps go on @NonPrototype.

What do you think of this?


(Or should I just write the code?)


(Speculation alert:  I wonder if it would be useful to have a @DisjointFrom
annotation as well as a @SubtypeOf annotation.  I really wanted to write
just

@TypeQualifier
@DisjointFrom(Unqualified.class)
public @interface Prototype {}

until I found the ugly usages that required @PrototypeOrNot.  It was just
those usages that made Jeff say that we couldn't just refactor the code
trivially.  Once I get the code fully annotated, then I will be able to
better understand whether we can eliminate @PrototypeOrNot; and if we can,
then we can perhaps eliminate prototype invariants from Daikon.)

I wonder whether this disjointness condition will be a common use case for
the Checker Framework.  If so, we should support it.)

                    -Mike



More information about the checkers mailing list