[JSR308] Custom annotations?
Richard Gomes
rgomes1997 at yahoo.co.uk
Sun Feb 10 16:40:08 EST 2008
Hi Mike,
Thank you for your directions.
It should be very convenient to detect that ...
@Rate double rate = 1.0;
@Volatility double vol = rate;
.... cannot compile because the variables are semantically different,
nevertheless both are represented internally as floating point numbers.
I was thinking to create an annotation intended to mark another annotations as
typecasts:
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Typecast {
// Marks other annotations as 'typecasts'
}
It implies to say that the second annotation is simply a tagging interface.
For instance:
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD,
ElementType.LOCAL_VARIABLE,
ElementType.PARAMETER })
@Typecast
public @interface Rate {
// No methods - Tagging annotation
}
Once @Rate, @Volatility, etc are defined as @Typecast, an annotation processor
would include all these annotations in its processing task, in a similar way
that there's an annotation processor which recognizes the specific annotation
@NonNull, for instance.
Do you know if there's something similar already being done by someone else?
(In fact, I have only the idea... no single line of code on it.)
What do you think about this idea?
Thank you again and kind Regards,
--
Richard Gomes
On Thursday 07 February 2008 13:14:17 Michael Ernst wrote:
> Richard-
>
> > I was able to get JSR-308 annotation checkers working fine.
>
> Great! I'm glad to hear that.
>
> > My question is: how can I turn on type checkings relative to the
> > annotations @Rate and @Volatility I've defined?
>
> Please see Section 8, titled "How to write a checker plugin", of the "JSR
> 308 Type-checkers and Framework" document, which is linked from the JSR 308
> webpage (http://groups.csail.mit.edu/pag/jsr308/).
>
> Here are direct links (but they're subject to change, so if at some point
> they do not work, just follow the links from the main JSR 308 page).
> The "JSR 308 Type-checkers and Framework" document is
> http://groups.csail.mit.edu/pag/jsr308/dist/manual.pdf
> http://groups.csail.mit.edu/pag/jsr308/dist/manual.html
> Here's a direct link to Section 8, "How to write a checker plugin":
> http://groups.csail.mit.edu/pag/jsr308/dist/manual.html#writing-a-checker
>
> You'll also find the distributed checkers helpful as examples (especially
> the simple ones like Interned).
>
> If you still have questions after examining these, please ask again, and
> we'll do our best to help.
>
> > public static void main(String[] args) {
> > Main test = new Main();
> > test.allTests(); // Why I've got (defer.invalid) here??? <<<<
> > ===== }
>
> The checker outputs "deref.invalid", not "defer.invalid".
> "deref.invalid" is short for "dereference.invalid", meaning that this
> dereference (namely, invoking a method on the "test" variable) might throw
> an exception at run time.
>
> The reason for this is that the type of the "test" variable is "@Nullable
> Main", meaning that it might be null. You can change the declaration to
> "@NonNull Main" to eliminate the checker warning.
>
> You don't always have to write "@NonNull" for local variables that are
> never null. The checker deduces some such facts for you, and it should do
> so in your example. I've added it to our test suite so it will be
> corrected in a future release.
>
> -Mike
More information about the JSR308
mailing list