package org.checkerframework.checker.interning.qual;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Class declaration to indicate the class does not override {@code equals(Object)}, and therefore
 * {@code a.equals(b)} and {@code a == b} behave identically.
 *
 * <p>A class may be annotated @UsesObjectEquals if neither it, nor any of its supertypes or
 * subtypes, overrides {@code equals}. Therefore, it cannot be written on {@code Object} itself. It
 * is most commonly written on a direct subclass of {@code Object}.
 *
 * <p>This annotation is associated with the {@link
 * org.checkerframework.checker.interning.InterningChecker}.
 *
 * @see org.checkerframework.checker.interning.InterningChecker
 * @checker_framework.manual #interning-checker Interning Checker
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Inherited
public @interface UsesObjectEquals {}
