blob: e431e76dc32835c2d2ea5db59bdd3564624392b6 [file] [log] [blame]
package org.checkerframework.framework.qual;
import java.lang.annotation.Annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Declares that the field may not be accessed if the receiver is of the specified qualifier type
* (or any supertype).
*
* <p>This property is verified by the checker that type-checks the {@code when} element value
* qualifier.
*
* <p><b>Example</b> Consider a class, {@code Table}, with a locking field, {@code lock}. The lock
* is used when a {@code Table} instance is shared across threads. When running in a local thread,
* the {@code lock} field ought not to be used.
*
* <p>You can declare this behavior in the following way:
*
* <pre>{@code
* class Table {
* private @Unused(when=LocalToThread.class) final Lock lock;
* ...
* }
* }</pre>
*
* The checker for {@code @LocalToThread} would issue an error for the following code:
*
* <pre> @LocalToThread Table table = ...;
* ... table.lock ...;
* </pre>
*
* @checker_framework.manual #unused-fields Unused fields
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface Unused {
/**
* The field that is annotated with @Unused may not be accessed via a receiver that is annotated
* with the "when" annotation.
*/
Class<? extends Annotation> when();
}