package org.checkerframework.checker.signature.qual; import java.lang.annotation.ElementType; import java.lang.annotation.Target; import org.checkerframework.framework.qual.ImplicitFor; import org.checkerframework.framework.qual.SubtypeOf; /** * Represents a binary name as defined in the <a * href="https://docs.oracle.com/javase/specs/jls/se8/html/jls-13.html#jls-13.1">Java Language * Specification, section 13.1</a>. * * <p>For example, in * * <pre> * package org.checkerframework.checker.signature; * public class SignatureChecker { * private class Inner {} * } * </pre> * * the binary names for the two types are org.checkerframework.checker.signature.SignatureChecker * and org.checkerframework.checker.signature.SignatureChecker$Inner. * * <p>Binary names and {@linkplain FullyQualifiedName fully qualified names} are the same for * top-level classes and only differ by '$' vs. '.' for inner classes. * * <p>The binary name should not be confused with the {@linkplain InternalForm internal form}, which * is a variant of the binary name that actually appears in the class file. * * @checker_framework.manual #signature-checker Signature Checker */ @SubtypeOf(SignatureUnknown.class) @ImplicitFor( stringPatterns = "^[A-Za-z_][A-Za-z_0-9]*(\\.[A-Za-z_][A-Za-z_0-9]*)*(\\$[A-Za-z_0-9]+)*(\\[\\])*$" ) @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) public @interface BinaryName {}