diff --git a/asm-analysis/src/main/java/org/objectweb/asm/tree/analysis/Analyzer.java b/asm-analysis/src/main/java/org/objectweb/asm/tree/analysis/Analyzer.java index 668a81ef..d50cbbce 100644 --- a/asm-analysis/src/main/java/org/objectweb/asm/tree/analysis/Analyzer.java +++ b/asm-analysis/src/main/java/org/objectweb/asm/tree/analysis/Analyzer.java @@ -27,6 +27,8 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.tree.analysis; +import org.checkerframework.checker.signature.qual.InternalForm; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -103,7 +105,7 @@ public Analyzer(final Interpreter interpreter) { * @throws AnalyzerException if a problem occurs during the analysis. */ @SuppressWarnings("unchecked") - public Frame[] analyze(final String owner, final MethodNode method) throws AnalyzerException { + public Frame[] analyze(final @InternalForm String owner, final MethodNode method) throws AnalyzerException { if ((method.access & (ACC_ABSTRACT | ACC_NATIVE)) != 0) { frames = (Frame[]) new Frame[0]; return frames; @@ -307,7 +309,7 @@ public Frame[] analyze(final String owner, final MethodNode method) throws An * instruction cannot be reached (dead code). * @throws AnalyzerException if a problem occurs during the analysis. */ - public Frame[] analyzeAndComputeMaxs(final String owner, final MethodNode method) + public Frame[] analyzeAndComputeMaxs(final @InternalForm String owner, final MethodNode method) throws AnalyzerException { method.maxLocals = computeMaxLocals(method); method.maxStack = -1; @@ -492,7 +494,7 @@ private void findSubroutine( * @param method the method to be analyzed. * @return the initial execution stack frame of the 'method'. */ - private Frame computeInitialFrame(final String owner, final MethodNode method) { + private Frame computeInitialFrame(final @InternalForm String owner, final MethodNode method) { Frame frame = newFrame(method.maxLocals, method.maxStack); int currentLocal = 0; boolean isInstanceMethod = (method.access & ACC_STATIC) == 0; @@ -552,7 +554,7 @@ public List getHandlers(final int insnIndex) { * @param method the method to be analyzed. * @throws AnalyzerException if a problem occurs. */ - protected void init(final String owner, final MethodNode method) throws AnalyzerException { + protected void init(final @InternalForm String owner, final MethodNode method) throws AnalyzerException { // Nothing to do. } diff --git a/asm-analysis/src/main/java/org/objectweb/asm/tree/analysis/BasicInterpreter.java b/asm-analysis/src/main/java/org/objectweb/asm/tree/analysis/BasicInterpreter.java index 01972b6a..b9f01731 100644 --- a/asm-analysis/src/main/java/org/objectweb/asm/tree/analysis/BasicInterpreter.java +++ b/asm-analysis/src/main/java/org/objectweb/asm/tree/analysis/BasicInterpreter.java @@ -53,6 +53,7 @@ public class BasicInterpreter extends Interpreter implements Opcodes * Special type used for the {@literal null} literal. This is an object reference type with * descriptor 'Lnull;'. */ + @SuppressWarnings("argument") // "null" is not @InternalForm public static final Type NULL_TYPE = Type.getObjectType("null"); /** diff --git a/asm-analysis/src/main/java/org/objectweb/asm/tree/analysis/SimpleVerifier.java b/asm-analysis/src/main/java/org/objectweb/asm/tree/analysis/SimpleVerifier.java index 3e7a0c70..f519a2d1 100644 --- a/asm-analysis/src/main/java/org/objectweb/asm/tree/analysis/SimpleVerifier.java +++ b/asm-analysis/src/main/java/org/objectweb/asm/tree/analysis/SimpleVerifier.java @@ -437,6 +437,7 @@ protected boolean isAssignableFrom(final Type type1, final Type type2) { * @param type an object reference type (i.e., with Type.OBJECT sort). * @return the class corresponding to 'type'. */ + @SuppressWarnings("argument") // "e.toString()" is @FullyQualifiedName ? protected Class getClass(final Type type) { try { if (type.getSort() == Type.ARRAY) { diff --git a/asm-analysis/src/test/java/org/objectweb/asm/tree/analysis/MethodNodeBuilder.java b/asm-analysis/src/test/java/org/objectweb/asm/tree/analysis/MethodNodeBuilder.java index 6051488a..a87e7f93 100644 --- a/asm-analysis/src/test/java/org/objectweb/asm/tree/analysis/MethodNodeBuilder.java +++ b/asm-analysis/src/test/java/org/objectweb/asm/tree/analysis/MethodNodeBuilder.java @@ -75,7 +75,7 @@ MethodNodeBuilder typeInsn(final int opcode, final String operand) { MethodNodeBuilder methodInsn( final int opcode, - final String owner, + final @InternalForm String owner, final String name, final String descriptor, final boolean isInterface) { diff --git a/asm-analysis/src/test/java/org/objectweb/asm/tree/analysis/SimpleVerifierTest.java b/asm-analysis/src/test/java/org/objectweb/asm/tree/analysis/SimpleVerifierTest.java index 034ade19..99f95a12 100644 --- a/asm-analysis/src/test/java/org/objectweb/asm/tree/analysis/SimpleVerifierTest.java +++ b/asm-analysis/src/test/java/org/objectweb/asm/tree/analysis/SimpleVerifierTest.java @@ -62,7 +62,7 @@ void testConstructor() { "java/util/Map, java/util/List, java/lang/Object" }) void testMerge_objectTypes( - final String internalName1, final String internalName2, final String expectedInternalName) { + final @InternalForm String internalName1, final @InternalForm String internalName2, final @InternalForm String expectedInternalName) { BasicValue value1 = new BasicValue(Type.getObjectType(internalName1)); BasicValue value2 = new BasicValue(Type.getObjectType(internalName2)); SimpleVerifier verifier = new SimpleVerifier(); diff --git a/asm-commons/src/main/java/org/objectweb/asm/commons/AdviceAdapter.java b/asm-commons/src/main/java/org/objectweb/asm/commons/AdviceAdapter.java index 8f1ad1b8..15686245 100644 --- a/asm-commons/src/main/java/org/objectweb/asm/commons/AdviceAdapter.java +++ b/asm-commons/src/main/java/org/objectweb/asm/commons/AdviceAdapter.java @@ -27,6 +27,11 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.commons; +import org.checkerframework.checker.signature.qual.MethodDescriptor; +import org.checkerframework.checker.signature.qual.FieldDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.InternalForm; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -364,7 +369,7 @@ public void visitVarInsn(final int opcode, final int varIndex) { @Override public void visitFieldInsn( - final int opcode, final String owner, final String name, final String descriptor) { + final int opcode, final @InternalForm String owner, final @Identifier String name, final @FieldDescriptor String descriptor) { super.visitFieldInsn(opcode, owner, name, descriptor); if (isConstructor && !superClassConstructorCalled) { char firstDescriptorChar = descriptor.charAt(0); @@ -422,7 +427,7 @@ public void visitLdcInsn(final Object value) { } @Override - public void visitMultiANewArrayInsn(final String descriptor, final int numDimensions) { + public void visitMultiANewArrayInsn(final @FieldDescriptor String descriptor, final int numDimensions) { super.visitMultiANewArrayInsn(descriptor, numDimensions); if (isConstructor && !superClassConstructorCalled) { for (int i = 0; i < numDimensions; i++) { @@ -433,7 +438,7 @@ public void visitMultiANewArrayInsn(final String descriptor, final int numDimens } @Override - public void visitTypeInsn(final int opcode, final String type) { + public void visitTypeInsn(final int opcode, final @InternalForm String type) { super.visitTypeInsn(opcode, type); // ANEWARRAY, CHECKCAST or INSTANCEOF don't change stack. if (isConstructor && !superClassConstructorCalled && opcode == NEW) { @@ -444,9 +449,9 @@ public void visitTypeInsn(final int opcode, final String type) { @Override public void visitMethodInsn( final int opcodeAndSource, - final String owner, - final String name, - final String descriptor, + final @InternalForm String owner, + final @Identifier String name, + final @MethodDescriptor String descriptor, final boolean isInterface) { if (api < Opcodes.ASM5 && (opcodeAndSource & Opcodes.SOURCE_DEPRECATED) == 0) { // Redirect the call to the deprecated version of this method. @@ -498,7 +503,7 @@ private void doVisitMethodInsn(final int opcode, final String name, final String @Override public void visitInvokeDynamicInsn( final String name, - final String descriptor, + final @MethodDescriptor String descriptor, final Handle bootstrapMethodHandle, final Object... bootstrapMethodArguments) { super.visitInvokeDynamicInsn(name, descriptor, bootstrapMethodHandle, bootstrapMethodArguments); @@ -567,7 +572,7 @@ public void visitTableSwitchInsn( @Override public void visitTryCatchBlock( - final Label start, final Label end, final Label handler, final String type) { + final Label start, final Label end, final Label handler, final @InternalForm String type) { super.visitTryCatchBlock(start, end, handler, type); // By definition of 'forwardJumpStackFrames', 'handler' should be pushed only if there is an // instruction between 'start' and 'end' at which the super class constructor is not yet diff --git a/asm-commons/src/main/java/org/objectweb/asm/commons/AnalyzerAdapter.java b/asm-commons/src/main/java/org/objectweb/asm/commons/AnalyzerAdapter.java index c97a79e2..0b33715e 100644 --- a/asm-commons/src/main/java/org/objectweb/asm/commons/AnalyzerAdapter.java +++ b/asm-commons/src/main/java/org/objectweb/asm/commons/AnalyzerAdapter.java @@ -27,6 +27,11 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.commons; +import org.checkerframework.checker.signature.qual.MethodDescriptor; +import org.checkerframework.checker.signature.qual.FieldDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.InternalForm; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -97,7 +102,7 @@ public class AnalyzerAdapter extends MethodVisitor { private int maxLocals; /** The owner's class name. */ - private String owner; + private @InternalForm String owner; /** * Constructs a new {@link AnalyzerAdapter}. Subclasses must not use this constructor. @@ -113,7 +118,7 @@ public class AnalyzerAdapter extends MethodVisitor { * @throws IllegalStateException If a subclass calls this constructor. */ public AnalyzerAdapter( - final String owner, + final @InternalForm String owner, final int access, final String name, final String descriptor, @@ -138,7 +143,7 @@ public AnalyzerAdapter( */ protected AnalyzerAdapter( final int api, - final String owner, + final @InternalForm String owner, final int access, final String name, final String descriptor, @@ -256,7 +261,7 @@ public void visitVarInsn(final int opcode, final int varIndex) { } @Override - public void visitTypeInsn(final int opcode, final String type) { + public void visitTypeInsn(final int opcode, final @InternalForm String type) { if (opcode == Opcodes.NEW) { if (labels == null) { Label label = new Label(); @@ -276,7 +281,7 @@ public void visitTypeInsn(final int opcode, final String type) { @Override public void visitFieldInsn( - final int opcode, final String owner, final String name, final String descriptor) { + final int opcode, final @InternalForm String owner, final @Identifier String name, final @FieldDescriptor String descriptor) { super.visitFieldInsn(opcode, owner, name, descriptor); execute(opcode, 0, descriptor); } @@ -284,9 +289,9 @@ public void visitFieldInsn( @Override public void visitMethodInsn( final int opcodeAndSource, - final String owner, - final String name, - final String descriptor, + final @InternalForm String owner, + final @Identifier String name, + final @MethodDescriptor String descriptor, final boolean isInterface) { if (api < Opcodes.ASM5 && (opcodeAndSource & Opcodes.SOURCE_DEPRECATED) == 0) { // Redirect the call to the deprecated version of this method. @@ -329,7 +334,7 @@ public void visitMethodInsn( @Override public void visitInvokeDynamicInsn( final String name, - final String descriptor, + final @MethodDescriptor String descriptor, final Handle bootstrapMethodHandle, final Object... bootstrapMethodArguments) { super.visitInvokeDynamicInsn(name, descriptor, bootstrapMethodHandle, bootstrapMethodArguments); @@ -424,15 +429,15 @@ public void visitLookupSwitchInsn(final Label dflt, final int[] keys, final Labe } @Override - public void visitMultiANewArrayInsn(final String descriptor, final int numDimensions) { + public void visitMultiANewArrayInsn(final @FieldDescriptor String descriptor, final int numDimensions) { super.visitMultiANewArrayInsn(descriptor, numDimensions); execute(Opcodes.MULTIANEWARRAY, numDimensions, descriptor); } @Override public void visitLocalVariable( - final String name, - final String descriptor, + final @Identifier String name, + final @FieldDescriptor String descriptor, final String signature, final Label start, final Label end, @@ -892,11 +897,11 @@ private void execute(final int opcode, final int intArg, final String stringArg) break; case Opcodes.ANEWARRAY: pop(); - pushDescriptor("[" + Type.getObjectType(stringArg)); + pushDescriptor((@InternalForm String)("[" + Type.getObjectType((@InternalForm String) stringArg))); break; case Opcodes.CHECKCAST: pop(); - pushDescriptor(Type.getObjectType(stringArg).getDescriptor()); + pushDescriptor(Type.getObjectType((@InternalForm String) stringArg).getDescriptor()); break; case Opcodes.MULTIANEWARRAY: pop(intArg); diff --git a/asm-commons/src/main/java/org/objectweb/asm/commons/AnnotationRemapper.java b/asm-commons/src/main/java/org/objectweb/asm/commons/AnnotationRemapper.java index fa41dc69..82204157 100644 --- a/asm-commons/src/main/java/org/objectweb/asm/commons/AnnotationRemapper.java +++ b/asm-commons/src/main/java/org/objectweb/asm/commons/AnnotationRemapper.java @@ -28,6 +28,8 @@ package org.objectweb.asm.commons; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.FieldDescriptor; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.Opcodes; @@ -42,7 +44,7 @@ public class AnnotationRemapper extends AnnotationVisitor { * The descriptor of the visited annotation. May be {@literal null}, for instance for * AnnotationDefault. */ - protected final String descriptor; + protected final @FieldDescriptor String descriptor; /** The remapper used to remap the types in the visited annotation. */ protected final Remapper remapper; @@ -70,7 +72,7 @@ public AnnotationRemapper(final AnnotationVisitor annotationVisitor, final Remap * @param remapper the remapper to use to remap the types in the visited annotation. */ public AnnotationRemapper( - final String descriptor, final AnnotationVisitor annotationVisitor, final Remapper remapper) { + final @FieldDescriptor String descriptor, final AnnotationVisitor annotationVisitor, final Remapper remapper) { this(/* latest api = */ Opcodes.ASM9, descriptor, annotationVisitor, remapper); } @@ -100,7 +102,7 @@ protected AnnotationRemapper( */ protected AnnotationRemapper( final int api, - final String descriptor, + final @FieldDescriptor String descriptor, final AnnotationVisitor annotationVisitor, final Remapper remapper) { super(api, annotationVisitor); @@ -109,17 +111,17 @@ protected AnnotationRemapper( } @Override - public void visit(final String name, final Object value) { + public void visit(final @Identifier String name, final Object value) { super.visit(mapAnnotationAttributeName(name), remapper.mapValue(value)); } @Override - public void visitEnum(final String name, final String descriptor, final String value) { + public void visitEnum(final @Identifier String name, final @FieldDescriptor String descriptor, final String value) { super.visitEnum(mapAnnotationAttributeName(name), remapper.mapDesc(descriptor), value); } @Override - public AnnotationVisitor visitAnnotation(final String name, final String descriptor) { + public AnnotationVisitor visitAnnotation(final @Identifier String name, final @FieldDescriptor String descriptor) { AnnotationVisitor annotationVisitor = super.visitAnnotation(mapAnnotationAttributeName(name), remapper.mapDesc(descriptor)); if (annotationVisitor == null) { @@ -132,7 +134,7 @@ public AnnotationVisitor visitAnnotation(final String name, final String descrip } @Override - public AnnotationVisitor visitArray(final String name) { + public AnnotationVisitor visitArray(final @Identifier String name) { AnnotationVisitor annotationVisitor = super.visitArray(mapAnnotationAttributeName(name)); if (annotationVisitor == null) { return null; @@ -165,7 +167,7 @@ protected AnnotationVisitor createAnnotationRemapper(final AnnotationVisitor ann * @return the newly created remapper. */ protected AnnotationVisitor createAnnotationRemapper( - final String descriptor, final AnnotationVisitor annotationVisitor) { + final @FieldDescriptor String descriptor, final AnnotationVisitor annotationVisitor) { return new AnnotationRemapper(api, descriptor, annotationVisitor, remapper) .orDeprecatedValue(createAnnotationRemapper(annotationVisitor)); } @@ -201,7 +203,7 @@ final AnnotationVisitor orDeprecatedValue(final AnnotationVisitor deprecatedAnno * @param name the name of the annotation attribute. * @return the new name of the annotation attribute. */ - private String mapAnnotationAttributeName(final String name) { + private @Identifier String mapAnnotationAttributeName(final @Identifier String name) { if (descriptor == null) { return name; } diff --git a/asm-commons/src/main/java/org/objectweb/asm/commons/ClassRemapper.java b/asm-commons/src/main/java/org/objectweb/asm/commons/ClassRemapper.java index baea2c81..0a07bff9 100644 --- a/asm-commons/src/main/java/org/objectweb/asm/commons/ClassRemapper.java +++ b/asm-commons/src/main/java/org/objectweb/asm/commons/ClassRemapper.java @@ -28,6 +28,13 @@ package org.objectweb.asm.commons; +import org.checkerframework.checker.signature.qual.DotSeparatedIdentifiers; +import org.checkerframework.checker.signature.qual.MethodDescriptor; +import org.checkerframework.checker.signature.qual.FieldDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.InternalForm; +import org.checkerframework.checker.nullness.qual.Nullable; + import java.util.List; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.Attribute; @@ -64,7 +71,7 @@ public class ClassRemapper extends ClassVisitor { protected final Remapper remapper; /** The internal name of the visited class. */ - protected String className; + protected @InternalForm String className; /** * Constructs a new {@link ClassRemapper}. Subclasses must not use this constructor. @@ -94,10 +101,10 @@ protected ClassRemapper(final int api, final ClassVisitor classVisitor, final Re public void visit( final int version, final int access, - final String name, + final @InternalForm String name, final String signature, - final String superName, - final String[] interfaces) { + final @InternalForm String superName, + final @InternalForm String @Nullable [] interfaces) { this.className = name; super.visit( version, @@ -109,13 +116,13 @@ public void visit( } @Override - public ModuleVisitor visitModule(final String name, final int flags, final String version) { + public ModuleVisitor visitModule(final @DotSeparatedIdentifiers String name, final int flags, final String version) { ModuleVisitor moduleVisitor = super.visitModule(remapper.mapModuleName(name), flags, version); return moduleVisitor == null ? null : createModuleRemapper(moduleVisitor); } @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { AnnotationVisitor annotationVisitor = super.visitAnnotation(remapper.mapDesc(descriptor), visible); return annotationVisitor == null @@ -125,7 +132,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean @Override public AnnotationVisitor visitTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { AnnotationVisitor annotationVisitor = super.visitTypeAnnotation(typeRef, typePath, remapper.mapDesc(descriptor), visible); return annotationVisitor == null @@ -137,7 +144,7 @@ public AnnotationVisitor visitTypeAnnotation( public void visitAttribute(final Attribute attribute) { if (attribute instanceof ModuleHashesAttribute) { ModuleHashesAttribute moduleHashesAttribute = (ModuleHashesAttribute) attribute; - List modules = moduleHashesAttribute.modules; + List<@DotSeparatedIdentifiers String> modules = moduleHashesAttribute.modules; for (int i = 0; i < modules.size(); ++i) { modules.set(i, remapper.mapModuleName(modules.get(i))); } @@ -147,7 +154,7 @@ public void visitAttribute(final Attribute attribute) { @Override public RecordComponentVisitor visitRecordComponent( - final String name, final String descriptor, final String signature) { + final @Identifier String name, final @FieldDescriptor String descriptor, final String signature) { RecordComponentVisitor recordComponentVisitor = super.visitRecordComponent( remapper.mapRecordComponentName(className, name, descriptor), @@ -161,8 +168,8 @@ public RecordComponentVisitor visitRecordComponent( @Override public FieldVisitor visitField( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @FieldDescriptor String descriptor, final String signature, final Object value) { FieldVisitor fieldVisitor = @@ -178,10 +185,10 @@ public FieldVisitor visitField( @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { String remappedDescriptor = remapper.mapMethodDesc(descriptor); MethodVisitor methodVisitor = super.visitMethod( @@ -194,8 +201,9 @@ public MethodVisitor visitMethod( } @Override + @SuppressWarnings("signature:argument") // is an inner name an @Identifier or an @InternalForm?? public void visitInnerClass( - final String name, final String outerName, final String innerName, final int access) { + final @InternalForm String name, final @InternalForm String outerName, final @Identifier String innerName, final int access) { super.visitInnerClass( remapper.mapType(name), outerName == null ? null : remapper.mapType(outerName), @@ -204,7 +212,7 @@ public void visitInnerClass( } @Override - public void visitOuterClass(final String owner, final String name, final String descriptor) { + public void visitOuterClass(final @InternalForm String owner, final @Nullable @Identifier String name, final @MethodDescriptor String descriptor) { super.visitOuterClass( remapper.mapType(owner), name == null ? null : remapper.mapMethodName(owner, name, descriptor), @@ -212,17 +220,17 @@ public void visitOuterClass(final String owner, final String name, final String } @Override - public void visitNestHost(final String nestHost) { + public void visitNestHost(final @InternalForm String nestHost) { super.visitNestHost(remapper.mapType(nestHost)); } @Override - public void visitNestMember(final String nestMember) { + public void visitNestMember(final @InternalForm String nestMember) { super.visitNestMember(remapper.mapType(nestMember)); } @Override - public void visitPermittedSubclass(final String permittedSubclass) { + public void visitPermittedSubclass(final @InternalForm String permittedSubclass) { super.visitPermittedSubclass(remapper.mapType(permittedSubclass)); } @@ -270,7 +278,7 @@ protected AnnotationVisitor createAnnotationRemapper(final AnnotationVisitor ann * @return the newly created remapper. */ protected AnnotationVisitor createAnnotationRemapper( - final String descriptor, final AnnotationVisitor annotationVisitor) { + final @FieldDescriptor String descriptor, final AnnotationVisitor annotationVisitor) { return new AnnotationRemapper(api, descriptor, annotationVisitor, remapper) .orDeprecatedValue(createAnnotationRemapper(annotationVisitor)); } diff --git a/asm-commons/src/main/java/org/objectweb/asm/commons/CodeSizeEvaluator.java b/asm-commons/src/main/java/org/objectweb/asm/commons/CodeSizeEvaluator.java index 148ad6ba..01bf7e76 100644 --- a/asm-commons/src/main/java/org/objectweb/asm/commons/CodeSizeEvaluator.java +++ b/asm-commons/src/main/java/org/objectweb/asm/commons/CodeSizeEvaluator.java @@ -27,6 +27,11 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.commons; +import org.checkerframework.checker.signature.qual.MethodDescriptor; +import org.checkerframework.checker.signature.qual.FieldDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.InternalForm; + import org.objectweb.asm.ConstantDynamic; import org.objectweb.asm.Handle; import org.objectweb.asm.Label; @@ -97,7 +102,7 @@ public void visitVarInsn(final int opcode, final int varIndex) { } @Override - public void visitTypeInsn(final int opcode, final String type) { + public void visitTypeInsn(final int opcode, final @InternalForm String type) { minSize += 3; maxSize += 3; super.visitTypeInsn(opcode, type); @@ -105,7 +110,7 @@ public void visitTypeInsn(final int opcode, final String type) { @Override public void visitFieldInsn( - final int opcode, final String owner, final String name, final String descriptor) { + final int opcode, final @InternalForm String owner, final @Identifier String name, final @FieldDescriptor String descriptor) { minSize += 3; maxSize += 3; super.visitFieldInsn(opcode, owner, name, descriptor); @@ -114,9 +119,9 @@ public void visitFieldInsn( @Override public void visitMethodInsn( final int opcodeAndSource, - final String owner, - final String name, - final String descriptor, + final @InternalForm String owner, + final @Identifier String name, + final @MethodDescriptor String descriptor, final boolean isInterface) { if (api < Opcodes.ASM5 && (opcodeAndSource & Opcodes.SOURCE_DEPRECATED) == 0) { // Redirect the call to the deprecated version of this method. @@ -138,7 +143,7 @@ public void visitMethodInsn( @Override public void visitInvokeDynamicInsn( final String name, - final String descriptor, + final @MethodDescriptor String descriptor, final Handle bootstrapMethodHandle, final Object... bootstrapMethodArguments) { minSize += 5; @@ -199,7 +204,7 @@ public void visitLookupSwitchInsn(final Label dflt, final int[] keys, final Labe } @Override - public void visitMultiANewArrayInsn(final String descriptor, final int numDimensions) { + public void visitMultiANewArrayInsn(final @FieldDescriptor String descriptor, final int numDimensions) { minSize += 4; maxSize += 4; super.visitMultiANewArrayInsn(descriptor, numDimensions); diff --git a/asm-commons/src/main/java/org/objectweb/asm/commons/FieldRemapper.java b/asm-commons/src/main/java/org/objectweb/asm/commons/FieldRemapper.java index e65650c7..34d1d697 100644 --- a/asm-commons/src/main/java/org/objectweb/asm/commons/FieldRemapper.java +++ b/asm-commons/src/main/java/org/objectweb/asm/commons/FieldRemapper.java @@ -28,6 +28,7 @@ package org.objectweb.asm.commons; +import org.checkerframework.checker.signature.qual.FieldDescriptor; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.FieldVisitor; import org.objectweb.asm.Opcodes; @@ -68,7 +69,7 @@ protected FieldRemapper(final int api, final FieldVisitor fieldVisitor, final Re } @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { AnnotationVisitor annotationVisitor = super.visitAnnotation(remapper.mapDesc(descriptor), visible); return annotationVisitor == null @@ -78,7 +79,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean @Override public AnnotationVisitor visitTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { AnnotationVisitor annotationVisitor = super.visitTypeAnnotation(typeRef, typePath, remapper.mapDesc(descriptor), visible); return annotationVisitor == null @@ -108,7 +109,7 @@ protected AnnotationVisitor createAnnotationRemapper(final AnnotationVisitor ann * @return the newly created remapper. */ protected AnnotationVisitor createAnnotationRemapper( - final String descriptor, final AnnotationVisitor annotationVisitor) { + final @FieldDescriptor String descriptor, final AnnotationVisitor annotationVisitor) { return new AnnotationRemapper(api, descriptor, annotationVisitor, remapper) .orDeprecatedValue(createAnnotationRemapper(annotationVisitor)); } diff --git a/asm-commons/src/main/java/org/objectweb/asm/commons/GeneratorAdapter.java b/asm-commons/src/main/java/org/objectweb/asm/commons/GeneratorAdapter.java index 1b90115c..48c968d4 100644 --- a/asm-commons/src/main/java/org/objectweb/asm/commons/GeneratorAdapter.java +++ b/asm-commons/src/main/java/org/objectweb/asm/commons/GeneratorAdapter.java @@ -27,6 +27,10 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.commons; +import org.checkerframework.checker.signature.qual.MethodDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.InternalForm; + import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -278,8 +282,8 @@ public GeneratorAdapter( * @param types a set of types. * @return the internal names of the given types (see {@link Type#getInternalName()}). */ - private static String[] getInternalNames(final Type[] types) { - String[] names = new String[types.length]; + private static @InternalForm String[] getInternalNames(final Type[] types) { + @InternalForm String[] names = new String[types.length]; for (int i = 0; i < names.length; ++i) { names[i] = types[i].getInternalName(); } @@ -817,7 +821,7 @@ public void box(final Type type) { dupX1(); swap(); } - invokeConstructor(boxedType, new Method("", Type.VOID_TYPE, new Type[] {type})); + invokeConstructor(boxedType, new Method((@Identifier String) "", Type.VOID_TYPE, new Type[] {type})); } } @@ -1124,7 +1128,7 @@ public void returnValue() { * @param fieldType the type of the field. */ private void fieldInsn( - final int opcode, final Type ownerType, final String name, final Type fieldType) { + final int opcode, final Type ownerType, final @Identifier String name, final Type fieldType) { mv.visitFieldInsn(opcode, ownerType.getInternalName(), name, fieldType.getDescriptor()); } @@ -1135,7 +1139,7 @@ private void fieldInsn( * @param name the name of the field. * @param type the type of the field. */ - public void getStatic(final Type owner, final String name, final Type type) { + public void getStatic(final Type owner, final @Identifier String name, final Type type) { fieldInsn(Opcodes.GETSTATIC, owner, name, type); } @@ -1146,7 +1150,7 @@ public void getStatic(final Type owner, final String name, final Type type) { * @param name the name of the field. * @param type the type of the field. */ - public void putStatic(final Type owner, final String name, final Type type) { + public void putStatic(final Type owner, final @Identifier String name, final Type type) { fieldInsn(Opcodes.PUTSTATIC, owner, name, type); } @@ -1157,7 +1161,7 @@ public void putStatic(final Type owner, final String name, final Type type) { * @param name the name of the field. * @param type the type of the field. */ - public void getField(final Type owner, final String name, final Type type) { + public void getField(final Type owner, final @Identifier String name, final Type type) { fieldInsn(Opcodes.GETFIELD, owner, name, type); } @@ -1168,7 +1172,7 @@ public void getField(final Type owner, final String name, final Type type) { * @param name the name of the field. * @param type the type of the field. */ - public void putField(final Type owner, final String name, final Type type) { + public void putField(final Type owner, final @Identifier String name, final Type type) { fieldInsn(Opcodes.PUTFIELD, owner, name, type); } @@ -1186,7 +1190,7 @@ public void putField(final Type owner, final String name, final Type type) { */ private void invokeInsn( final int opcode, final Type type, final Method method, final boolean isInterface) { - String owner = type.getSort() == Type.ARRAY ? type.getDescriptor() : type.getInternalName(); + @InternalForm String owner = type.getSort() == Type.ARRAY ? type.getDescriptor() : type.getInternalName(); mv.visitMethodInsn(opcode, owner, method.getName(), method.getDescriptor(), isInterface); } @@ -1243,7 +1247,7 @@ public void invokeInterface(final Type owner, final Method method) { */ public void invokeDynamic( final String name, - final String descriptor, + final @MethodDescriptor String descriptor, final Handle bootstrapMethodHandle, final Object... bootstrapMethodArguments) { mv.visitInvokeDynamicInsn(name, descriptor, bootstrapMethodHandle, bootstrapMethodArguments); @@ -1357,7 +1361,7 @@ public void endMethod() { * * @param start beginning of the exception handler's scope (inclusive). * @param end end of the exception handler's scope (exclusive). - * @param exception internal name of the type of exceptions handled by the handler (see {@link + * @param exception the type of exceptions handled by the handler (see {@link * Type#getInternalName()}). */ public void catchException(final Label start, final Label end, final Type exception) { diff --git a/asm-commons/src/main/java/org/objectweb/asm/commons/InstructionAdapter.java b/asm-commons/src/main/java/org/objectweb/asm/commons/InstructionAdapter.java index afe8d689..7b6b57ac 100644 --- a/asm-commons/src/main/java/org/objectweb/asm/commons/InstructionAdapter.java +++ b/asm-commons/src/main/java/org/objectweb/asm/commons/InstructionAdapter.java @@ -28,6 +28,11 @@ package org.objectweb.asm.commons; +import org.checkerframework.checker.signature.qual.MethodDescriptor; +import org.checkerframework.checker.signature.qual.FieldDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.InternalForm; + import org.objectweb.asm.ConstantDynamic; import org.objectweb.asm.Handle; import org.objectweb.asm.Label; @@ -465,7 +470,7 @@ public void visitVarInsn(final int opcode, final int varIndex) { } @Override - public void visitTypeInsn(final int opcode, final String type) { + public void visitTypeInsn(final int opcode, final @InternalForm String type) { Type objectType = Type.getObjectType(type); switch (opcode) { case Opcodes.NEW: @@ -487,7 +492,7 @@ public void visitTypeInsn(final int opcode, final String type) { @Override public void visitFieldInsn( - final int opcode, final String owner, final String name, final String descriptor) { + final int opcode, final @InternalForm String owner, final @Identifier String name, final @FieldDescriptor String descriptor) { switch (opcode) { case Opcodes.GETSTATIC: getstatic(owner, name, descriptor); @@ -509,9 +514,9 @@ public void visitFieldInsn( @Override public void visitMethodInsn( final int opcodeAndSource, - final String owner, - final String name, - final String descriptor, + final @InternalForm String owner, + final @Identifier String name, + final @MethodDescriptor String descriptor, final boolean isInterface) { if (api < Opcodes.ASM5 && (opcodeAndSource & Opcodes.SOURCE_DEPRECATED) == 0) { // Redirect the call to the deprecated version of this method. @@ -541,7 +546,7 @@ public void visitMethodInsn( @Override public void visitInvokeDynamicInsn( final String name, - final String descriptor, + final @MethodDescriptor String descriptor, final Handle bootstrapMethodHandle, final Object... bootstrapMethodArguments) { invokedynamic(name, descriptor, bootstrapMethodHandle, bootstrapMethodArguments); @@ -619,7 +624,7 @@ public void visitLdcInsn(final Object value) { if (api < Opcodes.ASM5 && (value instanceof Handle || (value instanceof Type && ((Type) value).getSort() == Type.METHOD))) { - throw new UnsupportedOperationException("This feature requires ASM5"); + throw new UnsupportedOperationException("visitLdcInsn requires ASM5, found " + (api >> 16)); } if (api < Opcodes.ASM7 && value instanceof ConstantDynamic) { throw new UnsupportedOperationException("This feature requires ASM7"); @@ -670,7 +675,7 @@ public void visitLookupSwitchInsn(final Label dflt, final int[] keys, final Labe } @Override - public void visitMultiANewArrayInsn(final String descriptor, final int numDimensions) { + public void visitMultiANewArrayInsn(final @FieldDescriptor String descriptor, final int numDimensions) { multianewarray(descriptor, numDimensions); } @@ -1044,19 +1049,19 @@ public void areturn(final Type type) { mv.visitInsn(type.getOpcode(Opcodes.IRETURN)); } - public void getstatic(final String owner, final String name, final String descriptor) { + public void getstatic(final @InternalForm String owner, final @Identifier String name, final @FieldDescriptor String descriptor) { mv.visitFieldInsn(Opcodes.GETSTATIC, owner, name, descriptor); } - public void putstatic(final String owner, final String name, final String descriptor) { + public void putstatic(final @InternalForm String owner, final @Identifier String name, final @FieldDescriptor String descriptor) { mv.visitFieldInsn(Opcodes.PUTSTATIC, owner, name, descriptor); } - public void getfield(final String owner, final String name, final String descriptor) { + public void getfield(final @InternalForm String owner, final @Identifier String name, final @FieldDescriptor String descriptor) { mv.visitFieldInsn(Opcodes.GETFIELD, owner, name, descriptor); } - public void putfield(final String owner, final String name, final String descriptor) { + public void putfield(final @InternalForm String owner, final @Identifier String name, final @FieldDescriptor String descriptor) { mv.visitFieldInsn(Opcodes.PUTFIELD, owner, name, descriptor); } @@ -1070,7 +1075,7 @@ public void putfield(final String owner, final String name, final String descrip * @deprecated use {@link #invokevirtual(String, String, String, boolean)} instead. */ @Deprecated - public void invokevirtual(final String owner, final String name, final String descriptor) { + public void invokevirtual(final @InternalForm String owner, final @Identifier String name, final @MethodDescriptor String descriptor) { if (api >= Opcodes.ASM5) { invokevirtual(owner, name, descriptor, false); return; @@ -1088,7 +1093,7 @@ public void invokevirtual(final String owner, final String name, final String de * @param isInterface if the method's owner class is an interface. */ public void invokevirtual( - final String owner, final String name, final String descriptor, final boolean isInterface) { + final @InternalForm String owner, final @Identifier String name, final @MethodDescriptor String descriptor, final boolean isInterface) { if (api < Opcodes.ASM5) { if (isInterface) { throw new UnsupportedOperationException("INVOKEVIRTUAL on interfaces require ASM 5"); @@ -1109,7 +1114,7 @@ public void invokevirtual( * @deprecated use {@link #invokespecial(String, String, String, boolean)} instead. */ @Deprecated - public void invokespecial(final String owner, final String name, final String descriptor) { + public void invokespecial(final @InternalForm String owner, final @Identifier String name, final @MethodDescriptor String descriptor) { if (api >= Opcodes.ASM5) { invokespecial(owner, name, descriptor, false); return; @@ -1127,7 +1132,7 @@ public void invokespecial(final String owner, final String name, final String de * @param isInterface if the method's owner class is an interface. */ public void invokespecial( - final String owner, final String name, final String descriptor, final boolean isInterface) { + final @InternalForm String owner, final @Identifier String name, final @MethodDescriptor String descriptor, final boolean isInterface) { if (api < Opcodes.ASM5) { if (isInterface) { throw new UnsupportedOperationException("INVOKESPECIAL on interfaces require ASM 5"); @@ -1148,7 +1153,7 @@ public void invokespecial( * @deprecated use {@link #invokestatic(String, String, String, boolean)} instead. */ @Deprecated - public void invokestatic(final String owner, final String name, final String descriptor) { + public void invokestatic(final @InternalForm String owner, final @Identifier String name, final @MethodDescriptor String descriptor) { if (api >= Opcodes.ASM5) { invokestatic(owner, name, descriptor, false); return; @@ -1166,7 +1171,7 @@ public void invokestatic(final String owner, final String name, final String des * @param isInterface if the method's owner class is an interface. */ public void invokestatic( - final String owner, final String name, final String descriptor, final boolean isInterface) { + final @InternalForm String owner, final @Identifier String name, final @MethodDescriptor String descriptor, final boolean isInterface) { if (api < Opcodes.ASM5) { if (isInterface) { throw new UnsupportedOperationException("INVOKESTATIC on interfaces require ASM 5"); @@ -1185,7 +1190,7 @@ public void invokestatic( * @param name the method's name. * @param descriptor the method's descriptor (see {@link Type}). */ - public void invokeinterface(final String owner, final String name, final String descriptor) { + public void invokeinterface(final @InternalForm String owner, final @Identifier String name, final @MethodDescriptor String descriptor) { mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, owner, name, descriptor, true); } @@ -1202,7 +1207,7 @@ public void invokeinterface(final String owner, final String name, final String */ public void invokedynamic( final String name, - final String descriptor, + final @MethodDescriptor String descriptor, final Handle bootstrapMethodHandle, final Object[] bootstrapMethodArguments) { mv.visitInvokeDynamicInsn(name, descriptor, bootstrapMethodHandle, bootstrapMethodArguments); @@ -1285,7 +1290,7 @@ public void monitorexit() { mv.visitInsn(Opcodes.MONITOREXIT); } - public void multianewarray(final String descriptor, final int numDimensions) { + public void multianewarray(final @FieldDescriptor String descriptor, final int numDimensions) { mv.visitMultiANewArrayInsn(descriptor, numDimensions); } diff --git a/asm-commons/src/main/java/org/objectweb/asm/commons/JSRInlinerAdapter.java b/asm-commons/src/main/java/org/objectweb/asm/commons/JSRInlinerAdapter.java index cdcbd9fc..8c1cc45d 100644 --- a/asm-commons/src/main/java/org/objectweb/asm/commons/JSRInlinerAdapter.java +++ b/asm-commons/src/main/java/org/objectweb/asm/commons/JSRInlinerAdapter.java @@ -27,6 +27,11 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.commons; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.MethodDescriptor; +import org.checkerframework.checker.signature.qual.InternalForm; +import org.checkerframework.checker.nullness.qual.Nullable; + import java.util.AbstractMap; import java.util.ArrayList; import java.util.BitSet; @@ -95,10 +100,10 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes { public JSRInlinerAdapter( final MethodVisitor methodVisitor, final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { this( /* latest api = */ Opcodes.ASM9, methodVisitor, @@ -131,10 +136,10 @@ protected JSRInlinerAdapter( final int api, final MethodVisitor methodVisitor, final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { super(api, access, name, descriptor, signature, exceptions); this.mv = methodVisitor; } diff --git a/asm-commons/src/main/java/org/objectweb/asm/commons/LocalVariablesSorter.java b/asm-commons/src/main/java/org/objectweb/asm/commons/LocalVariablesSorter.java index 92d542b8..68ed5616 100644 --- a/asm-commons/src/main/java/org/objectweb/asm/commons/LocalVariablesSorter.java +++ b/asm-commons/src/main/java/org/objectweb/asm/commons/LocalVariablesSorter.java @@ -27,6 +27,9 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.commons; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.InternalForm; +import org.checkerframework.checker.signature.qual.FieldDescriptor; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; @@ -149,8 +152,8 @@ public void visitMaxs(final int maxStack, final int maxLocals) { @Override public void visitLocalVariable( - final String name, - final String descriptor, + final @Identifier String name, + final @FieldDescriptor String descriptor, final String signature, final Label start, final Label end, @@ -166,7 +169,7 @@ public AnnotationVisitor visitLocalVariableAnnotation( final Label[] start, final Label[] end, final int[] index, - final String descriptor, + final @FieldDescriptor String descriptor, final boolean visible) { Type type = Type.getType(descriptor); int[] remappedIndex = new int[index.length]; @@ -211,7 +214,7 @@ public void visitFrame( } else if (localType == Opcodes.DOUBLE) { varType = Type.DOUBLE_TYPE; } else if (localType instanceof String) { - varType = Type.getObjectType((String) localType); + varType = Type.getObjectType((@InternalForm String) localType); } setFrameLocal(remap(oldVar, varType), localType); } diff --git a/asm-commons/src/main/java/org/objectweb/asm/commons/Method.java b/asm-commons/src/main/java/org/objectweb/asm/commons/Method.java index 5b6d0443..764e4054 100644 --- a/asm-commons/src/main/java/org/objectweb/asm/commons/Method.java +++ b/asm-commons/src/main/java/org/objectweb/asm/commons/Method.java @@ -27,6 +27,9 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.commons; +import org.checkerframework.checker.signature.qual.MethodDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; + import java.util.HashMap; import java.util.Map; import org.objectweb.asm.Type; @@ -41,10 +44,10 @@ public class Method { /** The method name. */ - private final String name; + private final @Identifier String name; /** The method descriptor. */ - private final String descriptor; + private final @MethodDescriptor String descriptor; /** The descriptors of the primitive Java types (plus void). */ private static final Map PRIMITIVE_TYPE_DESCRIPTORS; @@ -69,7 +72,7 @@ public class Method { * @param name the method's name. * @param descriptor the method's descriptor. */ - public Method(final String name, final String descriptor) { + public Method(final @Identifier String name, final @MethodDescriptor String descriptor) { this.name = name; this.descriptor = descriptor; } @@ -81,7 +84,7 @@ public Method(final String name, final String descriptor) { * @param returnType the method's return type. * @param argumentTypes the method's argument types. */ - public Method(final String name, final Type returnType, final Type[] argumentTypes) { + public Method(final @Identifier String name, final Type returnType, final Type[] argumentTypes) { this(name, Type.getMethodDescriptor(returnType, argumentTypes)); } @@ -92,7 +95,7 @@ public Method(final String name, final Type returnType, final Type[] argumentTyp * @return a {@link Method} corresponding to the given Java method declaration. */ public static Method getMethod(final java.lang.reflect.Method method) { - return new Method(method.getName(), Type.getMethodDescriptor(method)); + return new Method((@Identifier String) method.getName(), Type.getMethodDescriptor(method)); } /** @@ -102,7 +105,7 @@ public static Method getMethod(final java.lang.reflect.Method method) { * @return a {@link Method} corresponding to the given Java constructor declaration. */ public static Method getMethod(final java.lang.reflect.Constructor constructor) { - return new Method("", Type.getConstructorDescriptor(constructor)); + return new Method((@Identifier String)"", Type.getConstructorDescriptor(constructor)); } /** @@ -141,7 +144,7 @@ public static Method getMethod(final String method, final boolean defaultPackage throw new IllegalArgumentException(); } final String returnType = method.substring(0, spaceIndex); - final String methodName = + final @Identifier String methodName = method.substring(spaceIndex + 1, currentArgumentStartIndex - 1).trim(); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append('('); @@ -163,7 +166,7 @@ public static Method getMethod(final String method, final boolean defaultPackage stringBuilder.append(argumentDescriptor); } while (currentArgumentEndIndex != -1); stringBuilder.append(')').append(getDescriptorInternal(returnType, defaultPackage)); - return new Method(methodName, stringBuilder.toString()); + return new Method(methodName, (@MethodDescriptor String) stringBuilder.toString()); } /** @@ -210,7 +213,7 @@ private static String getDescriptorInternal(final String type, final boolean def * * @return the name of the method described by this object. */ - public String getName() { + public @Identifier String getName() { return name; } @@ -219,7 +222,7 @@ public String getName() { * * @return the descriptor of the method described by this object. */ - public String getDescriptor() { + public @MethodDescriptor String getDescriptor() { return descriptor; } diff --git a/asm-commons/src/main/java/org/objectweb/asm/commons/MethodRemapper.java b/asm-commons/src/main/java/org/objectweb/asm/commons/MethodRemapper.java index c889d47d..71a3ee8f 100644 --- a/asm-commons/src/main/java/org/objectweb/asm/commons/MethodRemapper.java +++ b/asm-commons/src/main/java/org/objectweb/asm/commons/MethodRemapper.java @@ -28,6 +28,11 @@ package org.objectweb.asm.commons; +import org.checkerframework.checker.signature.qual.MethodDescriptor; +import org.checkerframework.checker.signature.qual.FieldDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.InternalForm; + import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.Handle; import org.objectweb.asm.Label; @@ -79,7 +84,7 @@ public AnnotationVisitor visitAnnotationDefault() { } @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { AnnotationVisitor annotationVisitor = super.visitAnnotation(remapper.mapDesc(descriptor), visible); return annotationVisitor == null @@ -89,7 +94,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean @Override public AnnotationVisitor visitTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { AnnotationVisitor annotationVisitor = super.visitTypeAnnotation(typeRef, typePath, remapper.mapDesc(descriptor), visible); return annotationVisitor == null @@ -99,7 +104,7 @@ public AnnotationVisitor visitTypeAnnotation( @Override public AnnotationVisitor visitParameterAnnotation( - final int parameter, final String descriptor, final boolean visible) { + final int parameter, final @FieldDescriptor String descriptor, final boolean visible) { AnnotationVisitor annotationVisitor = super.visitParameterAnnotation(parameter, remapper.mapDesc(descriptor), visible); return annotationVisitor == null @@ -133,7 +138,7 @@ private Object[] remapFrameTypes(final int numTypes, final Object[] frameTypes) remappedFrameTypes = new Object[numTypes]; System.arraycopy(frameTypes, 0, remappedFrameTypes, 0, numTypes); } - remappedFrameTypes[i] = remapper.mapType((String) frameTypes[i]); + remappedFrameTypes[i] = remapper.mapType((@InternalForm String) frameTypes[i]); } } return remappedFrameTypes == null ? frameTypes : remappedFrameTypes; @@ -141,7 +146,7 @@ private Object[] remapFrameTypes(final int numTypes, final Object[] frameTypes) @Override public void visitFieldInsn( - final int opcode, final String owner, final String name, final String descriptor) { + final int opcode, final @InternalForm String owner, final @Identifier String name, final @FieldDescriptor String descriptor) { super.visitFieldInsn( opcode, remapper.mapType(owner), @@ -152,9 +157,9 @@ public void visitFieldInsn( @Override public void visitMethodInsn( final int opcodeAndSource, - final String owner, - final String name, - final String descriptor, + final @InternalForm String owner, + final @Identifier String name, + final @MethodDescriptor String descriptor, final boolean isInterface) { if (api < Opcodes.ASM5 && (opcodeAndSource & Opcodes.SOURCE_DEPRECATED) == 0) { // Redirect the call to the deprecated version of this method. @@ -172,7 +177,7 @@ public void visitMethodInsn( @Override public void visitInvokeDynamicInsn( final String name, - final String descriptor, + final @MethodDescriptor String descriptor, final Handle bootstrapMethodHandle, final Object... bootstrapMethodArguments) { Object[] remappedBootstrapMethodArguments = new Object[bootstrapMethodArguments.length]; @@ -187,7 +192,7 @@ public void visitInvokeDynamicInsn( } @Override - public void visitTypeInsn(final int opcode, final String type) { + public void visitTypeInsn(final int opcode, final @InternalForm String type) { super.visitTypeInsn(opcode, remapper.mapType(type)); } @@ -197,13 +202,13 @@ public void visitLdcInsn(final Object value) { } @Override - public void visitMultiANewArrayInsn(final String descriptor, final int numDimensions) { + public void visitMultiANewArrayInsn(final @FieldDescriptor String descriptor, final int numDimensions) { super.visitMultiANewArrayInsn(remapper.mapDesc(descriptor), numDimensions); } @Override public AnnotationVisitor visitInsnAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { AnnotationVisitor annotationVisitor = super.visitInsnAnnotation(typeRef, typePath, remapper.mapDesc(descriptor), visible); return annotationVisitor == null @@ -213,13 +218,13 @@ public AnnotationVisitor visitInsnAnnotation( @Override public void visitTryCatchBlock( - final Label start, final Label end, final Label handler, final String type) { + final Label start, final Label end, final Label handler, final @InternalForm String type) { super.visitTryCatchBlock(start, end, handler, type == null ? null : remapper.mapType(type)); } @Override public AnnotationVisitor visitTryCatchAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { AnnotationVisitor annotationVisitor = super.visitTryCatchAnnotation(typeRef, typePath, remapper.mapDesc(descriptor), visible); return annotationVisitor == null @@ -229,8 +234,8 @@ public AnnotationVisitor visitTryCatchAnnotation( @Override public void visitLocalVariable( - final String name, - final String descriptor, + final @Identifier String name, + final @FieldDescriptor String descriptor, final String signature, final Label start, final Label end, @@ -251,7 +256,7 @@ public AnnotationVisitor visitLocalVariableAnnotation( final Label[] start, final Label[] end, final int[] index, - final String descriptor, + final @FieldDescriptor String descriptor, final boolean visible) { AnnotationVisitor annotationVisitor = super.visitLocalVariableAnnotation( @@ -283,7 +288,7 @@ protected AnnotationVisitor createAnnotationRemapper(final AnnotationVisitor ann * @return the newly created remapper. */ protected AnnotationVisitor createAnnotationRemapper( - final String descriptor, final AnnotationVisitor annotationVisitor) { + final @FieldDescriptor String descriptor, final AnnotationVisitor annotationVisitor) { return new AnnotationRemapper(api, descriptor, annotationVisitor, remapper) .orDeprecatedValue(createAnnotationRemapper(annotationVisitor)); } diff --git a/asm-commons/src/main/java/org/objectweb/asm/commons/ModuleHashesAttribute.java b/asm-commons/src/main/java/org/objectweb/asm/commons/ModuleHashesAttribute.java index 817ef37c..2387417f 100644 --- a/asm-commons/src/main/java/org/objectweb/asm/commons/ModuleHashesAttribute.java +++ b/asm-commons/src/main/java/org/objectweb/asm/commons/ModuleHashesAttribute.java @@ -28,6 +28,7 @@ package org.objectweb.asm.commons; +import org.checkerframework.checker.signature.qual.DotSeparatedIdentifiers; import java.util.ArrayList; import java.util.List; import org.objectweb.asm.Attribute; @@ -47,7 +48,7 @@ public final class ModuleHashesAttribute extends Attribute { public String algorithm; /** A list of module names. */ - public List modules; + public List<@DotSeparatedIdentifiers String> modules; /** The hash of the modules in {@link #modules}. The two lists must have the same size. */ public List hashes; diff --git a/asm-commons/src/main/java/org/objectweb/asm/commons/ModuleRemapper.java b/asm-commons/src/main/java/org/objectweb/asm/commons/ModuleRemapper.java index 926a4f95..c30211c4 100644 --- a/asm-commons/src/main/java/org/objectweb/asm/commons/ModuleRemapper.java +++ b/asm-commons/src/main/java/org/objectweb/asm/commons/ModuleRemapper.java @@ -28,6 +28,9 @@ package org.objectweb.asm.commons; +import org.checkerframework.checker.signature.qual.DotSeparatedIdentifiers; +import org.checkerframework.checker.signature.qual.InternalForm; + import org.objectweb.asm.ModuleVisitor; import org.objectweb.asm.Opcodes; @@ -67,23 +70,23 @@ protected ModuleRemapper( } @Override - public void visitMainClass(final String mainClass) { + public void visitMainClass(final @InternalForm String mainClass) { super.visitMainClass(remapper.mapType(mainClass)); } @Override - public void visitPackage(final String packaze) { + public void visitPackage(final @DotSeparatedIdentifiers String packaze) { super.visitPackage(remapper.mapPackageName(packaze)); } @Override - public void visitRequire(final String module, final int access, final String version) { + public void visitRequire(final @DotSeparatedIdentifiers String module, final int access, final String version) { super.visitRequire(remapper.mapModuleName(module), access, version); } @Override - public void visitExport(final String packaze, final int access, final String... modules) { - String[] remappedModules = null; + public void visitExport(final @DotSeparatedIdentifiers String packaze, final int access, final @DotSeparatedIdentifiers String... modules) { + @DotSeparatedIdentifiers String[] remappedModules = null; if (modules != null) { remappedModules = new String[modules.length]; for (int i = 0; i < modules.length; ++i) { @@ -94,8 +97,8 @@ public void visitExport(final String packaze, final int access, final String... } @Override - public void visitOpen(final String packaze, final int access, final String... modules) { - String[] remappedModules = null; + public void visitOpen(final @DotSeparatedIdentifiers String packaze, final int access, final @DotSeparatedIdentifiers String... modules) { + @DotSeparatedIdentifiers String[] remappedModules = null; if (modules != null) { remappedModules = new String[modules.length]; for (int i = 0; i < modules.length; ++i) { @@ -106,13 +109,13 @@ public void visitOpen(final String packaze, final int access, final String... mo } @Override - public void visitUse(final String service) { + public void visitUse(final @InternalForm String service) { super.visitUse(remapper.mapType(service)); } @Override - public void visitProvide(final String service, final String... providers) { - String[] remappedProviders = new String[providers.length]; + public void visitProvide(final @InternalForm String service, final @InternalForm String... providers) { + @InternalForm String[] remappedProviders = new String[providers.length]; for (int i = 0; i < providers.length; ++i) { remappedProviders[i] = remapper.mapType(providers[i]); } diff --git a/asm-commons/src/main/java/org/objectweb/asm/commons/RecordComponentRemapper.java b/asm-commons/src/main/java/org/objectweb/asm/commons/RecordComponentRemapper.java index 0fa5055e..15721a6b 100644 --- a/asm-commons/src/main/java/org/objectweb/asm/commons/RecordComponentRemapper.java +++ b/asm-commons/src/main/java/org/objectweb/asm/commons/RecordComponentRemapper.java @@ -28,6 +28,7 @@ package org.objectweb.asm.commons; +import org.checkerframework.checker.signature.qual.FieldDescriptor; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.RecordComponentVisitor; @@ -71,7 +72,7 @@ protected RecordComponentRemapper( } @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { AnnotationVisitor annotationVisitor = super.visitAnnotation(remapper.mapDesc(descriptor), visible); return annotationVisitor == null @@ -81,7 +82,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean @Override public AnnotationVisitor visitTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { AnnotationVisitor annotationVisitor = super.visitTypeAnnotation(typeRef, typePath, remapper.mapDesc(descriptor), visible); return annotationVisitor == null @@ -111,7 +112,7 @@ protected AnnotationVisitor createAnnotationRemapper(final AnnotationVisitor ann * @return the newly created remapper. */ protected AnnotationVisitor createAnnotationRemapper( - final String descriptor, final AnnotationVisitor annotationVisitor) { + final @FieldDescriptor String descriptor, final AnnotationVisitor annotationVisitor) { return new AnnotationRemapper(api, descriptor, annotationVisitor, remapper) .orDeprecatedValue(createAnnotationRemapper(annotationVisitor)); } diff --git a/asm-commons/src/main/java/org/objectweb/asm/commons/Remapper.java b/asm-commons/src/main/java/org/objectweb/asm/commons/Remapper.java index 3004b4d2..acd4c115 100644 --- a/asm-commons/src/main/java/org/objectweb/asm/commons/Remapper.java +++ b/asm-commons/src/main/java/org/objectweb/asm/commons/Remapper.java @@ -28,6 +28,12 @@ package org.objectweb.asm.commons; +import org.checkerframework.checker.signature.qual.MethodDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.FieldDescriptor; +import org.checkerframework.checker.signature.qual.DotSeparatedIdentifiers; +import org.checkerframework.checker.signature.qual.InternalForm; + import org.objectweb.asm.ConstantDynamic; import org.objectweb.asm.Handle; import org.objectweb.asm.Opcodes; @@ -51,7 +57,7 @@ public abstract class Remapper { * #map(String)} (if the descriptor corresponds to an array or object type, otherwise the * descriptor is returned as is). See {@link Type#getInternalName()}. */ - public String mapDesc(final String descriptor) { + public @FieldDescriptor String mapDesc(final @FieldDescriptor String descriptor) { return mapType(Type.getType(descriptor)).getDescriptor(); } @@ -78,7 +84,9 @@ private Type mapType(final Type type) { String remappedInternalName = map(type.getInternalName()); return remappedInternalName != null ? Type.getObjectType(remappedInternalName) : type; case Type.METHOD: - return Type.getMethodType(mapMethodDesc(type.getDescriptor())); + @SuppressWarnings("signature") // BUG? passing a field descriptor to mapMethodDesc + Type result = Type.getMethodType(mapMethodDesc(type.getDescriptor())); + return result; default: return type; } @@ -92,7 +100,7 @@ private Type mapType(final Type type) { * @return the given internal name, remapped with {@link #map(String)} (see {@link * Type#getInternalName()}). */ - public String mapType(final String internalName) { + public @InternalForm String mapType(final @InternalForm String internalName) { if (internalName == null) { return null; } @@ -107,10 +115,10 @@ public String mapType(final String internalName) { * @return the given internal name, remapped with {@link #map(String)} (see {@link * Type#getInternalName()}). */ - public String[] mapTypes(final String[] internalNames) { - String[] remappedInternalNames = null; + public @InternalForm String[] mapTypes(final @InternalForm String[] internalNames) { + @InternalForm String[] remappedInternalNames = null; for (int i = 0; i < internalNames.length; ++i) { - String internalName = internalNames[i]; + @InternalForm String internalName = internalNames[i]; String remappedInternalName = mapType(internalName); if (remappedInternalName != null) { if (remappedInternalNames == null) { @@ -130,7 +138,7 @@ public String[] mapTypes(final String[] internalNames) { * @return the given method descriptor, with its argument and return type descriptors remapped * with {@link #mapDesc(String)}. */ - public String mapMethodDesc(final String methodDescriptor) { + public @MethodDescriptor String mapMethodDesc(final @MethodDescriptor String methodDescriptor) { if ("()V".equals(methodDescriptor)) { return methodDescriptor; } @@ -145,7 +153,9 @@ public String mapMethodDesc(final String methodDescriptor) { } else { stringBuilder.append(')').append(mapType(returnType).getDescriptor()); } - return stringBuilder.toString(); + @SuppressWarnings("signature:return") // string concatenation + @MethodDescriptor String result = stringBuilder.toString(); + return result; } /** @@ -158,6 +168,7 @@ public String mapMethodDesc(final String methodDescriptor) { * are remapped. * @return the given value, remapped with this remapper. */ + @SuppressWarnings("signature") // generics public Object mapValue(final Object value) { if (value instanceof Type) { return mapType((Type) value); @@ -183,7 +194,7 @@ public Object mapValue(final Object value) { remappedBootstrapMethodArguments[i] = mapValue(constantDynamic.getBootstrapMethodArgument(i)); } - String descriptor = constantDynamic.getDescriptor(); + @FieldDescriptor String descriptor = constantDynamic.getDescriptor(); return new ConstantDynamic( mapInvokeDynamicMethodName(constantDynamic.getName(), descriptor), mapDesc(descriptor), @@ -250,7 +261,7 @@ protected SignatureVisitor createSignatureRemapper(final SignatureVisitor signat * @param name the name of the annotation attribute. * @return the new name of the annotation attribute. */ - public String mapAnnotationAttributeName(final String descriptor, final String name) { + public @Identifier String mapAnnotationAttributeName(final @FieldDescriptor String descriptor, final @Identifier String name) { return name; } @@ -259,15 +270,17 @@ public String mapAnnotationAttributeName(final String descriptor, final String n * strategy that will work for inner classes produced by Java, but not necessarily other * languages. Subclasses can override. * - * @param name the fully-qualified internal name of the inner class (see {@link + * @param name the internal name of the inner class (see {@link * Type#getInternalName()}). * @param ownerName the internal name of the owner class of the inner class (see {@link * Type#getInternalName()}). * @param innerName the internal name of the inner class (see {@link Type#getInternalName()}). * @return the new inner name of the inner class. */ - public String mapInnerClassName( - final String name, final String ownerName, final String innerName) { + @SuppressWarnings("signature:return") // does this return an @Identifier or an @InternalForm? + // and, should "innerName" be an Identifier or an @InternalForm? + public @Identifier String mapInnerClassName( + final @InternalForm String name, final @InternalForm String ownerName, final @InternalForm String innerName) { final String remappedInnerName = this.mapType(name); if (remappedInnerName.equals(name)) { @@ -305,7 +318,7 @@ public String mapInnerClassName( * @param descriptor the descriptor of the method. * @return the new name of the method. */ - public String mapMethodName(final String owner, final String name, final String descriptor) { + public @Identifier String mapMethodName(final @InternalForm String owner, final @Identifier String name, final String descriptor) { return name; } @@ -331,8 +344,8 @@ public String mapInvokeDynamicMethodName(final String name, final String descrip * @param descriptor the descriptor of the field. * @return the new name of the field. */ - public String mapRecordComponentName( - final String owner, final String name, final String descriptor) { + public @Identifier String mapRecordComponentName( + final @InternalForm String owner, final @Identifier String name, final @FieldDescriptor String descriptor) { return name; } @@ -346,7 +359,7 @@ public String mapRecordComponentName( * @param descriptor the descriptor of the field. * @return the new name of the field. */ - public String mapFieldName(final String owner, final String name, final String descriptor) { + public @Identifier String mapFieldName(final @InternalForm String owner, final @Identifier String name, final String descriptor) { return name; } @@ -357,7 +370,7 @@ public String mapFieldName(final String owner, final String name, final String d * @param name the fully qualified name of the package (using dots). * @return the new name of the package. */ - public String mapPackageName(final String name) { + public @DotSeparatedIdentifiers String mapPackageName(final @DotSeparatedIdentifiers String name) { return name; } @@ -368,7 +381,7 @@ public String mapPackageName(final String name) { * @param name the fully qualified name (using dots) of a module. * @return the new name of the module. */ - public String mapModuleName(final String name) { + public @DotSeparatedIdentifiers String mapModuleName(final @DotSeparatedIdentifiers String name) { return name; } @@ -379,7 +392,7 @@ public String mapModuleName(final String name) { * @param internalName the internal name of a class (see {@link Type#getInternalName()}). * @return the new internal name (see {@link Type#getInternalName()}). */ - public String map(final String internalName) { + public @InternalForm String map(final @InternalForm String internalName) { return internalName; } } diff --git a/asm-commons/src/main/java/org/objectweb/asm/commons/SerialVersionUIDAdder.java b/asm-commons/src/main/java/org/objectweb/asm/commons/SerialVersionUIDAdder.java index 7daaaec2..cf51531e 100644 --- a/asm-commons/src/main/java/org/objectweb/asm/commons/SerialVersionUIDAdder.java +++ b/asm-commons/src/main/java/org/objectweb/asm/commons/SerialVersionUIDAdder.java @@ -27,6 +27,12 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.commons; +import org.checkerframework.checker.signature.qual.MethodDescriptor; +import org.checkerframework.checker.signature.qual.FieldDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.InternalForm; +import org.checkerframework.checker.nullness.qual.Nullable; + import java.io.ByteArrayOutputStream; import java.io.DataOutput; import java.io.DataOutputStream; @@ -124,10 +130,10 @@ public class SerialVersionUIDAdder extends ClassVisitor { private int access; /** The internal name of the class. */ - private String name; + private @InternalForm String name; /** The interfaces implemented by the class. */ - private String[] interfaces; + private @InternalForm String [] interfaces; /** The fields of the class that are needed to compute the SVUID. */ private Collection svuidFields; @@ -175,10 +181,10 @@ protected SerialVersionUIDAdder(final int api, final ClassVisitor classVisitor) public void visit( final int version, final int access, - final String name, + final @InternalForm String name, final String signature, - final String superName, - final String[] interfaces) { + final @InternalForm String superName, + final @InternalForm String @Nullable [] interfaces) { // Get the class name, access flags, and interfaces information (step 1, 2 and 3) for SVUID // computation. computeSvuid = (access & Opcodes.ACC_ENUM) == 0; @@ -198,10 +204,10 @@ public void visit( @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { // Get constructor and method information (step 5 and 7). Also determine if there is a class // initializer (step 6). if (computeSvuid) { @@ -238,8 +244,8 @@ public MethodVisitor visitMethod( @Override public FieldVisitor visitField( final int access, - final String name, - final String desc, + final @Identifier String name, + final @FieldDescriptor String desc, final String signature, final Object value) { // Get the class field information for step 4 of the algorithm. Also determine if the class @@ -273,9 +279,9 @@ public FieldVisitor visitField( @Override public void visitInnerClass( - final String innerClassName, - final String outerName, - final String innerName, + final @InternalForm String innerClassName, + final @InternalForm String outerName, + final @Identifier String innerName, final int innerClassAccess) { // Handles a bizarre special case. Nested classes (static classes declared inside another class) // that are protected have their access bit set to public in their class files to deal with some diff --git a/asm-commons/src/main/java/org/objectweb/asm/commons/SignatureRemapper.java b/asm-commons/src/main/java/org/objectweb/asm/commons/SignatureRemapper.java index 66c30c96..fd5eaa41 100644 --- a/asm-commons/src/main/java/org/objectweb/asm/commons/SignatureRemapper.java +++ b/asm-commons/src/main/java/org/objectweb/asm/commons/SignatureRemapper.java @@ -28,6 +28,8 @@ package org.objectweb.asm.commons; +import org.checkerframework.checker.signature.qual.InternalForm; +import org.checkerframework.checker.signature.qual.Identifier; import java.util.ArrayList; import org.objectweb.asm.Opcodes; import org.objectweb.asm.signature.SignatureVisitor; @@ -72,13 +74,14 @@ protected SignatureRemapper( } @Override - public void visitClassType(final String name) { + public void visitClassType(final @InternalForm String name) { classNames.add(name); signatureVisitor.visitClassType(remapper.mapType(name)); } @Override - public void visitInnerClassType(final String name) { + @SuppressWarnings("signature") // string manipulation + public void visitInnerClassType(final @Identifier String name) { String outerClassName = classNames.remove(classNames.size() - 1); String className = outerClassName + '$' + name; classNames.add(className); @@ -92,12 +95,12 @@ public void visitInnerClassType(final String name) { } @Override - public void visitFormalTypeParameter(final String name) { + public void visitFormalTypeParameter(final @Identifier String name) { signatureVisitor.visitFormalTypeParameter(name); } @Override - public void visitTypeVariable(final String name) { + public void visitTypeVariable(final @Identifier String name) { signatureVisitor.visitTypeVariable(name); } diff --git a/asm-commons/src/main/java/org/objectweb/asm/commons/SimpleRemapper.java b/asm-commons/src/main/java/org/objectweb/asm/commons/SimpleRemapper.java index 44f3442d..790931ed 100644 --- a/asm-commons/src/main/java/org/objectweb/asm/commons/SimpleRemapper.java +++ b/asm-commons/src/main/java/org/objectweb/asm/commons/SimpleRemapper.java @@ -28,6 +28,11 @@ package org.objectweb.asm.commons; +import org.checkerframework.checker.signature.qual.FieldDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.DotSeparatedIdentifiers; +import org.checkerframework.checker.signature.qual.InternalForm; + import java.util.Collections; import java.util.Map; @@ -76,7 +81,8 @@ public SimpleRemapper(final String oldName, final String newName) { } @Override - public String mapMethodName(final String owner, final String name, final String descriptor) { + @SuppressWarnings("signature:return") // TODO: this does not necessarily return an identifier + public @Identifier String mapMethodName(final @InternalForm String owner, final @Identifier String name, final String descriptor) { String remappedName = map(owner + '.' + name + descriptor); return remappedName == null ? name : remappedName; } @@ -88,18 +94,21 @@ public String mapInvokeDynamicMethodName(final String name, final String descrip } @Override - public String mapAnnotationAttributeName(final String descriptor, final String name) { + @SuppressWarnings("signature") // TODO: might not return a dot-separated-identifiers + public @DotSeparatedIdentifiers String mapAnnotationAttributeName(final @FieldDescriptor String descriptor, final String name) { String remappedName = map(descriptor + '.' + name); return remappedName == null ? name : remappedName; } @Override - public String mapFieldName(final String owner, final String name, final String descriptor) { + @SuppressWarnings("signature") // TODO: might not return an identifier + public @Identifier String mapFieldName(final @InternalForm String owner, final @Identifier String name, final String descriptor) { String remappedName = map(owner + '.' + name); return remappedName == null ? name : remappedName; } @Override + @SuppressWarnings("signature") // TODO: unsure about argument and return types public String map(final String key) { return mapping.get(key); } diff --git a/asm-commons/src/main/java/org/objectweb/asm/commons/StaticInitMerger.java b/asm-commons/src/main/java/org/objectweb/asm/commons/StaticInitMerger.java index 9c1144c3..708449d0 100644 --- a/asm-commons/src/main/java/org/objectweb/asm/commons/StaticInitMerger.java +++ b/asm-commons/src/main/java/org/objectweb/asm/commons/StaticInitMerger.java @@ -27,6 +27,11 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.commons; +import org.checkerframework.checker.signature.qual.MethodDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.InternalForm; +import org.checkerframework.checker.nullness.qual.Nullable; + import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; @@ -41,7 +46,7 @@ public class StaticInitMerger extends ClassVisitor { /** The internal name of the visited class. */ - private String owner; + private @InternalForm String owner; /** The prefix to use to rename the existing <clinit> methods. */ private final String renamedClinitMethodPrefix; @@ -82,10 +87,10 @@ protected StaticInitMerger(final int api, final String prefix, final ClassVisito public void visit( final int version, final int access, - final String name, + final @InternalForm String name, final String signature, - final String superName, - final String[] interfaces) { + final @InternalForm String superName, + final @InternalForm String @Nullable [] interfaces) { super.visit(version, access, name, signature, superName, interfaces); this.owner = name; } @@ -93,14 +98,14 @@ public void visit( @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { MethodVisitor methodVisitor; if ("".equals(name)) { int newAccess = Opcodes.ACC_PRIVATE + Opcodes.ACC_STATIC; - String newName = renamedClinitMethodPrefix + numClinitMethods++; + @Identifier String newName = renamedClinitMethodPrefix + numClinitMethods++; methodVisitor = super.visitMethod(newAccess, newName, descriptor, signature, exceptions); if (mergedClinitVisitor == null) { diff --git a/asm-commons/src/main/java/org/objectweb/asm/commons/TryCatchBlockSorter.java b/asm-commons/src/main/java/org/objectweb/asm/commons/TryCatchBlockSorter.java index b6dffeed..e0c3de4a 100644 --- a/asm-commons/src/main/java/org/objectweb/asm/commons/TryCatchBlockSorter.java +++ b/asm-commons/src/main/java/org/objectweb/asm/commons/TryCatchBlockSorter.java @@ -28,6 +28,11 @@ package org.objectweb.asm.commons; +import org.checkerframework.checker.signature.qual.MethodDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.InternalForm; +import org.checkerframework.checker.nullness.qual.Nullable; + import java.util.Collections; import java.util.Comparator; import org.objectweb.asm.MethodVisitor; @@ -66,10 +71,10 @@ public class TryCatchBlockSorter extends MethodNode { public TryCatchBlockSorter( final MethodVisitor methodVisitor, final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { this( /* latest api = */ Opcodes.ASM9, methodVisitor, @@ -87,10 +92,10 @@ protected TryCatchBlockSorter( final int api, final MethodVisitor methodVisitor, final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { super(api, access, name, descriptor, signature, exceptions); this.mv = methodVisitor; } diff --git a/asm-commons/src/test/java/org/objectweb/asm/commons/AdviceAdapterTest.java b/asm-commons/src/test/java/org/objectweb/asm/commons/AdviceAdapterTest.java index dcf7625d..aac194a4 100644 --- a/asm-commons/src/test/java/org/objectweb/asm/commons/AdviceAdapterTest.java +++ b/asm-commons/src/test/java/org/objectweb/asm/commons/AdviceAdapterTest.java @@ -828,10 +828,10 @@ private static class EmptyAdviceClassAdapter extends ClassVisitor { @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { MethodVisitor methodVisitor = super.visitMethod(access, name, descriptor, signature, exceptions); if (methodVisitor == null || (access & (Opcodes.ACC_ABSTRACT | Opcodes.ACC_NATIVE)) > 0) { diff --git a/asm-commons/src/test/java/org/objectweb/asm/commons/AnalyzerAdapterTest.java b/asm-commons/src/test/java/org/objectweb/asm/commons/AnalyzerAdapterTest.java index 9866c009..0513f4d4 100644 --- a/asm-commons/src/test/java/org/objectweb/asm/commons/AnalyzerAdapterTest.java +++ b/asm-commons/src/test/java/org/objectweb/asm/commons/AnalyzerAdapterTest.java @@ -129,7 +129,7 @@ void testAllMethods_precompiledClass( */ static class ClassAnalyzerAdapter extends ClassVisitor { - private String owner; + private @InternalForm String owner; ClassAnalyzerAdapter(final int api, final ClassVisitor classVisitor) { super(api, classVisitor); @@ -139,10 +139,10 @@ static class ClassAnalyzerAdapter extends ClassVisitor { public void visit( final int version, final int access, - final String name, + final @InternalForm String name, final String signature, - final String superName, - final String[] interfaces) { + final @InternalForm String superName, + final @InternalForm String @Nullable [] interfaces) { owner = name; super.visit(version, access, name, signature, superName, interfaces); } @@ -150,10 +150,10 @@ public void visit( @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { MethodVisitor methodVisitor = super.visitMethod(access, name, descriptor, signature, exceptions); AnalyzedFramesInserter inserter = new AnalyzedFramesInserter(methodVisitor); @@ -249,14 +249,14 @@ public void visitVarInsn(final int opcode, final int varIndex) { } @Override - public void visitTypeInsn(final int opcode, final String type) { + public void visitTypeInsn(final int opcode, final @InternalForm String type) { maybeInsertFrame(); super.visitTypeInsn(opcode, type); } @Override public void visitFieldInsn( - final int opcode, final String owner, final String name, final String descriptor) { + final int opcode, final @InternalForm String owner, final @Identifier String name, final @FieldDescriptor String descriptor) { maybeInsertFrame(); super.visitFieldInsn(opcode, owner, name, descriptor); } @@ -264,9 +264,9 @@ public void visitFieldInsn( @Override public void visitMethodInsn( final int opcode, - final String owner, - final String name, - final String descriptor, + final @InternalForm String owner, + final @Identifier String name, + final @MethodDescriptor String descriptor, final boolean isInterface) { maybeInsertFrame(); super.visitMethodInsn(opcode, owner, name, descriptor, isInterface); @@ -275,7 +275,7 @@ public void visitMethodInsn( @Override public void visitInvokeDynamicInsn( final String name, - final String descriptor, + final @MethodDescriptor String descriptor, final Handle bootstrapMethodHandle, final Object... bootstrapMethodArguments) { maybeInsertFrame(); @@ -315,7 +315,7 @@ public void visitLookupSwitchInsn(final Label dflt, final int[] keys, final Labe } @Override - public void visitMultiANewArrayInsn(final String descriptor, final int numDimensions) { + public void visitMultiANewArrayInsn(final @FieldDescriptor String descriptor, final int numDimensions) { maybeInsertFrame(); super.visitMultiANewArrayInsn(descriptor, numDimensions); } diff --git a/asm-commons/src/test/java/org/objectweb/asm/commons/ClassRemapperTest.java b/asm-commons/src/test/java/org/objectweb/asm/commons/ClassRemapperTest.java index 97686d77..f3128664 100644 --- a/asm-commons/src/test/java/org/objectweb/asm/commons/ClassRemapperTest.java +++ b/asm-commons/src/test/java/org/objectweb/asm/commons/ClassRemapperTest.java @@ -32,6 +32,8 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; +import org.checkerframework.checker.signature.qual.FieldDescriptor; + import java.util.Arrays; import java.util.Locale; import java.util.Map; @@ -104,7 +106,7 @@ void testVisitInnerClass() { classNode, new Remapper() { @Override - public String map(final String internalName) { + public String map(final @InternalForm String internalName) { if ("pkg/C".equals(internalName)) { return "a"; } @@ -131,7 +133,7 @@ void testVisitInnerClass_localInnerClass() { classNode, new Remapper() { @Override - public String map(final String internalName) { + public String map(final @InternalForm String internalName) { if ("pkg/C".equals(internalName)) { return "a"; } @@ -158,7 +160,7 @@ void testVisitInnerClass_specialRemap() { classNode, new Remapper() { @Override - public String map(final String internalName) { + public String map(final @InternalForm String internalName) { if ("pkg/C".equals(internalName)) { return "pkg2/C"; } @@ -213,7 +215,7 @@ public String mapInvokeDynamicMethodName(final String name, final String descrip } @Override - public String map(final String internalName) { + public @InternalForm String map(final @InternalForm String internalName) { if (internalName.equals("java/lang/String")) { return "java/lang/Integer"; } @@ -250,7 +252,7 @@ void testInvokeDynamicInsn_field() { new Remapper() { @Override public String mapFieldName( - final String owner, final String name, final String descriptor) { + final @InternalForm String owner, final String name, final String descriptor) { if ("a".equals(name)) { return "demo"; } @@ -386,7 +388,7 @@ private static void checkDescriptor(final String descriptor) { checkMethodAdapter.visitFieldInsn(Opcodes.GETFIELD, "Owner", "name", descriptor); } - private static void checkInternalName(final String internalName) { + private static void checkInternalName(final @InternalForm String internalName) { CheckMethodAdapter checkMethodAdapter = new CheckMethodAdapter(null); checkMethodAdapter.version = Opcodes.V1_5; checkMethodAdapter.visitCode(); @@ -418,13 +420,14 @@ String getRemappedClassName() { } @Override - public String mapDesc(final String descriptor) { + public @FieldDescriptor String mapDesc(final @FieldDescriptor String descriptor) { checkDescriptor(descriptor); return super.mapDesc(descriptor); } @Override - public String mapType(final String type) { + // The argument may be "module-info" or an "ASM internal name". + public @InternalForm String mapType(final @InternalForm String type) { if (type != null && !type.equals("module-info")) { checkInternalName(type); } @@ -432,7 +435,7 @@ public String mapType(final String type) { } @Override - public String mapMethodName(final String owner, final String name, final String descriptor) { + public @Identifier String mapMethodName(final @InternalForm String owner, final @Identifier String name, final String descriptor) { if (name.equals("") || name.equals("")) { return name; } @@ -445,7 +448,7 @@ public String mapInvokeDynamicMethodName(final String name, final String descrip } @Override - public String mapFieldName(final String owner, final String name, final String descriptor) { + public @Identifier String mapFieldName(final @InternalForm String owner, final @Identifier String name, final @FieldDescriptor String descriptor) { return owner.equals(internalClassName) ? name.toUpperCase(LOCALE) : name; } diff --git a/asm-commons/src/test/java/org/objectweb/asm/commons/CodeSizeEvaluatorTest.java b/asm-commons/src/test/java/org/objectweb/asm/commons/CodeSizeEvaluatorTest.java index 204c9782..f3e11605 100644 --- a/asm-commons/src/test/java/org/objectweb/asm/commons/CodeSizeEvaluatorTest.java +++ b/asm-commons/src/test/java/org/objectweb/asm/commons/CodeSizeEvaluatorTest.java @@ -117,10 +117,10 @@ static class CodeSizesEvaluator extends ClassVisitor { @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { MethodVisitor methodVisitor = super.visitMethod(access, name, descriptor, signature, exceptions); return new CodeSizeEvaluator(api, methodVisitor) { diff --git a/asm-commons/src/test/java/org/objectweb/asm/commons/GeneratorAdapterTest.java b/asm-commons/src/test/java/org/objectweb/asm/commons/GeneratorAdapterTest.java index 6b551dc0..3dc50de3 100644 --- a/asm-commons/src/test/java/org/objectweb/asm/commons/GeneratorAdapterTest.java +++ b/asm-commons/src/test/java/org/objectweb/asm/commons/GeneratorAdapterTest.java @@ -1176,17 +1176,17 @@ public String getStatic(final Type owner, final String name, final Type type) { return toString(); } - public String putStatic(final Type owner, final String name, final Type type) { + public String putStatic(final Type owner, final @Identifier String name, final Type type) { generatorAdapter.putStatic(owner, name, type); return toString(); } - public String getField(final Type owner, final String name, final Type type) { + public String getField(final Type owner, final @Identifier String name, final Type type) { generatorAdapter.getField(owner, name, type); return toString(); } - public String putField(final Type owner, final String name, final Type type) { + public String putField(final Type owner, final @Identifier String name, final Type type) { generatorAdapter.putField(owner, name, type); return toString(); } diff --git a/asm-commons/src/test/java/org/objectweb/asm/commons/InstructionAdapterTest.java b/asm-commons/src/test/java/org/objectweb/asm/commons/InstructionAdapterTest.java index 8141359d..6619acb7 100644 --- a/asm-commons/src/test/java/org/objectweb/asm/commons/InstructionAdapterTest.java +++ b/asm-commons/src/test/java/org/objectweb/asm/commons/InstructionAdapterTest.java @@ -289,10 +289,10 @@ static class InstructionClassAdapter extends ClassVisitor { @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { return new InstructionAdapter( api, super.visitMethod(access, name, descriptor, signature, exceptions)) {}; } diff --git a/asm-commons/src/test/java/org/objectweb/asm/commons/JsrInlinerAdapterTest.java b/asm-commons/src/test/java/org/objectweb/asm/commons/JsrInlinerAdapterTest.java index a96eff5e..cb46e118 100644 --- a/asm-commons/src/test/java/org/objectweb/asm/commons/JsrInlinerAdapterTest.java +++ b/asm-commons/src/test/java/org/objectweb/asm/commons/JsrInlinerAdapterTest.java @@ -1526,10 +1526,10 @@ static class JsrInlinerClassAdapter extends ClassVisitor { @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { MethodVisitor methodVisitor = super.visitMethod(access, name, descriptor, signature, exceptions); return new JSRInlinerAdapter( diff --git a/asm-commons/src/test/java/org/objectweb/asm/commons/LocalVariablesSorterTest.java b/asm-commons/src/test/java/org/objectweb/asm/commons/LocalVariablesSorterTest.java index bafcedb7..93bfb346 100644 --- a/asm-commons/src/test/java/org/objectweb/asm/commons/LocalVariablesSorterTest.java +++ b/asm-commons/src/test/java/org/objectweb/asm/commons/LocalVariablesSorterTest.java @@ -236,10 +236,10 @@ static class LocalVariablesSorterClassAdapter extends ClassVisitor { @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { MethodVisitor methodVisitor = super.visitMethod(access, name, descriptor, signature, exceptions); return new LocalVariablesSorter(api, access, descriptor, methodVisitor) {}; diff --git a/asm-commons/src/test/java/org/objectweb/asm/commons/MethodNodeBuilder.java b/asm-commons/src/test/java/org/objectweb/asm/commons/MethodNodeBuilder.java index 9ef289aa..a9faea07 100644 --- a/asm-commons/src/test/java/org/objectweb/asm/commons/MethodNodeBuilder.java +++ b/asm-commons/src/test/java/org/objectweb/asm/commons/MethodNodeBuilder.java @@ -78,14 +78,14 @@ MethodNodeBuilder typeInsn(final int opcode, final String operand) { } MethodNodeBuilder fieldInsn( - final int opcode, final String owner, final String name, final String descriptor) { + final int opcode, final @InternalForm String owner, final @Identifier String name, final String descriptor) { methodNode.visitFieldInsn(opcode, owner, name, descriptor); return this; } MethodNodeBuilder methodInsn( final int opcode, - final String owner, + final @InternalForm String owner, final String name, final String descriptor, final boolean isInterface) { diff --git a/asm-commons/src/test/java/org/objectweb/asm/commons/TryCatchBlockSorterTest.java b/asm-commons/src/test/java/org/objectweb/asm/commons/TryCatchBlockSorterTest.java index e66689d0..5a92d245 100644 --- a/asm-commons/src/test/java/org/objectweb/asm/commons/TryCatchBlockSorterTest.java +++ b/asm-commons/src/test/java/org/objectweb/asm/commons/TryCatchBlockSorterTest.java @@ -68,10 +68,10 @@ void testAllMethods_precompileClass( @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { return new TryCatchBlockSorter( super.visitMethod(access, name, descriptor, signature, exceptions), access, diff --git a/asm-test/src/main/java/org/objectweb/asm/test/AsmTest.java b/asm-test/src/main/java/org/objectweb/asm/test/AsmTest.java index ee0ad099..d9173774 100644 --- a/asm-test/src/main/java/org/objectweb/asm/test/AsmTest.java +++ b/asm-test/src/main/java/org/objectweb/asm/test/AsmTest.java @@ -27,6 +27,8 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.test; +import org.checkerframework.checker.signature.qual.InternalForm; +import org.checkerframework.checker.signature.qual.FullyQualifiedName; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; @@ -164,6 +166,9 @@ public enum PrecompiledClass { JDK14_ALL_STRUCTURES_EMPTY_RECORD("jdk14.AllStructures$EmptyRecord", JdkVersion.JDK14, true), JDK15_ALL_STRUCTURES("jdk15.AllStructures", JdkVersion.JDK15, true); + // The documentation of getName says this is @FullyQualifiedName, but there + // are examples above that are not, such as "jdk9.module-info" and + // "jdk8.Artificial$()$Structures". private final String name; private final JdkVersion jdkVersion; private final boolean preview; @@ -179,7 +184,7 @@ public enum PrecompiledClass { this(name, jdkVersion, false); } - PrecompiledClass(final String name) { + PrecompiledClass(final @FullyQualifiedName String name) { this(name, JdkVersion.JDK7, false); } @@ -188,7 +193,8 @@ public enum PrecompiledClass { * * @return the fully qualified name of this class. */ - public String getName() { + @SuppressWarnings("signature:return") // bug? some constructors pass a values that is not fully-qualified. + public @FullyQualifiedName String getName() { return name; } @@ -197,7 +203,8 @@ public String getName() { * * @return the internal name of this class. */ - public String getInternalName() { + @SuppressWarnings("signature:return") // string concatenation + public @InternalForm String getInternalName() { return name.endsWith(ClassFile.MODULE_INFO) ? ClassFile.MODULE_INFO : name.replace('.', '/'); } @@ -269,9 +276,9 @@ public enum InvalidClass { INVALID_VERIFICATION_TYPE_INFO("invalid.InvalidVerificationTypeInfo"), INVALID_WIDE_OPCODE("invalid.InvalidWideOpcode"); - private final String name; + private final @FullyQualifiedName String name; - InvalidClass(final String name) { + InvalidClass(final @FullyQualifiedName String name) { this.name = name; } @@ -280,7 +287,7 @@ public enum InvalidClass { * * @return the fully qualified name of this class. */ - public String getName() { + public @FullyQualifiedName String getName() { return name; } diff --git a/asm-test/src/main/java/org/objectweb/asm/test/ClassFile.java b/asm-test/src/main/java/org/objectweb/asm/test/ClassFile.java index fc9eb11f..5ba5b2a8 100644 --- a/asm-test/src/main/java/org/objectweb/asm/test/ClassFile.java +++ b/asm-test/src/main/java/org/objectweb/asm/test/ClassFile.java @@ -27,6 +27,7 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.test; +import org.checkerframework.checker.signature.qual.BinaryName; import java.io.ByteArrayInputStream; import java.io.DataInputStream; import java.io.IOException; @@ -125,7 +126,7 @@ public class ClassFile { private final byte[] classBytes; /** The name of the class contained in this class file, lazily computed. */ - private String className; + private @BinaryName String className; /** The dump of the constant pool of {@link #classBytes}, lazily computed. */ private String constantPoolDump; @@ -180,7 +181,7 @@ public Object newInstance() throws ReflectiveOperationException { * @throws ReflectiveOperationException if the class is invalid or if an error occurs in its * constructor. */ - static Object newInstance(final String className, final byte[] classContent) + static Object newInstance(final @BinaryName String className, final byte[] classContent) throws ReflectiveOperationException { if (className.endsWith(MODULE_INFO)) { if (Util.getMajorJavaVersion() < 9) { @@ -2615,11 +2616,11 @@ void build(final StringBuilder stringBuilder) { /** A simple ClassLoader to test that a class can be loaded in the JVM. */ private static class ByteClassLoader extends ClassLoader { - private final String className; + private final @BinaryName String className; private final byte[] classContent; private boolean classLoaded; - ByteClassLoader(final String className, final byte[] classContent) { + ByteClassLoader(final @BinaryName String className, final byte[] classContent) { this.className = className; this.classContent = classContent; } @@ -2629,7 +2630,7 @@ boolean classLoaded() { } @Override - protected Class loadClass(final String name, final boolean resolve) + protected Class loadClass(final @BinaryName String name, final boolean resolve) throws ClassNotFoundException { if (name.equals(className)) { classLoaded = true; diff --git a/asm-tree/src/main/java/org/objectweb/asm/tree/AnnotationNode.java b/asm-tree/src/main/java/org/objectweb/asm/tree/AnnotationNode.java index 56558473..bd51345f 100644 --- a/asm-tree/src/main/java/org/objectweb/asm/tree/AnnotationNode.java +++ b/asm-tree/src/main/java/org/objectweb/asm/tree/AnnotationNode.java @@ -27,6 +27,9 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.tree; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.FieldDescriptor; + import java.util.ArrayList; import java.util.List; import org.objectweb.asm.AnnotationVisitor; @@ -40,7 +43,7 @@ public class AnnotationNode extends AnnotationVisitor { /** The class descriptor of the annotation class. */ - public String desc; + public @FieldDescriptor String desc; /** * The name value pairs of this annotation. Each name value pair is stored as two consecutive @@ -59,7 +62,7 @@ public class AnnotationNode extends AnnotationVisitor { * @param descriptor the class descriptor of the annotation class. * @throws IllegalStateException If a subclass calls this constructor. */ - public AnnotationNode(final String descriptor) { + public AnnotationNode(final @FieldDescriptor String descriptor) { this(/* latest api = */ Opcodes.ASM9, descriptor); if (getClass() != AnnotationNode.class) { throw new IllegalStateException(); @@ -73,7 +76,7 @@ public AnnotationNode(final String descriptor) { * ASM}x values in {@link Opcodes}. * @param descriptor the class descriptor of the annotation class. */ - public AnnotationNode(final int api, final String descriptor) { + public AnnotationNode(final int api, final @FieldDescriptor String descriptor) { super(api); this.desc = descriptor; } @@ -122,7 +125,7 @@ public void visit(final String name, final Object value) { } @Override - public void visitEnum(final String name, final String descriptor, final String value) { + public void visitEnum(final String name, final @FieldDescriptor String descriptor, final String value) { if (values == null) { values = new ArrayList<>(this.desc != null ? 2 : 1); } @@ -133,7 +136,7 @@ public void visitEnum(final String name, final String descriptor, final String v } @Override - public AnnotationVisitor visitAnnotation(final String name, final String descriptor) { + public AnnotationVisitor visitAnnotation(final @Identifier String name, final @FieldDescriptor String descriptor) { if (values == null) { values = new ArrayList<>(this.desc != null ? 2 : 1); } @@ -188,7 +191,7 @@ public void accept(final AnnotationVisitor annotationVisitor) { if (annotationVisitor != null) { if (values != null) { for (int i = 0, n = values.size(); i < n; i += 2) { - String name = (String) values.get(i); + @Identifier String name = (String) values.get(i); Object value = values.get(i + 1); accept(annotationVisitor, name, value); } @@ -204,8 +207,9 @@ public void accept(final AnnotationVisitor annotationVisitor) { * @param name the value name. * @param value the actual value. */ + @SuppressWarnings("signature") // casting values of type Object static void accept( - final AnnotationVisitor annotationVisitor, final String name, final Object value) { + final AnnotationVisitor annotationVisitor, final @Identifier String name, final Object value) { if (annotationVisitor != null) { if (value instanceof String[]) { String[] typeValue = (String[]) value; diff --git a/asm-tree/src/main/java/org/objectweb/asm/tree/ClassNode.java b/asm-tree/src/main/java/org/objectweb/asm/tree/ClassNode.java index 3cbd221d..8302c74b 100644 --- a/asm-tree/src/main/java/org/objectweb/asm/tree/ClassNode.java +++ b/asm-tree/src/main/java/org/objectweb/asm/tree/ClassNode.java @@ -27,6 +27,13 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.tree; +import org.checkerframework.checker.signature.qual.MethodDescriptor; +import org.checkerframework.checker.signature.qual.DotSeparatedIdentifiers; +import org.checkerframework.checker.signature.qual.FieldDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.checkerframework.checker.signature.qual.InternalForm; + import java.util.ArrayList; import java.util.List; import org.objectweb.asm.AnnotationVisitor; @@ -59,7 +66,7 @@ public class ClassNode extends ClassVisitor { public int access; /** The internal name of this class (see {@link org.objectweb.asm.Type#getInternalName()}). */ - public String name; + public @InternalForm String name; /** The signature of this class. May be {@literal null}. */ public String signature; @@ -69,13 +76,13 @@ public class ClassNode extends ClassVisitor { * For interfaces, the super class is {@link Object}. May be {@literal null}, but only for the * {@link Object} class. */ - public String superName; + public @InternalForm String superName; /** * The internal names of the interfaces directly implemented by this class (see {@link * org.objectweb.asm.Type#getInternalName()}). */ - public List interfaces; + public List<@InternalForm String> interfaces; /** The name of the source file from which this class was compiled. May be {@literal null}. */ public String sourceFile; @@ -93,7 +100,7 @@ public class ClassNode extends ClassVisitor { * org.objectweb.asm.Type#getInternalName()}). Must be {@literal null} if this class is not a * local or anonymous class. */ - public String outerClass; + public @InternalForm String outerClass; /** * The name of the method that contains the class, or {@literal null} if the class has no @@ -101,7 +108,7 @@ public class ClassNode extends ClassVisitor { * it is enclosed in an instance initializer, static initializer, instance variable initializer, * or class variable initializer). */ - public String outerMethod; + public @Nullable @Identifier String outerMethod; /** * The descriptor of the method that contains the class, or {@literal null} if the class has no @@ -109,7 +116,7 @@ public class ClassNode extends ClassVisitor { * it is enclosed in an instance initializer, static initializer, instance variable initializer, * or class variable initializer). */ - public String outerMethodDesc; + public @MethodDescriptor String outerMethodDesc; /** The runtime visible annotations of this class. May be {@literal null}. */ public List visibleAnnotations; @@ -133,19 +140,19 @@ public class ClassNode extends ClassVisitor { * The internal name of the nest host class of this class (see {@link * org.objectweb.asm.Type#getInternalName()}). May be {@literal null}. */ - public String nestHostClass; + public @InternalForm String nestHostClass; /** * The internal names of the nest members of this class (see {@link * org.objectweb.asm.Type#getInternalName()}). May be {@literal null}. */ - public List nestMembers; + public List<@InternalForm String> nestMembers; /** * The internal names of the permitted subclasses of this class (see {@link * org.objectweb.asm.Type#getInternalName()}). May be {@literal null}. */ - public List permittedSubclasses; + public List<@InternalForm String> permittedSubclasses; /** The record components of this class. May be {@literal null}. */ public List recordComponents; @@ -191,10 +198,10 @@ public ClassNode(final int api) { public void visit( final int version, final int access, - final String name, + final @InternalForm String name, final String signature, - final String superName, - final String[] interfaces) { + final @InternalForm String superName, + final @InternalForm String @Nullable [] interfaces) { this.version = version; this.access = access; this.name = name; @@ -210,25 +217,25 @@ public void visitSource(final String file, final String debug) { } @Override - public ModuleVisitor visitModule(final String name, final int access, final String version) { + public ModuleVisitor visitModule(final @DotSeparatedIdentifiers String name, final int access, final String version) { module = new ModuleNode(name, access, version); return module; } @Override - public void visitNestHost(final String nestHost) { + public void visitNestHost(final @InternalForm String nestHost) { this.nestHostClass = nestHost; } @Override - public void visitOuterClass(final String owner, final String name, final String descriptor) { + public void visitOuterClass(final @InternalForm String owner, final @Nullable @Identifier String name, final @MethodDescriptor String descriptor) { outerClass = owner; outerMethod = name; outerMethodDesc = descriptor; } @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { AnnotationNode annotation = new AnnotationNode(descriptor); if (visible) { visibleAnnotations = Util.add(visibleAnnotations, annotation); @@ -240,7 +247,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean @Override public AnnotationVisitor visitTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { TypeAnnotationNode typeAnnotation = new TypeAnnotationNode(typeRef, typePath, descriptor); if (visible) { visibleTypeAnnotations = Util.add(visibleTypeAnnotations, typeAnnotation); @@ -256,25 +263,25 @@ public void visitAttribute(final Attribute attribute) { } @Override - public void visitNestMember(final String nestMember) { + public void visitNestMember(final @InternalForm String nestMember) { nestMembers = Util.add(nestMembers, nestMember); } @Override - public void visitPermittedSubclass(final String permittedSubclass) { + public void visitPermittedSubclass(final @InternalForm String permittedSubclass) { permittedSubclasses = Util.add(permittedSubclasses, permittedSubclass); } @Override public void visitInnerClass( - final String name, final String outerName, final String innerName, final int access) { + final @InternalForm String name, final @InternalForm String outerName, final @Identifier String innerName, final int access) { InnerClassNode innerClass = new InnerClassNode(name, outerName, innerName, access); innerClasses.add(innerClass); } @Override public RecordComponentVisitor visitRecordComponent( - final String name, final String descriptor, final String signature) { + final @Identifier String name, final @FieldDescriptor String descriptor, final String signature) { RecordComponentNode recordComponent = new RecordComponentNode(name, descriptor, signature); recordComponents = Util.add(recordComponents, recordComponent); return recordComponent; @@ -283,8 +290,8 @@ public RecordComponentVisitor visitRecordComponent( @Override public FieldVisitor visitField( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @FieldDescriptor String descriptor, final String signature, final Object value) { FieldNode field = new FieldNode(access, name, descriptor, signature, value); @@ -295,10 +302,10 @@ public FieldVisitor visitField( @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String[] exceptions) { MethodNode method = new MethodNode(access, name, descriptor, signature, exceptions); methods.add(method); return method; @@ -383,7 +390,7 @@ public void check(final int api) { */ public void accept(final ClassVisitor classVisitor) { // Visit the header. - String[] interfacesArray = new String[this.interfaces.size()]; + @InternalForm String[] interfacesArray = new String[this.interfaces.size()]; this.interfaces.toArray(interfacesArray); classVisitor.visit(version, access, name, signature, superName, interfacesArray); // Visit the source. diff --git a/asm-tree/src/main/java/org/objectweb/asm/tree/FieldInsnNode.java b/asm-tree/src/main/java/org/objectweb/asm/tree/FieldInsnNode.java index ed8b1048..bcf7289f 100644 --- a/asm-tree/src/main/java/org/objectweb/asm/tree/FieldInsnNode.java +++ b/asm-tree/src/main/java/org/objectweb/asm/tree/FieldInsnNode.java @@ -27,6 +27,10 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.tree; +import org.checkerframework.checker.signature.qual.FieldDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.InternalForm; + import java.util.Map; import org.objectweb.asm.MethodVisitor; @@ -42,13 +46,13 @@ public class FieldInsnNode extends AbstractInsnNode { * The internal name of the field's owner class (see {@link * org.objectweb.asm.Type#getInternalName()}). */ - public String owner; + public @InternalForm String owner; /** The field's name. */ - public String name; + public @Identifier String name; /** The field's descriptor (see {@link org.objectweb.asm.Type}). */ - public String desc; + public @FieldDescriptor String desc; /** * Constructs a new {@link FieldInsnNode}. @@ -61,7 +65,7 @@ public class FieldInsnNode extends AbstractInsnNode { * @param descriptor the field's descriptor (see {@link org.objectweb.asm.Type}). */ public FieldInsnNode( - final int opcode, final String owner, final String name, final String descriptor) { + final int opcode, final @InternalForm String owner, final @Identifier String name, final @FieldDescriptor String descriptor) { super(opcode); this.owner = owner; this.name = name; diff --git a/asm-tree/src/main/java/org/objectweb/asm/tree/FieldNode.java b/asm-tree/src/main/java/org/objectweb/asm/tree/FieldNode.java index 1c30d7fc..291e6974 100644 --- a/asm-tree/src/main/java/org/objectweb/asm/tree/FieldNode.java +++ b/asm-tree/src/main/java/org/objectweb/asm/tree/FieldNode.java @@ -27,6 +27,9 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.tree; +import org.checkerframework.checker.signature.qual.FieldDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; + import java.util.List; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.Attribute; @@ -49,10 +52,10 @@ public class FieldNode extends FieldVisitor { public int access; /** The field's name. */ - public String name; + public @Identifier String name; /** The field's descriptor (see {@link org.objectweb.asm.Type}). */ - public String desc; + public @FieldDescriptor String desc; /** The field's signature. May be {@literal null}. */ public String signature; @@ -95,8 +98,8 @@ public class FieldNode extends FieldVisitor { */ public FieldNode( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @FieldDescriptor String descriptor, final String signature, final Object value) { this(/* latest api = */ Opcodes.ASM9, access, name, descriptor, signature, value); @@ -122,8 +125,8 @@ public FieldNode( public FieldNode( final int api, final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @FieldDescriptor String descriptor, final String signature, final Object value) { super(api); @@ -139,7 +142,7 @@ public FieldNode( // ----------------------------------------------------------------------------------------------- @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { AnnotationNode annotation = new AnnotationNode(descriptor); if (visible) { visibleAnnotations = Util.add(visibleAnnotations, annotation); @@ -151,7 +154,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean @Override public AnnotationVisitor visitTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { TypeAnnotationNode typeAnnotation = new TypeAnnotationNode(typeRef, typePath, descriptor); if (visible) { visibleTypeAnnotations = Util.add(visibleTypeAnnotations, typeAnnotation); diff --git a/asm-tree/src/main/java/org/objectweb/asm/tree/InnerClassNode.java b/asm-tree/src/main/java/org/objectweb/asm/tree/InnerClassNode.java index ca9101b6..821380c5 100644 --- a/asm-tree/src/main/java/org/objectweb/asm/tree/InnerClassNode.java +++ b/asm-tree/src/main/java/org/objectweb/asm/tree/InnerClassNode.java @@ -27,6 +27,9 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.tree; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.InternalForm; + import org.objectweb.asm.ClassVisitor; /** @@ -41,19 +44,19 @@ public class InnerClassNode { /** The internal name of an inner class (see {@link org.objectweb.asm.Type#getInternalName()}). */ - public String name; + public @InternalForm String name; /** * The internal name of the class to which the inner class belongs (see {@link * org.objectweb.asm.Type#getInternalName()}). May be {@literal null}. */ - public String outerName; + public @InternalForm String outerName; /** * The (simple) name of the inner class inside its enclosing class. Must be {@literal null} if the * inner class is not the member of a class or interface (e.g. for local or anonymous classes). */ - public String innerName; + public @Identifier String innerName; /** * The access flags of the inner class as originally declared in the source code from which the @@ -73,7 +76,7 @@ public class InnerClassNode { * class was compiled. */ public InnerClassNode( - final String name, final String outerName, final String innerName, final int access) { + final @InternalForm String name, final @InternalForm String outerName, final @Identifier String innerName, final int access) { this.name = name; this.outerName = outerName; this.innerName = innerName; diff --git a/asm-tree/src/main/java/org/objectweb/asm/tree/InvokeDynamicInsnNode.java b/asm-tree/src/main/java/org/objectweb/asm/tree/InvokeDynamicInsnNode.java index 8c0a1c63..8e69776d 100644 --- a/asm-tree/src/main/java/org/objectweb/asm/tree/InvokeDynamicInsnNode.java +++ b/asm-tree/src/main/java/org/objectweb/asm/tree/InvokeDynamicInsnNode.java @@ -27,6 +27,8 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.tree; +import org.checkerframework.checker.signature.qual.MethodDescriptor; + import java.util.Map; import org.objectweb.asm.Handle; import org.objectweb.asm.MethodVisitor; @@ -43,7 +45,7 @@ public class InvokeDynamicInsnNode extends AbstractInsnNode { public String name; /** The method's descriptor (see {@link org.objectweb.asm.Type}). */ - public String desc; + public @MethodDescriptor String desc; /** The bootstrap method. */ public Handle bsm; @@ -64,7 +66,7 @@ public class InvokeDynamicInsnNode extends AbstractInsnNode { */ public InvokeDynamicInsnNode( final String name, - final String descriptor, + final @MethodDescriptor String descriptor, final Handle bootstrapMethodHandle, final Object... bootstrapMethodArguments) { super(Opcodes.INVOKEDYNAMIC); diff --git a/asm-tree/src/main/java/org/objectweb/asm/tree/LocalVariableAnnotationNode.java b/asm-tree/src/main/java/org/objectweb/asm/tree/LocalVariableAnnotationNode.java index 1bf10a9c..543002be 100644 --- a/asm-tree/src/main/java/org/objectweb/asm/tree/LocalVariableAnnotationNode.java +++ b/asm-tree/src/main/java/org/objectweb/asm/tree/LocalVariableAnnotationNode.java @@ -28,6 +28,7 @@ package org.objectweb.asm.tree; +import org.checkerframework.checker.signature.qual.FieldDescriptor; import java.util.List; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; @@ -83,7 +84,7 @@ public LocalVariableAnnotationNode( final LabelNode[] start, final LabelNode[] end, final int[] index, - final String descriptor) { + final @FieldDescriptor String descriptor) { this(/* latest api = */ Opcodes.ASM9, typeRef, typePath, start, end, index, descriptor); } @@ -111,7 +112,7 @@ public LocalVariableAnnotationNode( final LabelNode[] start, final LabelNode[] end, final int[] index, - final String descriptor) { + final @FieldDescriptor String descriptor) { super(api, typeRef, typePath, descriptor); this.start = Util.asArrayList(start); this.end = Util.asArrayList(end); diff --git a/asm-tree/src/main/java/org/objectweb/asm/tree/LocalVariableNode.java b/asm-tree/src/main/java/org/objectweb/asm/tree/LocalVariableNode.java index cabd0a20..048f2e58 100644 --- a/asm-tree/src/main/java/org/objectweb/asm/tree/LocalVariableNode.java +++ b/asm-tree/src/main/java/org/objectweb/asm/tree/LocalVariableNode.java @@ -27,6 +27,9 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.tree; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.FieldDescriptor; + import org.objectweb.asm.MethodVisitor; /** @@ -37,10 +40,10 @@ public class LocalVariableNode { /** The name of a local variable. */ - public String name; + public @Identifier String name; /** The type descriptor of this local variable. */ - public String desc; + public @FieldDescriptor String desc; /** The signature of this local variable. May be {@literal null}. */ public String signature; @@ -66,8 +69,8 @@ public class LocalVariableNode { * @param index the local variable's index. */ public LocalVariableNode( - final String name, - final String descriptor, + final @Identifier String name, + final @FieldDescriptor String descriptor, final String signature, final LabelNode start, final LabelNode end, diff --git a/asm-tree/src/main/java/org/objectweb/asm/tree/MethodInsnNode.java b/asm-tree/src/main/java/org/objectweb/asm/tree/MethodInsnNode.java index eeb969f9..7e9d4559 100644 --- a/asm-tree/src/main/java/org/objectweb/asm/tree/MethodInsnNode.java +++ b/asm-tree/src/main/java/org/objectweb/asm/tree/MethodInsnNode.java @@ -27,6 +27,10 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.tree; +import org.checkerframework.checker.signature.qual.MethodDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.InternalForm; + import java.util.Map; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; @@ -45,13 +49,13 @@ public class MethodInsnNode extends AbstractInsnNode { * *

For methods of arrays, e.g., {@code clone()}, the array type descriptor. */ - public String owner; + public @InternalForm String owner; /** The method's name. */ - public String name; + public @Identifier String name; /** The method's descriptor (see {@link org.objectweb.asm.Type}). */ - public String desc; + public @MethodDescriptor String desc; /** Whether the method's owner class if an interface. */ public boolean itf; @@ -67,7 +71,7 @@ public class MethodInsnNode extends AbstractInsnNode { * @param descriptor the method's descriptor (see {@link org.objectweb.asm.Type}). */ public MethodInsnNode( - final int opcode, final String owner, final String name, final String descriptor) { + final int opcode, final @InternalForm String owner, final @Identifier String name, final @MethodDescriptor String descriptor) { this(opcode, owner, name, descriptor, opcode == Opcodes.INVOKEINTERFACE); } @@ -84,9 +88,9 @@ public MethodInsnNode( */ public MethodInsnNode( final int opcode, - final String owner, - final String name, - final String descriptor, + final @InternalForm String owner, + final @Identifier String name, + final @MethodDescriptor String descriptor, final boolean isInterface) { super(opcode); this.owner = owner; diff --git a/asm-tree/src/main/java/org/objectweb/asm/tree/MethodNode.java b/asm-tree/src/main/java/org/objectweb/asm/tree/MethodNode.java index 8b529a52..c5348534 100644 --- a/asm-tree/src/main/java/org/objectweb/asm/tree/MethodNode.java +++ b/asm-tree/src/main/java/org/objectweb/asm/tree/MethodNode.java @@ -27,6 +27,12 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.tree; +import org.checkerframework.checker.signature.qual.MethodDescriptor; +import org.checkerframework.checker.signature.qual.FieldDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.checkerframework.checker.signature.qual.InternalForm; + import java.util.ArrayList; import java.util.List; import org.objectweb.asm.AnnotationVisitor; @@ -54,16 +60,16 @@ public class MethodNode extends MethodVisitor { public int access; /** The method's name. */ - public String name; + public @Identifier String name; /** The method's descriptor (see {@link Type}). */ - public String desc; + public @MethodDescriptor String desc; /** The method's signature. May be {@literal null}. */ public String signature; /** The internal names of the method's exception classes (see {@link Type#getInternalName()}). */ - public List exceptions; + public List<@InternalForm String> exceptions; /** The method parameter info (access flags and name). */ public List parameters; @@ -187,10 +193,10 @@ public MethodNode(final int api) { */ public MethodNode( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { this(/* latest api = */ Opcodes.ASM9, access, name, descriptor, signature, exceptions); if (getClass() != MethodNode.class) { throw new IllegalStateException(); @@ -213,10 +219,10 @@ public MethodNode( public MethodNode( final int api, final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { super(api); this.access = access; this.name = name; @@ -256,7 +262,7 @@ public boolean add(final Object o) { } @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { AnnotationNode annotation = new AnnotationNode(descriptor); if (visible) { visibleAnnotations = Util.add(visibleAnnotations, annotation); @@ -268,7 +274,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean @Override public AnnotationVisitor visitTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { TypeAnnotationNode typeAnnotation = new TypeAnnotationNode(typeRef, typePath, descriptor); if (visible) { visibleTypeAnnotations = Util.add(visibleTypeAnnotations, typeAnnotation); @@ -290,7 +296,7 @@ public void visitAnnotableParameterCount(final int parameterCount, final boolean @Override @SuppressWarnings("unchecked") public AnnotationVisitor visitParameterAnnotation( - final int parameter, final String descriptor, final boolean visible) { + final int parameter, final @FieldDescriptor String descriptor, final boolean visible) { AnnotationNode annotation = new AnnotationNode(descriptor); if (visible) { if (visibleParameterAnnotations == null) { @@ -352,22 +358,22 @@ public void visitVarInsn(final int opcode, final int varIndex) { } @Override - public void visitTypeInsn(final int opcode, final String type) { + public void visitTypeInsn(final int opcode, final @InternalForm String type) { instructions.add(new TypeInsnNode(opcode, type)); } @Override public void visitFieldInsn( - final int opcode, final String owner, final String name, final String descriptor) { + final int opcode, final @InternalForm String owner, final @Identifier String name, final @FieldDescriptor String descriptor) { instructions.add(new FieldInsnNode(opcode, owner, name, descriptor)); } @Override public void visitMethodInsn( final int opcodeAndSource, - final String owner, - final String name, - final String descriptor, + final @InternalForm String owner, + final @Identifier String name, + final @MethodDescriptor String descriptor, final boolean isInterface) { if (api < Opcodes.ASM5 && (opcodeAndSource & Opcodes.SOURCE_DEPRECATED) == 0) { // Redirect the call to the deprecated version of this method. @@ -382,7 +388,7 @@ public void visitMethodInsn( @Override public void visitInvokeDynamicInsn( final String name, - final String descriptor, + final @MethodDescriptor String descriptor, final Handle bootstrapMethodHandle, final Object... bootstrapMethodArguments) { instructions.add( @@ -422,13 +428,13 @@ public void visitLookupSwitchInsn(final Label dflt, final int[] keys, final Labe } @Override - public void visitMultiANewArrayInsn(final String descriptor, final int numDimensions) { + public void visitMultiANewArrayInsn(final @FieldDescriptor String descriptor, final int numDimensions) { instructions.add(new MultiANewArrayInsnNode(descriptor, numDimensions)); } @Override public AnnotationVisitor visitInsnAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { // Find the last real instruction, i.e. the instruction targeted by this annotation. AbstractInsnNode currentInsn = instructions.getLast(); while (currentInsn.getOpcode() == -1) { @@ -448,7 +454,7 @@ public AnnotationVisitor visitInsnAnnotation( @Override public void visitTryCatchBlock( - final Label start, final Label end, final Label handler, final String type) { + final Label start, final Label end, final Label handler, final @InternalForm String type) { TryCatchBlockNode tryCatchBlock = new TryCatchBlockNode(getLabelNode(start), getLabelNode(end), getLabelNode(handler), type); tryCatchBlocks = Util.add(tryCatchBlocks, tryCatchBlock); @@ -456,7 +462,7 @@ public void visitTryCatchBlock( @Override public AnnotationVisitor visitTryCatchAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { TryCatchBlockNode tryCatchBlock = tryCatchBlocks.get((typeRef & 0x00FFFF00) >> 8); TypeAnnotationNode typeAnnotation = new TypeAnnotationNode(typeRef, typePath, descriptor); if (visible) { @@ -471,8 +477,8 @@ public AnnotationVisitor visitTryCatchAnnotation( @Override public void visitLocalVariable( - final String name, - final String descriptor, + final @Identifier String name, + final @FieldDescriptor String descriptor, final String signature, final Label start, final Label end, @@ -490,7 +496,7 @@ public AnnotationVisitor visitLocalVariableAnnotation( final Label[] start, final Label[] end, final int[] index, - final String descriptor, + final @FieldDescriptor String descriptor, final boolean visible) { LocalVariableAnnotationNode localVariableAnnotation = new LocalVariableAnnotationNode( @@ -640,7 +646,7 @@ public void check(final int api) { * @param classVisitor a class visitor. */ public void accept(final ClassVisitor classVisitor) { - String[] exceptionsArray = exceptions == null ? null : exceptions.toArray(new String[0]); + @InternalForm String @Nullable [] exceptionsArray = exceptions == null ? null : exceptions.toArray(new @InternalForm String[0]); MethodVisitor methodVisitor = classVisitor.visitMethod(access, name, desc, signature, exceptionsArray); if (methodVisitor != null) { diff --git a/asm-tree/src/main/java/org/objectweb/asm/tree/ModuleExportNode.java b/asm-tree/src/main/java/org/objectweb/asm/tree/ModuleExportNode.java index f860d26d..2bf77ffb 100644 --- a/asm-tree/src/main/java/org/objectweb/asm/tree/ModuleExportNode.java +++ b/asm-tree/src/main/java/org/objectweb/asm/tree/ModuleExportNode.java @@ -27,6 +27,10 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.tree; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.checkerframework.checker.signature.qual.InternalForm; +import org.checkerframework.checker.signature.qual.DotSeparatedIdentifiers; + import java.util.List; import org.objectweb.asm.ModuleVisitor; @@ -41,7 +45,7 @@ public class ModuleExportNode { * The internal name of the exported package (see {@link * org.objectweb.asm.Type#getInternalName()}). */ - public String packaze; + public @DotSeparatedIdentifiers String packaze; /** * The access flags (see {@link org.objectweb.asm.Opcodes}). Valid values are {@code @@ -53,7 +57,7 @@ public class ModuleExportNode { * The list of modules that can access this exported package, specified with fully qualified names * (using dots). May be {@literal null}. */ - public List modules; + public @Nullable List<@DotSeparatedIdentifiers String> modules; /** * Constructs a new {@link ModuleExportNode}. @@ -65,7 +69,7 @@ public class ModuleExportNode { * @param modules a list of modules that can access this exported package, specified with fully * qualified names (using dots). */ - public ModuleExportNode(final String packaze, final int access, final List modules) { + public ModuleExportNode(final @DotSeparatedIdentifiers String packaze, final int access, final List modules) { this.packaze = packaze; this.access = access; this.modules = modules; @@ -78,6 +82,6 @@ public ModuleExportNode(final String packaze, final int access, final List packages; + public List<@DotSeparatedIdentifiers String> packages; /** The dependencies of this module. May be {@literal null}. */ public List requires; @@ -77,7 +80,7 @@ public class ModuleNode extends ModuleVisitor { * The internal names of the services used by this module (see {@link * org.objectweb.asm.Type#getInternalName()}). May be {@literal null}. */ - public List uses; + public List<@InternalForm String> uses; /** The services provided by this module. May be {@literal null}. */ public List provides; @@ -92,7 +95,7 @@ public class ModuleNode extends ModuleVisitor { * @param version the module version, or {@literal null}. * @throws IllegalStateException If a subclass calls this constructor. */ - public ModuleNode(final String name, final int access, final String version) { + public ModuleNode(final @DotSeparatedIdentifiers String name, final int access, final String version) { super(/* latest api = */ Opcodes.ASM9); if (getClass() != ModuleNode.class) { throw new IllegalStateException(); @@ -121,13 +124,13 @@ public ModuleNode(final String name, final int access, final String version) { */ public ModuleNode( final int api, - final String name, + final @DotSeparatedIdentifiers String name, final int access, final String version, final List requires, final List exports, final List opens, - final List uses, + final List<@InternalForm String> uses, final List provides) { super(api); this.name = name; @@ -141,12 +144,12 @@ public ModuleNode( } @Override - public void visitMainClass(final String mainClass) { + public void visitMainClass(final @InternalForm String mainClass) { this.mainClass = mainClass; } @Override - public void visitPackage(final String packaze) { + public void visitPackage(final @DotSeparatedIdentifiers String packaze) { if (packages == null) { packages = new ArrayList<>(5); } @@ -154,7 +157,7 @@ public void visitPackage(final String packaze) { } @Override - public void visitRequire(final String module, final int access, final String version) { + public void visitRequire(final @DotSeparatedIdentifiers String module, final int access, final String version) { if (requires == null) { requires = new ArrayList<>(5); } @@ -162,7 +165,7 @@ public void visitRequire(final String module, final int access, final String ver } @Override - public void visitExport(final String packaze, final int access, final String... modules) { + public void visitExport(final @DotSeparatedIdentifiers String packaze, final int access, final @DotSeparatedIdentifiers String... modules) { if (exports == null) { exports = new ArrayList<>(5); } @@ -170,7 +173,7 @@ public void visitExport(final String packaze, final int access, final String... } @Override - public void visitOpen(final String packaze, final int access, final String... modules) { + public void visitOpen(final @DotSeparatedIdentifiers String packaze, final int access, final @DotSeparatedIdentifiers String... modules) { if (opens == null) { opens = new ArrayList<>(5); } @@ -178,7 +181,7 @@ public void visitOpen(final String packaze, final int access, final String... mo } @Override - public void visitUse(final String service) { + public void visitUse(final @InternalForm String service) { if (uses == null) { uses = new ArrayList<>(5); } @@ -186,7 +189,7 @@ public void visitUse(final String service) { } @Override - public void visitProvide(final String service, final String... providers) { + public void visitProvide(final @InternalForm String service, final @InternalForm String... providers) { if (provides == null) { provides = new ArrayList<>(5); } diff --git a/asm-tree/src/main/java/org/objectweb/asm/tree/ModuleOpenNode.java b/asm-tree/src/main/java/org/objectweb/asm/tree/ModuleOpenNode.java index fc73def3..711fbc39 100644 --- a/asm-tree/src/main/java/org/objectweb/asm/tree/ModuleOpenNode.java +++ b/asm-tree/src/main/java/org/objectweb/asm/tree/ModuleOpenNode.java @@ -27,6 +27,10 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.tree; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.checkerframework.checker.signature.qual.InternalForm; +import org.checkerframework.checker.signature.qual.DotSeparatedIdentifiers; + import java.util.List; import org.objectweb.asm.ModuleVisitor; @@ -40,7 +44,7 @@ public class ModuleOpenNode { /** * The internal name of the opened package (see {@link org.objectweb.asm.Type#getInternalName()}). */ - public String packaze; + public @DotSeparatedIdentifiers String packaze; /** * The access flag of the opened package, valid values are among {@code ACC_SYNTHETIC} and {@code @@ -52,7 +56,7 @@ public class ModuleOpenNode { * The fully qualified names (using dots) of the modules that can use deep reflection to the * classes of the open package, or {@literal null}. */ - public List modules; + public @Nullable List<@DotSeparatedIdentifiers String> modules; /** * Constructs a new {@link ModuleOpenNode}. @@ -64,7 +68,7 @@ public class ModuleOpenNode { * @param modules the fully qualified names (using dots) of the modules that can use deep * reflection to the classes of the open package, or {@literal null}. */ - public ModuleOpenNode(final String packaze, final int access, final List modules) { + public ModuleOpenNode(final @DotSeparatedIdentifiers String packaze, final int access, final List<@DotSeparatedIdentifiers String> modules) { this.packaze = packaze; this.access = access; this.modules = modules; @@ -77,6 +81,6 @@ public ModuleOpenNode(final String packaze, final int access, final List */ public void accept(final ModuleVisitor moduleVisitor) { moduleVisitor.visitOpen( - packaze, access, modules == null ? null : modules.toArray(new String[0])); + packaze, access, modules == null ? null : modules.toArray(new @DotSeparatedIdentifiers String[0])); } } diff --git a/asm-tree/src/main/java/org/objectweb/asm/tree/ModuleProvideNode.java b/asm-tree/src/main/java/org/objectweb/asm/tree/ModuleProvideNode.java index c0976d47..f9477381 100644 --- a/asm-tree/src/main/java/org/objectweb/asm/tree/ModuleProvideNode.java +++ b/asm-tree/src/main/java/org/objectweb/asm/tree/ModuleProvideNode.java @@ -27,6 +27,8 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.tree; +import org.checkerframework.checker.signature.qual.InternalForm; + import java.util.List; import org.objectweb.asm.ModuleVisitor; @@ -38,13 +40,13 @@ public class ModuleProvideNode { /** The internal name of the service (see {@link org.objectweb.asm.Type#getInternalName()}). */ - public String service; + public @InternalForm String service; /** * The internal names of the implementations of the service (there is at least one provider). See * {@link org.objectweb.asm.Type#getInternalName()}. */ - public List providers; + public List<@InternalForm String> providers; /** * Constructs a new {@link ModuleProvideNode}. @@ -53,7 +55,7 @@ public class ModuleProvideNode { * @param providers the internal names of the implementations of the service (there is at least * one provider). See {@link org.objectweb.asm.Type#getInternalName()}. */ - public ModuleProvideNode(final String service, final List providers) { + public ModuleProvideNode(final @InternalForm String service, final List<@InternalForm String> providers) { this.service = service; this.providers = providers; } @@ -64,6 +66,6 @@ public ModuleProvideNode(final String service, final List providers) { * @param moduleVisitor a module visitor. */ public void accept(final ModuleVisitor moduleVisitor) { - moduleVisitor.visitProvide(service, providers.toArray(new String[0])); + moduleVisitor.visitProvide(service, providers.toArray(new @InternalForm String[0])); } } diff --git a/asm-tree/src/main/java/org/objectweb/asm/tree/ModuleRequireNode.java b/asm-tree/src/main/java/org/objectweb/asm/tree/ModuleRequireNode.java index 27940d15..b5284f9b 100644 --- a/asm-tree/src/main/java/org/objectweb/asm/tree/ModuleRequireNode.java +++ b/asm-tree/src/main/java/org/objectweb/asm/tree/ModuleRequireNode.java @@ -27,6 +27,8 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.tree; +import org.checkerframework.checker.signature.qual.DotSeparatedIdentifiers; + import org.objectweb.asm.ModuleVisitor; /** @@ -37,7 +39,7 @@ public class ModuleRequireNode { /** The fully qualified name (using dots) of the dependence. */ - public String module; + public @DotSeparatedIdentifiers String module; /** * The access flag of the dependence among {@code ACC_TRANSITIVE}, {@code ACC_STATIC_PHASE}, @@ -56,7 +58,7 @@ public class ModuleRequireNode { * ACC_STATIC_PHASE}, {@code ACC_SYNTHETIC} and {@code ACC_MANDATED}. * @param version the module version at compile time, or {@literal null}. */ - public ModuleRequireNode(final String module, final int access, final String version) { + public ModuleRequireNode(final @DotSeparatedIdentifiers String module, final int access, final String version) { this.module = module; this.access = access; this.version = version; diff --git a/asm-tree/src/main/java/org/objectweb/asm/tree/MultiANewArrayInsnNode.java b/asm-tree/src/main/java/org/objectweb/asm/tree/MultiANewArrayInsnNode.java index f11f2187..ed47aa49 100644 --- a/asm-tree/src/main/java/org/objectweb/asm/tree/MultiANewArrayInsnNode.java +++ b/asm-tree/src/main/java/org/objectweb/asm/tree/MultiANewArrayInsnNode.java @@ -27,6 +27,8 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.tree; +import org.checkerframework.checker.signature.qual.FieldDescriptor; + import java.util.Map; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; @@ -39,7 +41,7 @@ public class MultiANewArrayInsnNode extends AbstractInsnNode { /** An array type descriptor (see {@link org.objectweb.asm.Type}). */ - public String desc; + public @FieldDescriptor String desc; /** Number of dimensions of the array to allocate. */ public int dims; diff --git a/asm-tree/src/main/java/org/objectweb/asm/tree/RecordComponentNode.java b/asm-tree/src/main/java/org/objectweb/asm/tree/RecordComponentNode.java index a1b58c66..d82429c9 100644 --- a/asm-tree/src/main/java/org/objectweb/asm/tree/RecordComponentNode.java +++ b/asm-tree/src/main/java/org/objectweb/asm/tree/RecordComponentNode.java @@ -27,6 +27,9 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.tree; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.FieldDescriptor; + import java.util.List; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.Attribute; @@ -43,10 +46,10 @@ public class RecordComponentNode extends RecordComponentVisitor { /** The record component name. */ - public String name; + public @Identifier String name; /** The record component descriptor (see {@link org.objectweb.asm.Type}). */ - public String descriptor; + public @FieldDescriptor String descriptor; /** The record component signature. May be {@literal null}. */ public String signature; @@ -75,7 +78,7 @@ public class RecordComponentNode extends RecordComponentVisitor { * @param signature the record component signature. * @throws IllegalStateException If a subclass calls this constructor. */ - public RecordComponentNode(final String name, final String descriptor, final String signature) { + public RecordComponentNode(final @Identifier String name, final @FieldDescriptor String descriptor, final String signature) { this(/* latest api = */ Opcodes.ASM9, name, descriptor, signature); if (getClass() != RecordComponentNode.class) { throw new IllegalStateException(); @@ -92,7 +95,7 @@ public RecordComponentNode(final String name, final String descriptor, final Str * @param signature the record component signature. */ public RecordComponentNode( - final int api, final String name, final String descriptor, final String signature) { + final int api, final @Identifier String name, final @FieldDescriptor String descriptor, final String signature) { super(api); this.name = name; this.descriptor = descriptor; @@ -104,7 +107,7 @@ public RecordComponentNode( // ----------------------------------------------------------------------------------------------- @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { AnnotationNode annotation = new AnnotationNode(descriptor); if (visible) { visibleAnnotations = Util.add(visibleAnnotations, annotation); @@ -116,7 +119,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean @Override public AnnotationVisitor visitTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { TypeAnnotationNode typeAnnotation = new TypeAnnotationNode(typeRef, typePath, descriptor); if (visible) { visibleTypeAnnotations = Util.add(visibleTypeAnnotations, typeAnnotation); diff --git a/asm-tree/src/main/java/org/objectweb/asm/tree/TryCatchBlockNode.java b/asm-tree/src/main/java/org/objectweb/asm/tree/TryCatchBlockNode.java index 30bfd698..0fc0e349 100644 --- a/asm-tree/src/main/java/org/objectweb/asm/tree/TryCatchBlockNode.java +++ b/asm-tree/src/main/java/org/objectweb/asm/tree/TryCatchBlockNode.java @@ -27,6 +27,8 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.tree; +import org.checkerframework.checker.signature.qual.InternalForm; + import java.util.List; import org.objectweb.asm.MethodVisitor; @@ -50,7 +52,7 @@ public class TryCatchBlockNode { * The internal name of the type of exceptions handled by the handler. May be {@literal null} to * catch any exceptions (for "finally" blocks). */ - public String type; + public @InternalForm String type; /** The runtime visible type annotations on the exception handler type. May be {@literal null}. */ public List visibleTypeAnnotations; @@ -71,7 +73,7 @@ public class TryCatchBlockNode { * "finally" blocks). */ public TryCatchBlockNode( - final LabelNode start, final LabelNode end, final LabelNode handler, final String type) { + final LabelNode start, final LabelNode end, final LabelNode handler, final @InternalForm String type) { this.start = start; this.end = end; this.handler = handler; diff --git a/asm-tree/src/main/java/org/objectweb/asm/tree/TypeAnnotationNode.java b/asm-tree/src/main/java/org/objectweb/asm/tree/TypeAnnotationNode.java index 967d2543..6ccf9727 100644 --- a/asm-tree/src/main/java/org/objectweb/asm/tree/TypeAnnotationNode.java +++ b/asm-tree/src/main/java/org/objectweb/asm/tree/TypeAnnotationNode.java @@ -27,6 +27,7 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.tree; +import org.checkerframework.checker.signature.qual.FieldDescriptor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.TypePath; @@ -58,7 +59,7 @@ public class TypeAnnotationNode extends AnnotationNode { * @param descriptor the class descriptor of the annotation class. * @throws IllegalStateException If a subclass calls this constructor. */ - public TypeAnnotationNode(final int typeRef, final TypePath typePath, final String descriptor) { + public TypeAnnotationNode(final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor) { this(/* latest api = */ Opcodes.ASM9, typeRef, typePath, descriptor); if (getClass() != TypeAnnotationNode.class) { throw new IllegalStateException(); @@ -77,7 +78,7 @@ public TypeAnnotationNode(final int typeRef, final TypePath typePath, final Stri * @param descriptor the class descriptor of the annotation class. */ public TypeAnnotationNode( - final int api, final int typeRef, final TypePath typePath, final String descriptor) { + final int api, final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor) { super(api, descriptor); this.typeRef = typeRef; this.typePath = typePath; diff --git a/asm-tree/src/main/java/org/objectweb/asm/tree/TypeInsnNode.java b/asm-tree/src/main/java/org/objectweb/asm/tree/TypeInsnNode.java index d7459877..c28f514e 100644 --- a/asm-tree/src/main/java/org/objectweb/asm/tree/TypeInsnNode.java +++ b/asm-tree/src/main/java/org/objectweb/asm/tree/TypeInsnNode.java @@ -27,6 +27,8 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.tree; +import org.checkerframework.checker.signature.qual.InternalForm; + import java.util.Map; import org.objectweb.asm.MethodVisitor; @@ -42,7 +44,7 @@ public class TypeInsnNode extends AbstractInsnNode { * The operand of this instruction. Despite its name (due to historical reasons), this operand is * an internal name (see {@link org.objectweb.asm.Type#getInternalName()}). */ - public String desc; + public @InternalForm String desc; /** * Constructs a new {@link TypeInsnNode}. @@ -52,7 +54,7 @@ public class TypeInsnNode extends AbstractInsnNode { * @param type the operand of the instruction to be constructed. This operand is an internal name * (see {@link org.objectweb.asm.Type#getInternalName()}). */ - public TypeInsnNode(final int opcode, final String type) { + public TypeInsnNode(final int opcode, final @InternalForm String type) { super(opcode); this.desc = type; } diff --git a/asm-tree/src/test/java/org/objectweb/asm/tree/AnnotationNodeTest.java b/asm-tree/src/test/java/org/objectweb/asm/tree/AnnotationNodeTest.java index 20b0bae0..76c0064f 100644 --- a/asm-tree/src/test/java/org/objectweb/asm/tree/AnnotationNodeTest.java +++ b/asm-tree/src/test/java/org/objectweb/asm/tree/AnnotationNodeTest.java @@ -106,7 +106,7 @@ void testAnnotationNode_accept_skipNestedAnnotations() { new AnnotationVisitor(/* latest */ Opcodes.ASM10_EXPERIMENTAL, dstAnnotationNode) { @Override - public AnnotationVisitor visitAnnotation(final String name, final String descriptor) { + public AnnotationVisitor visitAnnotation(final @Identifier String name, final @FieldDescriptor String descriptor) { return null; } diff --git a/asm-tree/src/test/java/org/objectweb/asm/tree/ClassNodeTest.java b/asm-tree/src/test/java/org/objectweb/asm/tree/ClassNodeTest.java index c51a041d..e29f19bc 100644 --- a/asm-tree/src/test/java/org/objectweb/asm/tree/ClassNodeTest.java +++ b/asm-tree/src/test/java/org/objectweb/asm/tree/ClassNodeTest.java @@ -182,29 +182,29 @@ private static class RemoveMembersClassVisitor extends ClassVisitor { public void visit( final int version, final int access, - final String name, + final @InternalForm String name, final String signature, - final String superName, - final String[] interfaces) { + final @InternalForm String superName, + final @InternalForm String @Nullable [] interfaces) { super.visit(version, access & ~Opcodes.ACC_RECORD, name, signature, superName, interfaces); } @Override - public ModuleVisitor visitModule(final String name, final int access, final String version) { + public ModuleVisitor visitModule(final @DotSeparatedIdentifiers String name, final int access, final String version) { return null; } @Override - public void visitNestHost(final String nestHost) {} + public void visitNestHost(final @InternalForm String nestHost) {} @Override - public void visitNestMember(final String nestMember) {} + public void visitNestMember(final @InternalForm String nestMember) {} @Override - public void visitPermittedSubclass(final String permittedSubclass) {} + public void visitPermittedSubclass(final @InternalForm String permittedSubclass) {} @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { return null; } @@ -212,7 +212,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean public AnnotationVisitor visitTypeAnnotation( final int typeRef, final TypePath typePath, - final String descriptor, + final @FieldDescriptor String descriptor, final boolean visible) { return null; } @@ -222,15 +222,15 @@ public void visitAttribute(final Attribute attribute) {} @Override public RecordComponentVisitor visitRecordComponent( - final String name, final String descriptor, final String signature) { + final @Identifier String name, final String descriptor, final String signature) { return null; } @Override public FieldVisitor visitField( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @FieldDescriptor String descriptor, final String signature, final Object value) { return null; @@ -239,10 +239,10 @@ public FieldVisitor visitField( @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { return null; } } diff --git a/asm-tree/src/test/java/org/objectweb/asm/tree/MethodNodeTest.java b/asm-tree/src/test/java/org/objectweb/asm/tree/MethodNodeTest.java index 7aff0a02..3614dc1d 100644 --- a/asm-tree/src/test/java/org/objectweb/asm/tree/MethodNodeTest.java +++ b/asm-tree/src/test/java/org/objectweb/asm/tree/MethodNodeTest.java @@ -80,10 +80,10 @@ void testVisitAndAccept_withUninitializedMethodNode( @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { MethodNode method = new MethodNode(); method.access = access; method.name = name; diff --git a/asm-tree/src/test/java/org/objectweb/asm/tree/ModuleNodeTest.java b/asm-tree/src/test/java/org/objectweb/asm/tree/ModuleNodeTest.java index 799e8306..96b37654 100644 --- a/asm-tree/src/test/java/org/objectweb/asm/tree/ModuleNodeTest.java +++ b/asm-tree/src/test/java/org/objectweb/asm/tree/ModuleNodeTest.java @@ -82,7 +82,7 @@ void testAccept() { new ClassVisitor(/* latest */ Opcodes.ASM10_EXPERIMENTAL) { @Override public ModuleVisitor visitModule( - final String name, final int access, final String version) { + final @DotSeparatedIdentifiers String name, final int access, final String version) { dstModuleNode.name = name; dstModuleNode.access = access; dstModuleNode.version = version; diff --git a/asm-util/src/main/java/org/objectweb/asm/util/ASMifier.java b/asm-util/src/main/java/org/objectweb/asm/util/ASMifier.java index 99e2bc0d..218ef8c6 100644 --- a/asm-util/src/main/java/org/objectweb/asm/util/ASMifier.java +++ b/asm-util/src/main/java/org/objectweb/asm/util/ASMifier.java @@ -27,6 +27,12 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.util; +import org.checkerframework.checker.signature.qual.DotSeparatedIdentifiers; +import org.checkerframework.checker.signature.qual.FieldDescriptor; +import org.checkerframework.checker.signature.qual.MethodDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.InternalForm; +import org.checkerframework.checker.nullness.qual.Nullable; import java.io.IOException; import java.io.PrintWriter; import java.util.Arrays; @@ -190,10 +196,10 @@ static void main(final String[] args, final PrintWriter output, final PrintWrite public void visit( final int version, final int access, - final String name, + final @InternalForm String name, final String signature, - final String superName, - final String[] interfaces) { + final @InternalForm String superName, + final @InternalForm String @Nullable [] interfaces) { String simpleName; if (name == null) { simpleName = "module-info"; @@ -270,7 +276,7 @@ public void visitSource(final String file, final String debug) { } @Override - public Printer visitModule(final String name, final int flags, final String version) { + public Printer visitModule(final @DotSeparatedIdentifiers String name, final int flags, final String version) { stringBuilder.setLength(0); stringBuilder.append("{\n"); stringBuilder.append("ModuleVisitor moduleVisitor = classWriter.visitModule("); @@ -288,7 +294,7 @@ public Printer visitModule(final String name, final int flags, final String vers } @Override - public void visitNestHost(final String nestHost) { + public void visitNestHost(final @InternalForm String nestHost) { stringBuilder.setLength(0); stringBuilder.append("classWriter.visitNestHost("); appendConstant(nestHost); @@ -297,7 +303,7 @@ public void visitNestHost(final String nestHost) { } @Override - public void visitOuterClass(final String owner, final String name, final String descriptor) { + public void visitOuterClass(final @InternalForm String owner, final @Nullable @Identifier String name, final @MethodDescriptor String descriptor) { stringBuilder.setLength(0); stringBuilder.append("classWriter.visitOuterClass("); appendConstant(owner); @@ -310,13 +316,13 @@ public void visitOuterClass(final String owner, final String name, final String } @Override - public ASMifier visitClassAnnotation(final String descriptor, final boolean visible) { + public ASMifier visitClassAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { return visitAnnotation(descriptor, visible); } @Override public ASMifier visitClassTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { return visitTypeAnnotation(typeRef, typePath, descriptor, visible); } @@ -326,7 +332,7 @@ public void visitClassAttribute(final Attribute attribute) { } @Override - public void visitNestMember(final String nestMember) { + public void visitNestMember(final @InternalForm String nestMember) { stringBuilder.setLength(0); stringBuilder.append("classWriter.visitNestMember("); appendConstant(nestMember); @@ -335,7 +341,7 @@ public void visitNestMember(final String nestMember) { } @Override - public void visitPermittedSubclass(final String permittedSubclass) { + public void visitPermittedSubclass(final @InternalForm String permittedSubclass) { stringBuilder.setLength(0); stringBuilder.append("classWriter.visitPermittedSubclass("); appendConstant(permittedSubclass); @@ -345,7 +351,7 @@ public void visitPermittedSubclass(final String permittedSubclass) { @Override public void visitInnerClass( - final String name, final String outerName, final String innerName, final int access) { + final @InternalForm String name, final @InternalForm String outerName, final @Identifier String innerName, final int access) { stringBuilder.setLength(0); stringBuilder.append("classWriter.visitInnerClass("); appendConstant(name); @@ -361,7 +367,7 @@ public void visitInnerClass( @Override public ASMifier visitRecordComponent( - final String name, final String descriptor, final String signature) { + final @Identifier String name, final String descriptor, final String signature) { stringBuilder.setLength(0); stringBuilder.append("{\n"); stringBuilder.append("recordComponentVisitor = classWriter.visitRecordComponent("); @@ -408,10 +414,10 @@ public ASMifier visitField( @Override public ASMifier visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { stringBuilder.setLength(0); stringBuilder.append("{\n"); stringBuilder.append("methodVisitor = classWriter.visitMethod("); @@ -454,7 +460,7 @@ public void visitClassEnd() { // ----------------------------------------------------------------------------------------------- @Override - public void visitMainClass(final String mainClass) { + public void visitMainClass(final @InternalForm String mainClass) { stringBuilder.setLength(0); stringBuilder.append("moduleVisitor.visitMainClass("); appendConstant(mainClass); @@ -463,7 +469,7 @@ public void visitMainClass(final String mainClass) { } @Override - public void visitPackage(final String packaze) { + public void visitPackage(final @DotSeparatedIdentifiers String packaze) { stringBuilder.setLength(0); stringBuilder.append("moduleVisitor.visitPackage("); appendConstant(packaze); @@ -485,17 +491,17 @@ public void visitRequire(final String module, final int access, final String ver } @Override - public void visitExport(final String packaze, final int access, final String... modules) { + public void visitExport(final @DotSeparatedIdentifiers String packaze, final int access, final @DotSeparatedIdentifiers String... modules) { visitExportOrOpen("moduleVisitor.visitExport(", packaze, access, modules); } @Override - public void visitOpen(final String packaze, final int access, final String... modules) { + public void visitOpen(final @DotSeparatedIdentifiers String packaze, final int access, final @DotSeparatedIdentifiers String... modules) { visitExportOrOpen("moduleVisitor.visitOpen(", packaze, access, modules); } private void visitExportOrOpen( - final String visitMethod, final String packaze, final int access, final String... modules) { + final String visitMethod, final @DotSeparatedIdentifiers String packaze, final int access, final @DotSeparatedIdentifiers String... modules) { stringBuilder.setLength(0); stringBuilder.append(visitMethod); appendConstant(packaze); @@ -523,7 +529,7 @@ public void visitUse(final String service) { } @Override - public void visitProvide(final String service, final String... providers) { + public void visitProvide(final @InternalForm String service, final @InternalForm String... providers) { stringBuilder.setLength(0); stringBuilder.append("moduleVisitor.visitProvide("); appendConstant(service); @@ -558,7 +564,7 @@ public void visit(final String name, final Object value) { } @Override - public void visitEnum(final String name, final String descriptor, final String value) { + public void visitEnum(final String name, final @FieldDescriptor String descriptor, final String value) { stringBuilder.setLength(0); stringBuilder.append(ANNOTATION_VISITOR).append(id).append(".visitEnum("); appendConstant(name); @@ -571,7 +577,7 @@ public void visitEnum(final String name, final String descriptor, final String v } @Override - public ASMifier visitAnnotation(final String name, final String descriptor) { + public ASMifier visitAnnotation(final @Identifier String name, final @FieldDescriptor String descriptor) { stringBuilder.setLength(0); stringBuilder .append("{\n") @@ -620,13 +626,13 @@ public void visitAnnotationEnd() { // ----------------------------------------------------------------------------------------------- @Override - public ASMifier visitRecordComponentAnnotation(final String descriptor, final boolean visible) { + public ASMifier visitRecordComponentAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { return visitAnnotation(descriptor, visible); } @Override public ASMifier visitRecordComponentTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { return visitTypeAnnotation(typeRef, typePath, descriptor, visible); } @@ -645,13 +651,13 @@ public void visitRecordComponentEnd() { // ----------------------------------------------------------------------------------------------- @Override - public ASMifier visitFieldAnnotation(final String descriptor, final boolean visible) { + public ASMifier visitFieldAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { return visitAnnotation(descriptor, visible); } @Override public ASMifier visitFieldTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { return visitTypeAnnotation(typeRef, typePath, descriptor, visible); } @@ -699,13 +705,13 @@ public ASMifier visitAnnotationDefault() { } @Override - public ASMifier visitMethodAnnotation(final String descriptor, final boolean visible) { + public ASMifier visitMethodAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { return visitAnnotation(descriptor, visible); } @Override public ASMifier visitMethodTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { return visitTypeAnnotation(typeRef, typePath, descriptor, visible); } @@ -725,7 +731,7 @@ public ASMifier visitAnnotableParameterCount(final int parameterCount, final boo @Override public ASMifier visitParameterAnnotation( - final int parameter, final String descriptor, final boolean visible) { + final int parameter, final @FieldDescriptor String descriptor, final boolean visible) { stringBuilder.setLength(0); stringBuilder .append("{\n") @@ -846,7 +852,7 @@ public void visitVarInsn(final int opcode, final int varIndex) { } @Override - public void visitTypeInsn(final int opcode, final String type) { + public void visitTypeInsn(final int opcode, final @InternalForm String type) { stringBuilder.setLength(0); stringBuilder.append(name).append(".visitTypeInsn(").append(OPCODES[opcode]).append(", "); appendConstant(type); @@ -856,7 +862,7 @@ public void visitTypeInsn(final int opcode, final String type) { @Override public void visitFieldInsn( - final int opcode, final String owner, final String name, final String descriptor) { + final int opcode, final @InternalForm String owner, final @Identifier String name, final @FieldDescriptor String descriptor) { stringBuilder.setLength(0); stringBuilder.append(this.name).append(".visitFieldInsn(").append(OPCODES[opcode]).append(", "); appendConstant(owner); @@ -871,9 +877,9 @@ public void visitFieldInsn( @Override public void visitMethodInsn( final int opcode, - final String owner, - final String name, - final String descriptor, + final @InternalForm String owner, + final @Identifier String name, + final @MethodDescriptor String descriptor, final boolean isInterface) { stringBuilder.setLength(0); stringBuilder @@ -895,7 +901,7 @@ public void visitMethodInsn( @Override public void visitInvokeDynamicInsn( final String name, - final String descriptor, + final @MethodDescriptor String descriptor, final Handle bootstrapMethodHandle, final Object... bootstrapMethodArguments) { stringBuilder.setLength(0); @@ -1008,7 +1014,7 @@ public void visitLookupSwitchInsn(final Label dflt, final int[] keys, final Labe } @Override - public void visitMultiANewArrayInsn(final String descriptor, final int numDimensions) { + public void visitMultiANewArrayInsn(final @FieldDescriptor String descriptor, final int numDimensions) { stringBuilder.setLength(0); stringBuilder.append(name).append(".visitMultiANewArrayInsn("); appendConstant(descriptor); @@ -1018,13 +1024,13 @@ public void visitMultiANewArrayInsn(final String descriptor, final int numDimens @Override public ASMifier visitInsnAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { return visitTypeAnnotation("visitInsnAnnotation", typeRef, typePath, descriptor, visible); } @Override public void visitTryCatchBlock( - final Label start, final Label end, final Label handler, final String type) { + final Label start, final Label end, final Label handler, final @InternalForm String type) { stringBuilder.setLength(0); declareLabel(start); declareLabel(end); @@ -1043,14 +1049,14 @@ public void visitTryCatchBlock( @Override public ASMifier visitTryCatchAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { return visitTypeAnnotation("visitTryCatchAnnotation", typeRef, typePath, descriptor, visible); } @Override public void visitLocalVariable( - final String name, - final String descriptor, + final @Identifier String name, + final @FieldDescriptor String descriptor, final String signature, final Label start, final Label end, @@ -1077,7 +1083,7 @@ public Printer visitLocalVariableAnnotation( final Label[] start, final Label[] end, final int[] index, - final String descriptor, + final @FieldDescriptor String descriptor, final boolean visible) { stringBuilder.setLength(0); stringBuilder @@ -1154,7 +1160,7 @@ public void visitMethodEnd() { * @return a new {@link ASMifier} to visit the annotation values. */ // DontCheck(OverloadMethodsDeclarationOrder): overloads are semantically different. - public ASMifier visitAnnotation(final String descriptor, final boolean visible) { + public ASMifier visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { stringBuilder.setLength(0); stringBuilder .append("{\n") diff --git a/asm-util/src/main/java/org/objectweb/asm/util/CheckAnnotationAdapter.java b/asm-util/src/main/java/org/objectweb/asm/util/CheckAnnotationAdapter.java index 499c0aee..d9a067e2 100644 --- a/asm-util/src/main/java/org/objectweb/asm/util/CheckAnnotationAdapter.java +++ b/asm-util/src/main/java/org/objectweb/asm/util/CheckAnnotationAdapter.java @@ -27,6 +27,8 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.util; +import org.checkerframework.checker.signature.qual.FieldDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; @@ -57,7 +59,7 @@ public CheckAnnotationAdapter(final AnnotationVisitor annotationVisitor) { } @Override - public void visit(final String name, final Object value) { + public void visit(final @Identifier String name, final Object value) { checkVisitEndNotCalled(); checkName(name); if (!(value instanceof Byte @@ -87,7 +89,7 @@ public void visit(final String name, final Object value) { } @Override - public void visitEnum(final String name, final String descriptor, final String value) { + public void visitEnum(final @Identifier String name, final @FieldDescriptor String descriptor, final String value) { checkVisitEndNotCalled(); checkName(name); // Annotations can only appear in V1_5 or more classes. @@ -99,7 +101,7 @@ public void visitEnum(final String name, final String descriptor, final String v } @Override - public AnnotationVisitor visitAnnotation(final String name, final String descriptor) { + public AnnotationVisitor visitAnnotation(final @Identifier String name, final @FieldDescriptor String descriptor) { checkVisitEndNotCalled(); checkName(name); // Annotations can only appear in V1_5 or more classes. @@ -108,7 +110,7 @@ public AnnotationVisitor visitAnnotation(final String name, final String descrip } @Override - public AnnotationVisitor visitArray(final String name) { + public AnnotationVisitor visitArray(final @Identifier String name) { checkVisitEndNotCalled(); checkName(name); return new CheckAnnotationAdapter(super.visitArray(name), false); diff --git a/asm-util/src/main/java/org/objectweb/asm/util/CheckClassAdapter.java b/asm-util/src/main/java/org/objectweb/asm/util/CheckClassAdapter.java index 80ada1a9..51778218 100644 --- a/asm-util/src/main/java/org/objectweb/asm/util/CheckClassAdapter.java +++ b/asm-util/src/main/java/org/objectweb/asm/util/CheckClassAdapter.java @@ -27,6 +27,14 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.util; +import org.checkerframework.checker.signature.qual.FullyQualifiedName; +import org.checkerframework.checker.signature.qual.FieldDescriptor; +import org.checkerframework.checker.signature.qual.MethodDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.DotSeparatedIdentifiers; +import org.checkerframework.checker.signature.qual.InternalForm; +import org.checkerframework.checker.nullness.qual.MonotonicNonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; @@ -143,7 +151,7 @@ public class CheckClassAdapter extends ClassVisitor { * The common package of all the nest members. Not {@literal null} if the visitNestMember method * has been called. */ - private String nestMemberPackageName; + private @MonotonicNonNull String nestMemberPackageName; /** Whether the {@link #visitEnd} method has been called. */ private boolean visitEndCalled; @@ -204,10 +212,10 @@ protected CheckClassAdapter( public void visit( final int version, final int access, - final String name, + final @InternalForm String name, // may end with "package-info" or "module-info" final String signature, - final String superName, - final String[] interfaces) { + final @InternalForm String superName, + final @InternalForm String @Nullable [] interfaces) { if (visitCalled) { throw new IllegalStateException("visit must be called only once"); } @@ -273,7 +281,7 @@ public void visitSource(final String file, final String debug) { } @Override - public ModuleVisitor visitModule(final String name, final int access, final String version) { + public ModuleVisitor visitModule(final @DotSeparatedIdentifiers String name, final int access, final String version) { checkState(); if (visitModuleCalled) { throw new IllegalStateException("visitModule can be called only once."); @@ -289,7 +297,7 @@ public ModuleVisitor visitModule(final String name, final int access, final Stri } @Override - public void visitNestHost(final String nestHost) { + public void visitNestHost(final @InternalForm String nestHost) { checkState(); CheckMethodAdapter.checkInternalName(version, nestHost, "nestHost"); if (visitNestHostCalled) { @@ -303,7 +311,7 @@ public void visitNestHost(final String nestHost) { } @Override - public void visitNestMember(final String nestMember) { + public void visitNestMember(final @InternalForm String nestMember) { checkState(); CheckMethodAdapter.checkInternalName(version, nestMember, "nestMember"); if (visitNestHostCalled) { @@ -321,14 +329,14 @@ public void visitNestMember(final String nestMember) { } @Override - public void visitPermittedSubclass(final String permittedSubclass) { + public void visitPermittedSubclass(final @InternalForm String permittedSubclass) { checkState(); CheckMethodAdapter.checkInternalName(version, permittedSubclass, "permittedSubclass"); super.visitPermittedSubclass(permittedSubclass); } @Override - public void visitOuterClass(final String owner, final String name, final String descriptor) { + public void visitOuterClass(final @InternalForm String owner, final @Nullable @Identifier String name, final @MethodDescriptor String descriptor) { checkState(); if (visitOuterClassCalled) { throw new IllegalStateException("visitOuterClass can be called only once."); @@ -345,7 +353,7 @@ public void visitOuterClass(final String owner, final String name, final String @Override public void visitInnerClass( - final String name, final String outerName, final String innerName, final int access) { + final @InternalForm String name, final @InternalForm String outerName, final @Identifier String innerName, final int access) { checkState(); CheckMethodAdapter.checkInternalName(version, name, "class name"); if (outerName != null) { @@ -377,7 +385,7 @@ public void visitInnerClass( @Override public RecordComponentVisitor visitRecordComponent( - final String name, final String descriptor, final String signature) { + final @Identifier String name, final @FieldDescriptor String descriptor, final String signature) { checkState(); CheckMethodAdapter.checkUnqualifiedName(version, name, "record component name"); CheckMethodAdapter.checkDescriptor(version, descriptor, /* canBeVoid= */ false); @@ -391,8 +399,8 @@ public RecordComponentVisitor visitRecordComponent( @Override public FieldVisitor visitField( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @FieldDescriptor String descriptor, final String signature, final Object value) { checkState(); @@ -423,10 +431,10 @@ public FieldVisitor visitField( @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { checkState(); checkMethodAccess( version, @@ -477,7 +485,7 @@ public MethodVisitor visitMethod( } @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { checkState(); CheckMethodAdapter.checkDescriptor(version, descriptor, false); return new CheckAnnotationAdapter(super.visitAnnotation(descriptor, visible)); @@ -485,7 +493,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean @Override public AnnotationVisitor visitTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { checkState(); int sort = new TypeReference(typeRef).getSort(); if (sort != TypeReference.CLASS_TYPE_PARAMETER @@ -575,7 +583,7 @@ private static void checkMethodAccess( * @param name the name to be checked. * @param source the source of 'name' (e.g 'module' for a module name). */ - static void checkFullyQualifiedName(final int version, final String name, final String source) { + static void checkFullyQualifiedName(final int version, final @DotSeparatedIdentifiers String name, final String source) { try { int startIndex = 0; int dotIndex; @@ -970,7 +978,7 @@ static void checkTypeRef(final int typeRef) { * @param name an internal name. * @return the package name or "" if there is no package. */ - private static String packageName(final String name) { + private static String packageName(final @InternalForm String name) { int index = name.lastIndexOf('/'); if (index == -1) { return ""; @@ -1014,7 +1022,7 @@ static void main(final String[] args, final PrintWriter logger) throws IOExcepti classReader = new ClassReader(inputStream); } } else { - classReader = new ClassReader(args[0]); + classReader = new ClassReader((@FullyQualifiedName String) args[0]); } verify(classReader, false, logger); diff --git a/asm-util/src/main/java/org/objectweb/asm/util/CheckFieldAdapter.java b/asm-util/src/main/java/org/objectweb/asm/util/CheckFieldAdapter.java index 6988f506..dba19db7 100644 --- a/asm-util/src/main/java/org/objectweb/asm/util/CheckFieldAdapter.java +++ b/asm-util/src/main/java/org/objectweb/asm/util/CheckFieldAdapter.java @@ -27,6 +27,7 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.util; +import org.checkerframework.checker.signature.qual.FieldDescriptor; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.Attribute; import org.objectweb.asm.FieldVisitor; @@ -70,7 +71,7 @@ protected CheckFieldAdapter(final int api, final FieldVisitor fieldVisitor) { } @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { checkVisitEndNotCalled(); // Annotations can only appear in V1_5 or more classes. CheckMethodAdapter.checkDescriptor(Opcodes.V1_5, descriptor, false); @@ -79,7 +80,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean @Override public AnnotationVisitor visitTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { checkVisitEndNotCalled(); int sort = new TypeReference(typeRef).getSort(); if (sort != TypeReference.FIELD) { diff --git a/asm-util/src/main/java/org/objectweb/asm/util/CheckFrameAnalyzer.java b/asm-util/src/main/java/org/objectweb/asm/util/CheckFrameAnalyzer.java index b58398c2..2bf101bc 100644 --- a/asm-util/src/main/java/org/objectweb/asm/util/CheckFrameAnalyzer.java +++ b/asm-util/src/main/java/org/objectweb/asm/util/CheckFrameAnalyzer.java @@ -27,6 +27,7 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.util; +import org.checkerframework.checker.signature.qual.InternalForm; import java.util.Collections; import java.util.List; import org.objectweb.asm.Opcodes; @@ -115,7 +116,7 @@ class CheckFrameAnalyzer extends Analyzer { } @Override - protected void init(final String owner, final MethodNode method) throws AnalyzerException { + protected void init(final @InternalForm String owner, final MethodNode method) throws AnalyzerException { insnList = method.instructions; currentLocals = Type.getArgumentsAndReturnSizes(method.desc) >> 2; if ((method.access & Opcodes.ACC_STATIC) != 0) { @@ -229,7 +230,7 @@ protected void init(final String owner, final MethodNode method) throws Analyzer * "instructions", are invalid. */ private void expandFrames( - final String owner, final MethodNode method, final Frame initialFrame) + final @InternalForm String owner, final MethodNode method, final Frame initialFrame) throws AnalyzerException { int lastJvmOrFrameInsnIndex = -1; Frame currentFrame = initialFrame; @@ -263,7 +264,7 @@ private void expandFrames( * @throws AnalyzerException if 'frameNode' is invalid. */ private Frame expandFrame( - final String owner, final Frame previousFrame, final FrameNode frameNode) + final @InternalForm String owner, final Frame previousFrame, final FrameNode frameNode) throws AnalyzerException { Frame frame = newFrame(previousFrame); List locals = frameNode.local == null ? Collections.emptyList() : frameNode.local; @@ -326,7 +327,7 @@ private Frame expandFrame( * @return a value that represents the given type. * @throws AnalyzerException if 'type' is an invalid stack map frame type. */ - private V newFrameValue(final String owner, final FrameNode frameNode, final Object type) + private V newFrameValue(final @InternalForm String owner, final FrameNode frameNode, final Object type) throws AnalyzerException { if (type == Opcodes.TOP) { return interpreter.newValue(null); @@ -343,7 +344,7 @@ private V newFrameValue(final String owner, final FrameNode frameNode, final Obj } else if (type == Opcodes.UNINITIALIZED_THIS) { return interpreter.newValue(Type.getObjectType(owner)); } else if (type instanceof String) { - return interpreter.newValue(Type.getObjectType((String) type)); + return interpreter.newValue(Type.getObjectType((@InternalForm String) type)); } else if (type instanceof LabelNode) { AbstractInsnNode referencedNode = (LabelNode) type; while (referencedNode != null && !isJvmInsnNode(referencedNode)) { diff --git a/asm-util/src/main/java/org/objectweb/asm/util/CheckMethodAdapter.java b/asm-util/src/main/java/org/objectweb/asm/util/CheckMethodAdapter.java index ed18dc00..f62f4df4 100644 --- a/asm-util/src/main/java/org/objectweb/asm/util/CheckMethodAdapter.java +++ b/asm-util/src/main/java/org/objectweb/asm/util/CheckMethodAdapter.java @@ -27,6 +27,11 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.util; +import org.checkerframework.checker.signature.qual.MethodDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.InternalForm; +import org.checkerframework.checker.signature.qual.FieldDescriptor; + import java.io.PrintWriter; import java.io.StringWriter; import java.util.ArrayList; @@ -409,8 +414,8 @@ protected CheckMethodAdapter( */ public CheckMethodAdapter( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final MethodVisitor methodVisitor, final Map labelInsnIndices) { this( @@ -437,8 +442,8 @@ public CheckMethodAdapter( protected CheckMethodAdapter( final int api, final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final MethodVisitor methodVisitor, final Map labelInsnIndices) { this( @@ -504,7 +509,7 @@ public void visitParameter(final String name, final int access) { } @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { checkVisitEndNotCalled(); checkDescriptor(version, descriptor, false); return new CheckAnnotationAdapter(super.visitAnnotation(descriptor, visible)); @@ -512,7 +517,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean @Override public AnnotationVisitor visitTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { checkVisitEndNotCalled(); int sort = new TypeReference(typeRef).getSort(); if (sort != TypeReference.METHOD_TYPE_PARAMETER @@ -548,7 +553,7 @@ public void visitAnnotableParameterCount(final int parameterCount, final boolean @Override public AnnotationVisitor visitParameterAnnotation( - final int parameter, final String descriptor, final boolean visible) { + final int parameter, final @FieldDescriptor String descriptor, final boolean visible) { checkVisitEndNotCalled(); if ((visible && visibleAnnotableParameterCount > 0 @@ -700,7 +705,7 @@ public void visitVarInsn(final int opcode, final int varIndex) { } @Override - public void visitTypeInsn(final int opcode, final String type) { + public void visitTypeInsn(final int opcode, final @InternalForm String type) { checkVisitCodeCalled(); checkVisitMaxsNotCalled(); checkOpcodeMethod(opcode, Method.VISIT_TYPE_INSN); @@ -714,7 +719,7 @@ public void visitTypeInsn(final int opcode, final String type) { @Override public void visitFieldInsn( - final int opcode, final String owner, final String name, final String descriptor) { + final int opcode, final @InternalForm String owner, final @Identifier String name, final @FieldDescriptor String descriptor) { checkVisitCodeCalled(); checkVisitMaxsNotCalled(); checkOpcodeMethod(opcode, Method.VISIT_FIELD_INSN); @@ -728,9 +733,9 @@ public void visitFieldInsn( @Override public void visitMethodInsn( final int opcodeAndSource, - final String owner, - final String name, - final String descriptor, + final @InternalForm String owner, + final @Identifier String name, + final @MethodDescriptor String descriptor, final boolean isInterface) { if (api < Opcodes.ASM5 && (opcodeAndSource & Opcodes.SOURCE_DEPRECATED) == 0) { // Redirect the call to the deprecated version of this method. @@ -764,7 +769,7 @@ public void visitMethodInsn( @Override public void visitInvokeDynamicInsn( final String name, - final String descriptor, + final @MethodDescriptor String descriptor, final Handle bootstrapMethodHandle, final Object... bootstrapMethodArguments) { checkVisitCodeCalled(); @@ -864,7 +869,7 @@ public void visitLookupSwitchInsn(final Label dflt, final int[] keys, final Labe } @Override - public void visitMultiANewArrayInsn(final String descriptor, final int numDimensions) { + public void visitMultiANewArrayInsn(final @FieldDescriptor String descriptor, final int numDimensions) { checkVisitCodeCalled(); checkVisitMaxsNotCalled(); checkDescriptor(version, descriptor, false); @@ -887,7 +892,7 @@ public void visitMultiANewArrayInsn(final String descriptor, final int numDimens @Override public AnnotationVisitor visitInsnAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { checkVisitCodeCalled(); checkVisitMaxsNotCalled(); int sort = new TypeReference(typeRef).getSort(); @@ -910,7 +915,7 @@ public AnnotationVisitor visitInsnAnnotation( @Override public void visitTryCatchBlock( - final Label start, final Label end, final Label handler, final String type) { + final Label start, final Label end, final Label handler, final @InternalForm String type) { checkVisitCodeCalled(); checkVisitMaxsNotCalled(); checkLabel(start, /* checkVisited= */ false, START_LABEL); @@ -931,7 +936,7 @@ public void visitTryCatchBlock( @Override public AnnotationVisitor visitTryCatchAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { checkVisitCodeCalled(); checkVisitMaxsNotCalled(); int sort = new TypeReference(typeRef).getSort(); @@ -946,8 +951,8 @@ public AnnotationVisitor visitTryCatchAnnotation( @Override public void visitLocalVariable( - final String name, - final String descriptor, + final @Identifier String name, + final @FieldDescriptor String descriptor, final String signature, final Label start, final Label end, @@ -978,7 +983,7 @@ public AnnotationVisitor visitLocalVariableAnnotation( final Label[] start, final Label[] end, final int[] index, - final String descriptor, + final @FieldDescriptor String descriptor, final boolean visible) { checkVisitCodeCalled(); checkVisitMaxsNotCalled(); @@ -1091,7 +1096,7 @@ private void checkFrameValue(final Object value) { return; } if (value instanceof String) { - checkInternalName(version, (String) value, "Invalid stack frame value"); + checkInternalName(version, (@InternalForm String) value, "Invalid stack frame value"); } else if (value instanceof Label) { checkLabel((Label) value, /* checkVisited= */ false, "label"); } else { @@ -1310,7 +1315,7 @@ static void checkMethodIdentifier(final int version, final String name, final St * @param name the string to be checked. * @param message the message to use in case of error. */ - static void checkInternalName(final int version, final String name, final String message) { + static void checkInternalName(final int version, final @InternalForm String name, final String message) { if (name == null || name.length() == 0) { throw new IllegalArgumentException(INVALID + message + MUST_NOT_BE_NULL_OR_EMPTY); } @@ -1329,7 +1334,7 @@ static void checkInternalName(final int version, final String name, final String * @param message the message to use in case of error. */ private static void checkInternalClassName( - final int version, final String name, final String message) { + final int version, final @InternalForm String name, final String message) { try { int startIndex = 0; int slashIndex; @@ -1404,7 +1409,7 @@ private static int checkDescriptor( throw new IllegalArgumentException(INVALID_DESCRIPTOR + descriptor); } try { - checkInternalClassName(version, descriptor.substring(startPos + 1, endPos), null); + checkInternalClassName(version, (@InternalForm String) descriptor.substring(startPos + 1, endPos), null); } catch (IllegalArgumentException e) { throw new IllegalArgumentException(INVALID_DESCRIPTOR + descriptor, e); } diff --git a/asm-util/src/main/java/org/objectweb/asm/util/CheckModuleAdapter.java b/asm-util/src/main/java/org/objectweb/asm/util/CheckModuleAdapter.java index bb748ae2..f4a4db74 100644 --- a/asm-util/src/main/java/org/objectweb/asm/util/CheckModuleAdapter.java +++ b/asm-util/src/main/java/org/objectweb/asm/util/CheckModuleAdapter.java @@ -27,6 +27,8 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.util; +import org.checkerframework.checker.signature.qual.DotSeparatedIdentifiers; +import org.checkerframework.checker.signature.qual.InternalForm; import java.util.HashSet; import org.objectweb.asm.ModuleVisitor; import org.objectweb.asm.Opcodes; @@ -93,20 +95,21 @@ protected CheckModuleAdapter( } @Override - public void visitMainClass(final String mainClass) { + public void visitMainClass(final @InternalForm String mainClass) { // Modules can only appear in V9 or more classes. CheckMethodAdapter.checkInternalName(Opcodes.V9, mainClass, "module main class"); super.visitMainClass(mainClass); } @Override - public void visitPackage(final String packaze) { + @SuppressWarnings("signature:argument") // bug: checkInternalName is being passed a @DotSeparatedIdentifiers + public void visitPackage(final @DotSeparatedIdentifiers String packaze) { CheckMethodAdapter.checkInternalName(Opcodes.V9, packaze, "module package"); super.visitPackage(packaze); } @Override - public void visitRequire(final String module, final int access, final String version) { + public void visitRequire(final @DotSeparatedIdentifiers String module, final int access, final String version) { checkVisitEndNotCalled(); CheckClassAdapter.checkFullyQualifiedName(Opcodes.V9, module, "required module"); requiredModules.checkNameNotAlreadyDeclared(module); @@ -128,7 +131,8 @@ public void visitRequire(final String module, final int access, final String ver } @Override - public void visitExport(final String packaze, final int access, final String... modules) { + @SuppressWarnings("signature:argument") // bug: checkInternalName is being passed a @DotSeparatedIdentifiers + public void visitExport(final @DotSeparatedIdentifiers String packaze, final int access, final @DotSeparatedIdentifiers String... modules) { checkVisitEndNotCalled(); CheckMethodAdapter.checkInternalName(Opcodes.V9, packaze, "package name"); exportedPackages.checkNameNotAlreadyDeclared(packaze); @@ -142,7 +146,8 @@ public void visitExport(final String packaze, final int access, final String... } @Override - public void visitOpen(final String packaze, final int access, final String... modules) { + @SuppressWarnings("signature:argument") // bug: checkInternalName is being passed a @DotSeparatedIdentifiers + public void visitOpen(final @DotSeparatedIdentifiers String packaze, final int access, final @DotSeparatedIdentifiers String... modules) { checkVisitEndNotCalled(); if (isOpen) { throw new UnsupportedOperationException("An open module can not use open directive"); @@ -159,7 +164,7 @@ public void visitOpen(final String packaze, final int access, final String... mo } @Override - public void visitUse(final String service) { + public void visitUse(final @InternalForm String service) { checkVisitEndNotCalled(); CheckMethodAdapter.checkInternalName(Opcodes.V9, service, "service"); usedServices.checkNameNotAlreadyDeclared(service); @@ -167,7 +172,7 @@ public void visitUse(final String service) { } @Override - public void visitProvide(final String service, final String... providers) { + public void visitProvide(final @InternalForm String service, final @InternalForm String... providers) { checkVisitEndNotCalled(); CheckMethodAdapter.checkInternalName(Opcodes.V9, service, "service"); providedServices.checkNameNotAlreadyDeclared(service); diff --git a/asm-util/src/main/java/org/objectweb/asm/util/CheckRecordComponentAdapter.java b/asm-util/src/main/java/org/objectweb/asm/util/CheckRecordComponentAdapter.java index f6838778..0a480cf4 100644 --- a/asm-util/src/main/java/org/objectweb/asm/util/CheckRecordComponentAdapter.java +++ b/asm-util/src/main/java/org/objectweb/asm/util/CheckRecordComponentAdapter.java @@ -27,6 +27,7 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.util; +import org.checkerframework.checker.signature.qual.FieldDescriptor; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.Attribute; import org.objectweb.asm.Opcodes; @@ -75,7 +76,7 @@ protected CheckRecordComponentAdapter( } @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { checkVisitEndNotCalled(); // Annotations can only appear in V1_5 or more classes. CheckMethodAdapter.checkDescriptor(Opcodes.V1_5, descriptor, false); @@ -84,7 +85,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean @Override public AnnotationVisitor visitTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { checkVisitEndNotCalled(); int sort = new TypeReference(typeRef).getSort(); if (sort != TypeReference.FIELD) { diff --git a/asm-util/src/main/java/org/objectweb/asm/util/CheckSignatureAdapter.java b/asm-util/src/main/java/org/objectweb/asm/util/CheckSignatureAdapter.java index ed707b18..91f1d0e8 100644 --- a/asm-util/src/main/java/org/objectweb/asm/util/CheckSignatureAdapter.java +++ b/asm-util/src/main/java/org/objectweb/asm/util/CheckSignatureAdapter.java @@ -27,6 +27,8 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.util; +import org.checkerframework.checker.signature.qual.InternalForm; +import org.checkerframework.checker.signature.qual.Identifier; import java.util.EnumSet; import org.objectweb.asm.Opcodes; import org.objectweb.asm.signature.SignatureVisitor; @@ -147,7 +149,7 @@ protected CheckSignatureAdapter( // class and method signatures @Override - public void visitFormalTypeParameter(final String name) { + public void visitFormalTypeParameter(final @Identifier String name) { if (type == TYPE_SIGNATURE || !VISIT_FORMAL_TYPE_PARAMETER_STATES.contains(state)) { throw new IllegalStateException(); } @@ -255,7 +257,7 @@ public void visitBaseType(final char descriptor) { } @Override - public void visitTypeVariable(final String name) { + public void visitTypeVariable(final @Identifier String name) { if (type != TYPE_SIGNATURE || state != State.EMPTY) { throw new IllegalStateException(); } @@ -277,7 +279,7 @@ public SignatureVisitor visitArrayType() { } @Override - public void visitClassType(final String name) { + public void visitClassType(final @InternalForm String name) { if (type != TYPE_SIGNATURE || state != State.EMPTY) { throw new IllegalStateException(); } diff --git a/asm-util/src/main/java/org/objectweb/asm/util/Printer.java b/asm-util/src/main/java/org/objectweb/asm/util/Printer.java index f670dcc3..ef485b42 100644 --- a/asm-util/src/main/java/org/objectweb/asm/util/Printer.java +++ b/asm-util/src/main/java/org/objectweb/asm/util/Printer.java @@ -27,6 +27,13 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.util; +import org.checkerframework.checker.signature.qual.FullyQualifiedName; +import org.checkerframework.checker.signature.qual.MethodDescriptor; +import org.checkerframework.checker.signature.qual.FieldDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.DotSeparatedIdentifiers; +import org.checkerframework.checker.signature.qual.InternalForm; +import org.checkerframework.checker.nullness.qual.Nullable; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; @@ -350,10 +357,10 @@ protected Printer(final int api) { public abstract void visit( int version, int access, - String name, + @InternalForm String name, String signature, - String superName, - String[] interfaces); + @InternalForm String superName, + @InternalForm String @Nullable [] interfaces); /** * Class source. See {@link org.objectweb.asm.ClassVisitor#visitSource}. @@ -374,7 +381,7 @@ public abstract void visit( * @param version the module version, or {@literal null}. * @return the printer. */ - public Printer visitModule(final String name, final int access, final String version) { + public Printer visitModule(final @DotSeparatedIdentifiers String name, final int access, final String version) { throw new UnsupportedOperationException(UNSUPPORTED_OPERATION); } @@ -389,7 +396,7 @@ public Printer visitModule(final String name, final int access, final String ver * @param nestHost the internal name of the host class of the nest (see {@link * Type#getInternalName()}). */ - public void visitNestHost(final String nestHost) { + public void visitNestHost(final @InternalForm String nestHost) { throw new UnsupportedOperationException(UNSUPPORTED_OPERATION); } @@ -403,7 +410,7 @@ public void visitNestHost(final String nestHost) { * @param descriptor the descriptor of the method that contains the class, or {@literal null} if * the class is not enclosed in a method of its enclosing class. */ - public abstract void visitOuterClass(String owner, String name, String descriptor); + public abstract void visitOuterClass(@InternalForm String owner, @Nullable @Identifier String name, @MethodDescriptor String descriptor); /** * Class annotation. See {@link org.objectweb.asm.ClassVisitor#visitAnnotation}. @@ -412,7 +419,7 @@ public void visitNestHost(final String nestHost) { * @param visible {@literal true} if the annotation is visible at runtime. * @return the printer. */ - public abstract Printer visitClassAnnotation(String descriptor, boolean visible); + public abstract Printer visitClassAnnotation(@FieldDescriptor String descriptor, boolean visible); /** * Class type annotation. See {@link org.objectweb.asm.ClassVisitor#visitTypeAnnotation}. @@ -429,7 +436,7 @@ public void visitNestHost(final String nestHost) { * @return the printer. */ public Printer visitClassTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { throw new UnsupportedOperationException(UNSUPPORTED_OPERATION); } @@ -449,7 +456,7 @@ public Printer visitClassTypeAnnotation( * * @param nestMember the internal name of a nest member (see {@link Type#getInternalName()}). */ - public void visitNestMember(final String nestMember) { + public void visitNestMember(final @InternalForm String nestMember) { throw new UnsupportedOperationException(UNSUPPORTED_OPERATION); } @@ -460,7 +467,7 @@ public void visitNestMember(final String nestMember) { * @param permittedSubclass the internal name of a permitted subclass (see {@link * Type#getInternalName()}). */ - public void visitPermittedSubclass(final String permittedSubclass) { + public void visitPermittedSubclass(final @InternalForm String permittedSubclass) { throw new UnsupportedOperationException(UNSUPPORTED_OPERATION); } @@ -475,7 +482,7 @@ public void visitPermittedSubclass(final String permittedSubclass) { * @param access the access flags of the inner class as originally declared in the enclosing * class. */ - public abstract void visitInnerClass(String name, String outerName, String innerName, int access); + public abstract void visitInnerClass(final @InternalForm String name, final @InternalForm String outerName, final @Identifier String innerName, final int access); /** * Visits a record component of the class. See {@link @@ -489,7 +496,7 @@ public void visitPermittedSubclass(final String permittedSubclass) { * if this class visitor is not interested in visiting these annotations and attributes. */ public Printer visitRecordComponent( - final String name, final String descriptor, final String signature) { + final @Identifier String name, final @FieldDescriptor String descriptor, final String signature) { throw new UnsupportedOperationException(UNSUPPORTED_OPERATION); } @@ -511,7 +518,7 @@ public Printer visitRecordComponent( * @return the printer. */ public abstract Printer visitField( - int access, String name, String descriptor, String signature, Object value); + int access, @Identifier String name, @FieldDescriptor String descriptor, String signature, Object value); /** * Class method. See {@link org.objectweb.asm.ClassVisitor#visitMethod}. @@ -527,7 +534,7 @@ public abstract Printer visitField( * @return the printer. */ public abstract Printer visitMethod( - int access, String name, String descriptor, String signature, String[] exceptions); + int access, @Identifier String name, @MethodDescriptor String descriptor, String signature, @InternalForm String @Nullable [] exceptions); /** Class end. See {@link org.objectweb.asm.ClassVisitor#visitEnd}. */ public abstract void visitClassEnd(); @@ -542,7 +549,7 @@ public abstract Printer visitMethod( * @param mainClass the internal name of the main class of the current module (see {@link * Type#getInternalName()}). */ - public void visitMainClass(final String mainClass) { + public void visitMainClass(final @InternalForm String mainClass) { throw new UnsupportedOperationException(UNSUPPORTED_OPERATION); } @@ -551,7 +558,7 @@ public void visitMainClass(final String mainClass) { * * @param packaze the internal name of a package (see {@link Type#getInternalName()}). */ - public void visitPackage(final String packaze) { + public void visitPackage(final @DotSeparatedIdentifiers String packaze) { throw new UnsupportedOperationException(UNSUPPORTED_OPERATION); } @@ -563,7 +570,7 @@ public void visitPackage(final String packaze) { * ACC_STATIC_PHASE}, {@code ACC_SYNTHETIC} and {@code ACC_MANDATED}. * @param version the module version at compile time, or {@literal null}. */ - public void visitRequire(final String module, final int access, final String version) { + public void visitRequire(final @DotSeparatedIdentifiers String module, final int access, final String version) { throw new UnsupportedOperationException(UNSUPPORTED_OPERATION); } @@ -576,7 +583,7 @@ public void visitRequire(final String module, final int access, final String ver * @param modules the fully qualified names (using dots) of the modules that can access the public * classes of the exported package, or {@literal null}. */ - public void visitExport(final String packaze, final int access, final String... modules) { + public void visitExport(final @DotSeparatedIdentifiers String packaze, final int access, final @DotSeparatedIdentifiers String... modules) { throw new UnsupportedOperationException(UNSUPPORTED_OPERATION); } @@ -589,7 +596,7 @@ public void visitExport(final String packaze, final int access, final String... * @param modules the fully qualified names (using dots) of the modules that can use deep * reflection to the classes of the open package, or {@literal null}. */ - public void visitOpen(final String packaze, final int access, final String... modules) { + public void visitOpen(final @DotSeparatedIdentifiers String packaze, final int access, final @DotSeparatedIdentifiers String... modules) { throw new UnsupportedOperationException(UNSUPPORTED_OPERATION); } @@ -598,7 +605,7 @@ public void visitOpen(final String packaze, final int access, final String... mo * * @param service the internal name of the service (see {@link Type#getInternalName()}). */ - public void visitUse(final String service) { + public void visitUse(final @InternalForm String service) { throw new UnsupportedOperationException(UNSUPPORTED_OPERATION); } @@ -609,7 +616,7 @@ public void visitUse(final String service) { * @param providers the internal names of the implementations of the service (there is at least * one provider). */ - public void visitProvide(final String service, final String... providers) { + public void visitProvide(final @InternalForm String service, final @InternalForm String... providers) { throw new UnsupportedOperationException(UNSUPPORTED_OPERATION); } @@ -643,7 +650,7 @@ public void visitModuleEnd() { * @param descriptor the class descriptor of the enumeration class. * @param value the actual enumeration value. */ - public abstract void visitEnum(String name, String descriptor, String value); + public abstract void visitEnum(String name, @FieldDescriptor String descriptor, String value); /** * Nested annotation value. See {@link org.objectweb.asm.AnnotationVisitor#visitAnnotation}. @@ -652,7 +659,7 @@ public void visitModuleEnd() { * @param descriptor the class descriptor of the nested annotation class. * @return the printer. */ - public abstract Printer visitAnnotation(String name, String descriptor); + public abstract Printer visitAnnotation(@Identifier String name, @FieldDescriptor String descriptor); /** * Annotation array value. See {@link org.objectweb.asm.AnnotationVisitor#visitArray}. @@ -678,7 +685,7 @@ public void visitModuleEnd() { * @return a visitor to visit the annotation values, or {@literal null} if this visitor is not * interested in visiting this annotation. */ - public Printer visitRecordComponentAnnotation(final String descriptor, final boolean visible) { + public Printer visitRecordComponentAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { throw new UnsupportedOperationException(UNSUPPORTED_OPERATION); } @@ -699,7 +706,7 @@ public Printer visitRecordComponentAnnotation(final String descriptor, final boo * interested in visiting this annotation. */ public Printer visitRecordComponentTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { throw new UnsupportedOperationException(UNSUPPORTED_OPERATION); } @@ -733,7 +740,7 @@ public void visitRecordComponentEnd() { * @param visible {@literal true} if the annotation is visible at runtime. * @return the printer. */ - public abstract Printer visitFieldAnnotation(String descriptor, boolean visible); + public abstract Printer visitFieldAnnotation(@FieldDescriptor String descriptor, boolean visible); /** * Field type annotation. See {@link org.objectweb.asm.FieldVisitor#visitTypeAnnotation}. @@ -748,7 +755,7 @@ public void visitRecordComponentEnd() { * @return the printer. */ public Printer visitFieldTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { throw new UnsupportedOperationException(UNSUPPORTED_OPERATION); } @@ -791,7 +798,7 @@ public void visitParameter(final String name, final int access) { * @param visible {@literal true} if the annotation is visible at runtime. * @return the printer. */ - public abstract Printer visitMethodAnnotation(String descriptor, boolean visible); + public abstract Printer visitMethodAnnotation(@FieldDescriptor String descriptor, boolean visible); /** * Method type annotation. See {@link org.objectweb.asm.MethodVisitor#visitTypeAnnotation}. @@ -809,7 +816,7 @@ public void visitParameter(final String name, final int access) { * @return the printer. */ public Printer visitMethodTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { throw new UnsupportedOperationException(UNSUPPORTED_OPERATION); } @@ -846,7 +853,7 @@ public Printer visitAnnotableParameterCount(final int parameterCount, final bool * @return the printer. */ public abstract Printer visitParameterAnnotation( - int parameter, String descriptor, boolean visible); + int parameter, @FieldDescriptor String descriptor, boolean visible); /** * Method attribute. See {@link org.objectweb.asm.MethodVisitor#visitAttribute}. @@ -929,7 +936,7 @@ public abstract void visitFrame( * @param type the operand of the instruction to be visited. This operand must be the internal * name of an object or array class (see {@link Type#getInternalName()}). */ - public abstract void visitTypeInsn(int opcode, String type); + public abstract void visitTypeInsn(int opcode, @InternalForm String type); /** * Method instruction. See {@link org.objectweb.asm.MethodVisitor#visitFieldInsn}. @@ -940,7 +947,7 @@ public abstract void visitFrame( * @param name the field's name. * @param descriptor the field's descriptor (see {@link Type}). */ - public abstract void visitFieldInsn(int opcode, String owner, String name, String descriptor); + public abstract void visitFieldInsn(int opcode, @InternalForm String owner, @Identifier String name, @FieldDescriptor String descriptor); /** * Method instruction. See {@link org.objectweb.asm.MethodVisitor#visitMethodInsn}. @@ -955,7 +962,7 @@ public abstract void visitFrame( */ @Deprecated public void visitMethodInsn( - final int opcode, final String owner, final String name, final String descriptor) { + final int opcode, final @InternalForm String owner, final @Identifier String name, final @MethodDescriptor String descriptor) { // This method was abstract before ASM5, and was therefore always overridden (without any // call to 'super'). Thus, at this point we necessarily have api >= ASM5, and we must then // redirect the method call to the ASM5 visitMethodInsn() method. @@ -975,9 +982,9 @@ public void visitMethodInsn( */ public void visitMethodInsn( final int opcode, - final String owner, - final String name, - final String descriptor, + final @InternalForm String owner, + final @Identifier String name, + final @MethodDescriptor String descriptor, final boolean isInterface) { throw new UnsupportedOperationException(UNSUPPORTED_OPERATION); } @@ -995,7 +1002,7 @@ public void visitMethodInsn( */ public abstract void visitInvokeDynamicInsn( String name, - String descriptor, + @MethodDescriptor String descriptor, Handle bootstrapMethodHandle, Object... bootstrapMethodArguments); @@ -1064,7 +1071,7 @@ public abstract void visitInvokeDynamicInsn( * @param descriptor an array type descriptor (see {@link Type}). * @param numDimensions the number of dimensions of the array to allocate. */ - public abstract void visitMultiANewArrayInsn(String descriptor, int numDimensions); + public abstract void visitMultiANewArrayInsn(@FieldDescriptor String descriptor, int numDimensions); /** * Instruction type annotation. See {@link org.objectweb.asm.MethodVisitor#visitInsnAnnotation}. @@ -1084,7 +1091,7 @@ public abstract void visitInvokeDynamicInsn( * @return the printer. */ public Printer visitInsnAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { throw new UnsupportedOperationException(UNSUPPORTED_OPERATION); } @@ -1098,7 +1105,7 @@ public Printer visitInsnAnnotation( * Type#getInternalName()}), or {@literal null} to catch any exceptions (for "finally" * blocks). */ - public abstract void visitTryCatchBlock(Label start, Label end, Label handler, String type); + public abstract void visitTryCatchBlock(Label start, Label end, Label handler, @InternalForm String type); /** * Try catch block type annotation. See {@link @@ -1114,7 +1121,7 @@ public Printer visitInsnAnnotation( * @return the printer. */ public Printer visitTryCatchAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { throw new UnsupportedOperationException(UNSUPPORTED_OPERATION); } @@ -1131,7 +1138,7 @@ public Printer visitTryCatchAnnotation( * @param index the local variable's index. */ public abstract void visitLocalVariable( - String name, String descriptor, String signature, Label start, Label end, int index); + @Identifier String name, @FieldDescriptor String descriptor, String signature, Label start, Label end, int index); /** * Local variable type annotation. See {@link @@ -1159,7 +1166,7 @@ public Printer visitLocalVariableAnnotation( final Label[] start, final Label[] end, final int[] index, - final String descriptor, + final @FieldDescriptor String descriptor, final boolean visible) { throw new UnsupportedOperationException(UNSUPPORTED_OPERATION); } @@ -1286,7 +1293,7 @@ static void main( TraceClassVisitor traceClassVisitor = new TraceClassVisitor(null, printer, output); - String className; + @FullyQualifiedName String className; int parsingOptions; if (args[0].equals("-nodebug")) { className = args[1]; diff --git a/asm-util/src/main/java/org/objectweb/asm/util/Textifier.java b/asm-util/src/main/java/org/objectweb/asm/util/Textifier.java index 17dbcbf3..dd28930d 100644 --- a/asm-util/src/main/java/org/objectweb/asm/util/Textifier.java +++ b/asm-util/src/main/java/org/objectweb/asm/util/Textifier.java @@ -27,6 +27,12 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.util; +import org.checkerframework.checker.signature.qual.DotSeparatedIdentifiers; +import org.checkerframework.checker.signature.qual.FieldDescriptor; +import org.checkerframework.checker.signature.qual.MethodDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.InternalForm; +import org.checkerframework.checker.nullness.qual.Nullable; import java.io.IOException; import java.io.PrintWriter; import java.util.Arrays; @@ -166,10 +172,10 @@ static void main(final String[] args, final PrintWriter output, final PrintWrite public void visit( final int version, final int access, - final String name, + final @InternalForm String name, final String signature, - final String superName, - final String[] interfaces) { + final @InternalForm String superName, + final @InternalForm String @Nullable [] interfaces) { if ((access & Opcodes.ACC_MODULE) != 0) { // Modules are printed in visitModule. return; @@ -242,7 +248,7 @@ public void visitSource(final String file, final String debug) { } @Override - public Printer visitModule(final String name, final int access, final String version) { + public Printer visitModule(final @DotSeparatedIdentifiers String name, final int access, final String version) { stringBuilder.setLength(0); if ((access & Opcodes.ACC_OPEN) != 0) { stringBuilder.append("open "); @@ -258,7 +264,7 @@ public Printer visitModule(final String name, final int access, final String ver } @Override - public void visitNestHost(final String nestHost) { + public void visitNestHost(final @InternalForm String nestHost) { stringBuilder.setLength(0); stringBuilder.append(tab).append("NESTHOST "); appendDescriptor(INTERNAL_NAME, nestHost); @@ -267,7 +273,7 @@ public void visitNestHost(final String nestHost) { } @Override - public void visitOuterClass(final String owner, final String name, final String descriptor) { + public void visitOuterClass(final @InternalForm String owner, final @Nullable @Identifier String name, final @MethodDescriptor String descriptor) { stringBuilder.setLength(0); stringBuilder.append(tab).append("OUTERCLASS "); appendDescriptor(INTERNAL_NAME, owner); @@ -281,14 +287,14 @@ public void visitOuterClass(final String owner, final String name, final String } @Override - public Textifier visitClassAnnotation(final String descriptor, final boolean visible) { + public Textifier visitClassAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { text.add("\n"); return visitAnnotation(descriptor, visible); } @Override public Printer visitClassTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { text.add("\n"); return visitTypeAnnotation(typeRef, typePath, descriptor, visible); } @@ -300,7 +306,7 @@ public void visitClassAttribute(final Attribute attribute) { } @Override - public void visitNestMember(final String nestMember) { + public void visitNestMember(final @InternalForm String nestMember) { stringBuilder.setLength(0); stringBuilder.append(tab).append("NESTMEMBER "); appendDescriptor(INTERNAL_NAME, nestMember); @@ -309,7 +315,7 @@ public void visitNestMember(final String nestMember) { } @Override - public void visitPermittedSubclass(final String permittedSubclass) { + public void visitPermittedSubclass(final @InternalForm String permittedSubclass) { stringBuilder.setLength(0); stringBuilder.append(tab).append("PERMITTEDSUBCLASS "); appendDescriptor(INTERNAL_NAME, permittedSubclass); @@ -319,7 +325,7 @@ public void visitPermittedSubclass(final String permittedSubclass) { @Override public void visitInnerClass( - final String name, final String outerName, final String innerName, final int access) { + final @InternalForm String name, final @InternalForm String outerName, final @Identifier String innerName, final int access) { stringBuilder.setLength(0); stringBuilder.append(tab); appendRawAccess(access & ~Opcodes.ACC_SUPER); @@ -337,7 +343,7 @@ public void visitInnerClass( @Override public Printer visitRecordComponent( - final String name, final String descriptor, final String signature) { + final @Identifier String name, final @FieldDescriptor String descriptor, final String signature) { stringBuilder.setLength(0); stringBuilder.append(tab).append("RECORDCOMPONENT "); if (signature != null) { @@ -361,7 +367,7 @@ public Printer visitRecordComponent( public Textifier visitField( final int access, final String name, - final String descriptor, + final @FieldDescriptor String descriptor, final String signature, final Object value) { stringBuilder.setLength(0); @@ -396,10 +402,10 @@ public Textifier visitField( @Override public Textifier visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { stringBuilder.setLength(0); stringBuilder.append('\n'); if ((access & Opcodes.ACC_DEPRECATED) != 0) { @@ -456,14 +462,14 @@ public void visitClassEnd() { // ----------------------------------------------------------------------------------------------- @Override - public void visitMainClass(final String mainClass) { + public void visitMainClass(final @InternalForm String mainClass) { stringBuilder.setLength(0); stringBuilder.append(" // main class ").append(mainClass).append('\n'); text.add(stringBuilder.toString()); } @Override - public void visitPackage(final String packaze) { + public void visitPackage(final @DotSeparatedIdentifiers String packaze) { stringBuilder.setLength(0); stringBuilder.append(" // package ").append(packaze).append('\n'); text.add(stringBuilder.toString()); @@ -488,17 +494,17 @@ public void visitRequire(final String require, final int access, final String ve } @Override - public void visitExport(final String packaze, final int access, final String... modules) { + public void visitExport(final @DotSeparatedIdentifiers String packaze, final int access, final @DotSeparatedIdentifiers String... modules) { visitExportOrOpen("exports ", packaze, access, modules); } @Override - public void visitOpen(final String packaze, final int access, final String... modules) { + public void visitOpen(final @DotSeparatedIdentifiers String packaze, final int access, final @DotSeparatedIdentifiers String... modules) { visitExportOrOpen("opens ", packaze, access, modules); } private void visitExportOrOpen( - final String method, final String packaze, final int access, final String... modules) { + final String method, final @DotSeparatedIdentifiers String packaze, final int access, final @DotSeparatedIdentifiers String... modules) { stringBuilder.setLength(0); stringBuilder.append(tab).append(method); stringBuilder.append(packaze); @@ -518,7 +524,7 @@ private void visitExportOrOpen( } @Override - public void visitUse(final String use) { + public void visitUse(final @InternalForm String use) { stringBuilder.setLength(0); stringBuilder.append(tab).append("uses "); appendDescriptor(INTERNAL_NAME, use); @@ -527,7 +533,7 @@ public void visitUse(final String use) { } @Override - public void visitProvide(final String provide, final String... providers) { + public void visitProvide(final @InternalForm String provide, final @InternalForm String... providers) { stringBuilder.setLength(0); stringBuilder.append(tab).append("provides "); appendDescriptor(INTERNAL_NAME, provide); @@ -670,7 +676,7 @@ private void visitType(final Type value) { } @Override - public void visitEnum(final String name, final String descriptor, final String value) { + public void visitEnum(final String name, final @FieldDescriptor String descriptor, final String value) { visitAnnotationValue(name); appendDescriptor(FIELD_DESCRIPTOR, descriptor); stringBuilder.append('.').append(value); @@ -678,7 +684,7 @@ public void visitEnum(final String name, final String descriptor, final String v } @Override - public Textifier visitAnnotation(final String name, final String descriptor) { + public Textifier visitAnnotation(final @Identifier String name, final @FieldDescriptor String descriptor) { visitAnnotationValue(name); stringBuilder.append('@'); appendDescriptor(FIELD_DESCRIPTOR, descriptor); @@ -713,13 +719,13 @@ private void visitAnnotationValue(final String name) { // ----------------------------------------------------------------------------------------------- @Override - public Textifier visitRecordComponentAnnotation(final String descriptor, final boolean visible) { + public Textifier visitRecordComponentAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { return visitAnnotation(descriptor, visible); } @Override public Printer visitRecordComponentTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { return visitTypeAnnotation(typeRef, typePath, descriptor, visible); } @@ -738,13 +744,13 @@ public void visitRecordComponentEnd() { // ----------------------------------------------------------------------------------------------- @Override - public Textifier visitFieldAnnotation(final String descriptor, final boolean visible) { + public Textifier visitFieldAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { return visitAnnotation(descriptor, visible); } @Override public Printer visitFieldTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { return visitTypeAnnotation(typeRef, typePath, descriptor, visible); } @@ -778,13 +784,13 @@ public Textifier visitAnnotationDefault() { } @Override - public Textifier visitMethodAnnotation(final String descriptor, final boolean visible) { + public Textifier visitMethodAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { return visitAnnotation(descriptor, visible); } @Override public Printer visitMethodTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { return visitTypeAnnotation(typeRef, typePath, descriptor, visible); } @@ -800,7 +806,7 @@ public Textifier visitAnnotableParameterCount(final int parameterCount, final bo @Override public Textifier visitParameterAnnotation( - final int parameter, final String descriptor, final boolean visible) { + final int parameter, final @FieldDescriptor String descriptor, final boolean visible) { stringBuilder.setLength(0); stringBuilder.append(tab2).append('@'); appendDescriptor(FIELD_DESCRIPTOR, descriptor); @@ -893,7 +899,7 @@ public void visitVarInsn(final int opcode, final int varIndex) { } @Override - public void visitTypeInsn(final int opcode, final String type) { + public void visitTypeInsn(final int opcode, final @InternalForm String type) { stringBuilder.setLength(0); stringBuilder.append(tab2).append(OPCODES[opcode]).append(' '); appendDescriptor(INTERNAL_NAME, type); @@ -903,7 +909,7 @@ public void visitTypeInsn(final int opcode, final String type) { @Override public void visitFieldInsn( - final int opcode, final String owner, final String name, final String descriptor) { + final int opcode, final @InternalForm String owner, final @Identifier String name, final @FieldDescriptor String descriptor) { stringBuilder.setLength(0); stringBuilder.append(tab2).append(OPCODES[opcode]).append(' '); appendDescriptor(INTERNAL_NAME, owner); @@ -916,9 +922,9 @@ public void visitFieldInsn( @Override public void visitMethodInsn( final int opcode, - final String owner, - final String name, - final String descriptor, + final @InternalForm String owner, + final @Identifier String name, + final @MethodDescriptor String descriptor, final boolean isInterface) { stringBuilder.setLength(0); stringBuilder.append(tab2).append(OPCODES[opcode]).append(' '); @@ -935,7 +941,7 @@ public void visitMethodInsn( @Override public void visitInvokeDynamicInsn( final String name, - final String descriptor, + final @MethodDescriptor String descriptor, final Handle bootstrapMethodHandle, final Object... bootstrapMethodArguments) { stringBuilder.setLength(0); @@ -1033,7 +1039,7 @@ public void visitLookupSwitchInsn(final Label dflt, final int[] keys, final Labe } @Override - public void visitMultiANewArrayInsn(final String descriptor, final int numDimensions) { + public void visitMultiANewArrayInsn(final @FieldDescriptor String descriptor, final int numDimensions) { stringBuilder.setLength(0); stringBuilder.append(tab2).append("MULTIANEWARRAY "); appendDescriptor(FIELD_DESCRIPTOR, descriptor); @@ -1043,13 +1049,13 @@ public void visitMultiANewArrayInsn(final String descriptor, final int numDimens @Override public Printer visitInsnAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { return visitTypeAnnotation(typeRef, typePath, descriptor, visible); } @Override public void visitTryCatchBlock( - final Label start, final Label end, final Label handler, final String type) { + final Label start, final Label end, final Label handler, final @InternalForm String type) { stringBuilder.setLength(0); stringBuilder.append(tab2).append("TRYCATCHBLOCK "); appendLabel(start); @@ -1065,7 +1071,7 @@ public void visitTryCatchBlock( @Override public Printer visitTryCatchAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { stringBuilder.setLength(0); stringBuilder.append(tab2).append("TRYCATCHBLOCK @"); appendDescriptor(FIELD_DESCRIPTOR, descriptor); @@ -1082,8 +1088,8 @@ public Printer visitTryCatchAnnotation( @Override public void visitLocalVariable( - final String name, - final String descriptor, + final @Identifier String name, + final @FieldDescriptor String descriptor, final String signature, final Label start, final Label end, @@ -1113,7 +1119,7 @@ public Printer visitLocalVariableAnnotation( final Label[] start, final Label[] end, final int[] index, - final String descriptor, + final @FieldDescriptor String descriptor, final boolean visible) { stringBuilder.setLength(0); stringBuilder.append(tab2).append("LOCALVARIABLE @"); @@ -1173,7 +1179,7 @@ public void visitMethodEnd() { * @return a visitor to visit the annotation values. */ // DontCheck(OverloadMethodsDeclarationOrder): overloads are semantically different. - public Textifier visitAnnotation(final String descriptor, final boolean visible) { + public Textifier visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { stringBuilder.setLength(0); stringBuilder.append(tab).append('@'); appendDescriptor(FIELD_DESCRIPTOR, descriptor); @@ -1194,7 +1200,7 @@ public Textifier visitAnnotation(final String descriptor, final boolean visible) * @return a visitor to visit the annotation values. */ public Textifier visitTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { stringBuilder.setLength(0); stringBuilder.append(tab).append('@'); appendDescriptor(FIELD_DESCRIPTOR, descriptor); @@ -1635,7 +1641,7 @@ private void appendFrameTypes(final int numTypes, final Object[] frameTypes) { stringBuilder.append(' '); } if (frameTypes[i] instanceof String) { - String descriptor = (String) frameTypes[i]; + @FieldDescriptor String descriptor = (@FieldDescriptor String) frameTypes[i]; if (descriptor.charAt(0) == '[') { appendDescriptor(FIELD_DESCRIPTOR, descriptor); } else { diff --git a/asm-util/src/main/java/org/objectweb/asm/util/TraceAnnotationVisitor.java b/asm-util/src/main/java/org/objectweb/asm/util/TraceAnnotationVisitor.java index 3b156924..89e6d30e 100644 --- a/asm-util/src/main/java/org/objectweb/asm/util/TraceAnnotationVisitor.java +++ b/asm-util/src/main/java/org/objectweb/asm/util/TraceAnnotationVisitor.java @@ -27,6 +27,8 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.util; +import org.checkerframework.checker.signature.qual.FieldDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.Opcodes; @@ -62,25 +64,25 @@ public TraceAnnotationVisitor(final AnnotationVisitor annotationVisitor, final P } @Override - public void visit(final String name, final Object value) { + public void visit(final @Identifier String name, final Object value) { printer.visit(name, value); super.visit(name, value); } @Override - public void visitEnum(final String name, final String descriptor, final String value) { + public void visitEnum(final @Identifier String name, final @FieldDescriptor String descriptor, final String value) { printer.visitEnum(name, descriptor, value); super.visitEnum(name, descriptor, value); } @Override - public AnnotationVisitor visitAnnotation(final String name, final String descriptor) { + public AnnotationVisitor visitAnnotation(final @Identifier String name, final @FieldDescriptor String descriptor) { Printer annotationPrinter = printer.visitAnnotation(name, descriptor); return new TraceAnnotationVisitor(super.visitAnnotation(name, descriptor), annotationPrinter); } @Override - public AnnotationVisitor visitArray(final String name) { + public AnnotationVisitor visitArray(final @Identifier String name) { Printer arrayPrinter = printer.visitArray(name); return new TraceAnnotationVisitor(super.visitArray(name), arrayPrinter); } diff --git a/asm-util/src/main/java/org/objectweb/asm/util/TraceClassVisitor.java b/asm-util/src/main/java/org/objectweb/asm/util/TraceClassVisitor.java index b7859766..882587cb 100644 --- a/asm-util/src/main/java/org/objectweb/asm/util/TraceClassVisitor.java +++ b/asm-util/src/main/java/org/objectweb/asm/util/TraceClassVisitor.java @@ -27,6 +27,12 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.util; +import org.checkerframework.checker.signature.qual.DotSeparatedIdentifiers; +import org.checkerframework.checker.signature.qual.FieldDescriptor; +import org.checkerframework.checker.signature.qual.MethodDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.InternalForm; +import org.checkerframework.checker.nullness.qual.Nullable; import java.io.PrintWriter; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.Attribute; @@ -128,10 +134,10 @@ public TraceClassVisitor( public void visit( final int version, final int access, - final String name, + final @InternalForm String name, final String signature, - final String superName, - final String[] interfaces) { + final @InternalForm String superName, + final @InternalForm String @Nullable [] interfaces) { p.visit(version, access, name, signature, superName, interfaces); super.visit(version, access, name, signature, superName, interfaces); } @@ -143,25 +149,25 @@ public void visitSource(final String file, final String debug) { } @Override - public ModuleVisitor visitModule(final String name, final int flags, final String version) { + public ModuleVisitor visitModule(final @DotSeparatedIdentifiers String name, final int flags, final String version) { Printer modulePrinter = p.visitModule(name, flags, version); return new TraceModuleVisitor(super.visitModule(name, flags, version), modulePrinter); } @Override - public void visitNestHost(final String nestHost) { + public void visitNestHost(final @InternalForm String nestHost) { p.visitNestHost(nestHost); super.visitNestHost(nestHost); } @Override - public void visitOuterClass(final String owner, final String name, final String descriptor) { + public void visitOuterClass(final @InternalForm String owner, final @Nullable @Identifier String name, final @MethodDescriptor String descriptor) { p.visitOuterClass(owner, name, descriptor); super.visitOuterClass(owner, name, descriptor); } @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { Printer annotationPrinter = p.visitClassAnnotation(descriptor, visible); return new TraceAnnotationVisitor( super.visitAnnotation(descriptor, visible), annotationPrinter); @@ -169,7 +175,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean @Override public AnnotationVisitor visitTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { Printer annotationPrinter = p.visitClassTypeAnnotation(typeRef, typePath, descriptor, visible); return new TraceAnnotationVisitor( super.visitTypeAnnotation(typeRef, typePath, descriptor, visible), annotationPrinter); @@ -182,27 +188,27 @@ public void visitAttribute(final Attribute attribute) { } @Override - public void visitNestMember(final String nestMember) { + public void visitNestMember(final @InternalForm String nestMember) { p.visitNestMember(nestMember); super.visitNestMember(nestMember); } @Override - public void visitPermittedSubclass(final String permittedSubclass) { + public void visitPermittedSubclass(final @InternalForm String permittedSubclass) { p.visitPermittedSubclass(permittedSubclass); super.visitPermittedSubclass(permittedSubclass); } @Override public void visitInnerClass( - final String name, final String outerName, final String innerName, final int access) { + final @InternalForm String name, final @InternalForm String outerName, final @Identifier String innerName, final int access) { p.visitInnerClass(name, outerName, innerName, access); super.visitInnerClass(name, outerName, innerName, access); } @Override public RecordComponentVisitor visitRecordComponent( - final String name, final String descriptor, final String signature) { + final @Identifier String name, final @FieldDescriptor String descriptor, final String signature) { Printer recordComponentPrinter = p.visitRecordComponent(name, descriptor, signature); return new TraceRecordComponentVisitor( super.visitRecordComponent(name, descriptor, signature), recordComponentPrinter); @@ -211,8 +217,8 @@ public RecordComponentVisitor visitRecordComponent( @Override public FieldVisitor visitField( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @FieldDescriptor String descriptor, final String signature, final Object value) { Printer fieldPrinter = p.visitField(access, name, descriptor, signature, value); @@ -223,10 +229,10 @@ public FieldVisitor visitField( @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { Printer methodPrinter = p.visitMethod(access, name, descriptor, signature, exceptions); return new TraceMethodVisitor( super.visitMethod(access, name, descriptor, signature, exceptions), methodPrinter); diff --git a/asm-util/src/main/java/org/objectweb/asm/util/TraceFieldVisitor.java b/asm-util/src/main/java/org/objectweb/asm/util/TraceFieldVisitor.java index eaab60a6..84bcfe62 100644 --- a/asm-util/src/main/java/org/objectweb/asm/util/TraceFieldVisitor.java +++ b/asm-util/src/main/java/org/objectweb/asm/util/TraceFieldVisitor.java @@ -27,6 +27,7 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.util; +import org.checkerframework.checker.signature.qual.FieldDescriptor; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.Attribute; import org.objectweb.asm.FieldVisitor; @@ -65,7 +66,7 @@ public TraceFieldVisitor(final FieldVisitor fieldVisitor, final Printer printer) } @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { Printer annotationPrinter = p.visitFieldAnnotation(descriptor, visible); return new TraceAnnotationVisitor( super.visitAnnotation(descriptor, visible), annotationPrinter); @@ -73,7 +74,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean @Override public AnnotationVisitor visitTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { Printer annotationPrinter = p.visitFieldTypeAnnotation(typeRef, typePath, descriptor, visible); return new TraceAnnotationVisitor( super.visitTypeAnnotation(typeRef, typePath, descriptor, visible), annotationPrinter); diff --git a/asm-util/src/main/java/org/objectweb/asm/util/TraceMethodVisitor.java b/asm-util/src/main/java/org/objectweb/asm/util/TraceMethodVisitor.java index 073c55db..c6327f55 100644 --- a/asm-util/src/main/java/org/objectweb/asm/util/TraceMethodVisitor.java +++ b/asm-util/src/main/java/org/objectweb/asm/util/TraceMethodVisitor.java @@ -27,6 +27,10 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.util; +import org.checkerframework.checker.signature.qual.MethodDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.InternalForm; +import org.checkerframework.checker.signature.qual.FieldDescriptor; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.Attribute; import org.objectweb.asm.Handle; @@ -73,7 +77,7 @@ public void visitParameter(final String name, final int access) { } @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { Printer annotationPrinter = p.visitMethodAnnotation(descriptor, visible); return new TraceAnnotationVisitor( super.visitAnnotation(descriptor, visible), annotationPrinter); @@ -81,7 +85,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean @Override public AnnotationVisitor visitTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { Printer annotationPrinter = p.visitMethodTypeAnnotation(typeRef, typePath, descriptor, visible); return new TraceAnnotationVisitor( super.visitTypeAnnotation(typeRef, typePath, descriptor, visible), annotationPrinter); @@ -107,7 +111,7 @@ public void visitAnnotableParameterCount(final int parameterCount, final boolean @Override public AnnotationVisitor visitParameterAnnotation( - final int parameter, final String descriptor, final boolean visible) { + final int parameter, final @FieldDescriptor String descriptor, final boolean visible) { Printer annotationPrinter = p.visitParameterAnnotation(parameter, descriptor, visible); return new TraceAnnotationVisitor( super.visitParameterAnnotation(parameter, descriptor, visible), annotationPrinter); @@ -149,14 +153,14 @@ public void visitVarInsn(final int opcode, final int varIndex) { } @Override - public void visitTypeInsn(final int opcode, final String type) { + public void visitTypeInsn(final int opcode, final @InternalForm String type) { p.visitTypeInsn(opcode, type); super.visitTypeInsn(opcode, type); } @Override public void visitFieldInsn( - final int opcode, final String owner, final String name, final String descriptor) { + final int opcode, final @InternalForm String owner, final @Identifier String name, final @FieldDescriptor String descriptor) { p.visitFieldInsn(opcode, owner, name, descriptor); super.visitFieldInsn(opcode, owner, name, descriptor); } @@ -165,9 +169,9 @@ public void visitFieldInsn( @SuppressWarnings("deprecation") public void visitMethodInsn( final int opcode, - final String owner, - final String name, - final String descriptor, + final @InternalForm String owner, + final @Identifier String name, + final @MethodDescriptor String descriptor, final boolean isInterface) { // Call the method that p is supposed to implement, depending on its api version. if (p.api < Opcodes.ASM5) { @@ -190,7 +194,7 @@ public void visitMethodInsn( @Override public void visitInvokeDynamicInsn( final String name, - final String descriptor, + final @MethodDescriptor String descriptor, final Handle bootstrapMethodHandle, final Object... bootstrapMethodArguments) { p.visitInvokeDynamicInsn(name, descriptor, bootstrapMethodHandle, bootstrapMethodArguments); @@ -235,14 +239,14 @@ public void visitLookupSwitchInsn(final Label dflt, final int[] keys, final Labe } @Override - public void visitMultiANewArrayInsn(final String descriptor, final int numDimensions) { + public void visitMultiANewArrayInsn(final @FieldDescriptor String descriptor, final int numDimensions) { p.visitMultiANewArrayInsn(descriptor, numDimensions); super.visitMultiANewArrayInsn(descriptor, numDimensions); } @Override public AnnotationVisitor visitInsnAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { Printer annotationPrinter = p.visitInsnAnnotation(typeRef, typePath, descriptor, visible); return new TraceAnnotationVisitor( super.visitInsnAnnotation(typeRef, typePath, descriptor, visible), annotationPrinter); @@ -250,14 +254,14 @@ public AnnotationVisitor visitInsnAnnotation( @Override public void visitTryCatchBlock( - final Label start, final Label end, final Label handler, final String type) { + final Label start, final Label end, final Label handler, final @InternalForm String type) { p.visitTryCatchBlock(start, end, handler, type); super.visitTryCatchBlock(start, end, handler, type); } @Override public AnnotationVisitor visitTryCatchAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { Printer annotationPrinter = p.visitTryCatchAnnotation(typeRef, typePath, descriptor, visible); return new TraceAnnotationVisitor( super.visitTryCatchAnnotation(typeRef, typePath, descriptor, visible), annotationPrinter); @@ -265,8 +269,8 @@ public AnnotationVisitor visitTryCatchAnnotation( @Override public void visitLocalVariable( - final String name, - final String descriptor, + final @Identifier String name, + final @FieldDescriptor String descriptor, final String signature, final Label start, final Label end, @@ -282,7 +286,7 @@ public AnnotationVisitor visitLocalVariableAnnotation( final Label[] start, final Label[] end, final int[] index, - final String descriptor, + final @FieldDescriptor String descriptor, final boolean visible) { Printer annotationPrinter = p.visitLocalVariableAnnotation(typeRef, typePath, start, end, index, descriptor, visible); diff --git a/asm-util/src/main/java/org/objectweb/asm/util/TraceModuleVisitor.java b/asm-util/src/main/java/org/objectweb/asm/util/TraceModuleVisitor.java index 2d04a6a5..566740d8 100644 --- a/asm-util/src/main/java/org/objectweb/asm/util/TraceModuleVisitor.java +++ b/asm-util/src/main/java/org/objectweb/asm/util/TraceModuleVisitor.java @@ -27,6 +27,8 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.util; +import org.checkerframework.checker.signature.qual.DotSeparatedIdentifiers; +import org.checkerframework.checker.signature.qual.InternalForm; import org.objectweb.asm.ModuleVisitor; import org.objectweb.asm.Opcodes; @@ -62,43 +64,43 @@ public TraceModuleVisitor(final ModuleVisitor moduleVisitor, final Printer print } @Override - public void visitMainClass(final String mainClass) { + public void visitMainClass(final @InternalForm String mainClass) { p.visitMainClass(mainClass); super.visitMainClass(mainClass); } @Override - public void visitPackage(final String packaze) { + public void visitPackage(final @DotSeparatedIdentifiers String packaze) { p.visitPackage(packaze); super.visitPackage(packaze); } @Override - public void visitRequire(final String module, final int access, final String version) { + public void visitRequire(final @DotSeparatedIdentifiers String module, final int access, final String version) { p.visitRequire(module, access, version); super.visitRequire(module, access, version); } @Override - public void visitExport(final String packaze, final int access, final String... modules) { + public void visitExport(final @DotSeparatedIdentifiers String packaze, final int access, final @DotSeparatedIdentifiers String... modules) { p.visitExport(packaze, access, modules); super.visitExport(packaze, access, modules); } @Override - public void visitOpen(final String packaze, final int access, final String... modules) { + public void visitOpen(final @DotSeparatedIdentifiers String packaze, final int access, final @DotSeparatedIdentifiers String... modules) { p.visitOpen(packaze, access, modules); super.visitOpen(packaze, access, modules); } @Override - public void visitUse(final String use) { + public void visitUse(final @InternalForm String use) { p.visitUse(use); super.visitUse(use); } @Override - public void visitProvide(final String service, final String... providers) { + public void visitProvide(final @InternalForm String service, final @InternalForm String... providers) { p.visitProvide(service, providers); super.visitProvide(service, providers); } diff --git a/asm-util/src/main/java/org/objectweb/asm/util/TraceRecordComponentVisitor.java b/asm-util/src/main/java/org/objectweb/asm/util/TraceRecordComponentVisitor.java index 882d0877..3b04f65d 100644 --- a/asm-util/src/main/java/org/objectweb/asm/util/TraceRecordComponentVisitor.java +++ b/asm-util/src/main/java/org/objectweb/asm/util/TraceRecordComponentVisitor.java @@ -27,6 +27,7 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.util; +import org.checkerframework.checker.signature.qual.FieldDescriptor; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.Attribute; import org.objectweb.asm.Opcodes; @@ -67,7 +68,7 @@ public TraceRecordComponentVisitor( } @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { Printer annotationPrinter = printer.visitRecordComponentAnnotation(descriptor, visible); return new TraceAnnotationVisitor( super.visitAnnotation(descriptor, visible), annotationPrinter); @@ -75,7 +76,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean @Override public AnnotationVisitor visitTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { Printer annotationPrinter = printer.visitRecordComponentTypeAnnotation(typeRef, typePath, descriptor, visible); return new TraceAnnotationVisitor( diff --git a/asm-util/src/main/java/org/objectweb/asm/util/TraceSignatureVisitor.java b/asm-util/src/main/java/org/objectweb/asm/util/TraceSignatureVisitor.java index 8909d96f..36297178 100644 --- a/asm-util/src/main/java/org/objectweb/asm/util/TraceSignatureVisitor.java +++ b/asm-util/src/main/java/org/objectweb/asm/util/TraceSignatureVisitor.java @@ -27,6 +27,8 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.util; +import org.checkerframework.checker.signature.qual.InternalForm; +import org.checkerframework.checker.signature.qual.Identifier; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -121,7 +123,7 @@ private TraceSignatureVisitor(final StringBuilder stringBuilder) { } @Override - public void visitFormalTypeParameter(final String name) { + public void visitFormalTypeParameter(final @Identifier String name) { declaration.append(formalTypeParameterVisited ? COMMA_SEPARATOR : "<").append(name); formalTypeParameterVisited = true; interfaceBoundVisited = false; @@ -209,7 +211,7 @@ public void visitBaseType(final char descriptor) { } @Override - public void visitTypeVariable(final String name) { + public void visitTypeVariable(final @Identifier String name) { declaration.append(separator).append(name); separator = ""; endType(); @@ -223,7 +225,7 @@ public SignatureVisitor visitArrayType() { } @Override - public void visitClassType(final String name) { + public void visitClassType(final @InternalForm String name) { if ("java/lang/Object".equals(name)) { // 'Map' or 'abstract public V get(Object key);' should have // Object 'but java.lang.String extends java.lang.Object' is unnecessary. diff --git a/asm-util/src/test/java/org/objectweb/asm/util/PrinterTest.java b/asm-util/src/test/java/org/objectweb/asm/util/PrinterTest.java index 0905eb76..ff0d22aa 100644 --- a/asm-util/src/test/java/org/objectweb/asm/util/PrinterTest.java +++ b/asm-util/src/test/java/org/objectweb/asm/util/PrinterTest.java @@ -300,10 +300,10 @@ static class EmptyPrinter extends Printer { public void visit( final int version, final int access, - final String name, + final @InternalForm String name, final String signature, - final String superName, - final String[] interfaces) { + final @InternalForm String superName, + final @InternalForm String @Nullable [] interfaces) { // Do nothing. } @@ -313,12 +313,12 @@ public void visitSource(final String source, final String debug) { } @Override - public void visitOuterClass(final String owner, final String name, final String descriptor) { + public void visitOuterClass(final @InternalForm String owner, final @Nullable @Identifier String name, final @MethodDescriptor String descriptor) { // Do nothing. } @Override - public Printer visitClassAnnotation(final String descriptor, final boolean visible) { + public Printer visitClassAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { return null; } @@ -329,7 +329,7 @@ public void visitClassAttribute(final Attribute attribute) { @Override public void visitInnerClass( - final String name, final String outerName, final String innerName, final int access) { + final @InternalForm String name, final @InternalForm String outerName, final @Identifier String innerName, final int access) { // Do nothing. } @@ -346,10 +346,10 @@ public Printer visitField( @Override public Printer visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { return null; } @@ -365,12 +365,12 @@ public void visit(final String name, final Object value) { } @Override - public void visitEnum(final String name, final String descriptor, final String value) { + public void visitEnum(final String name, final @FieldDescriptor String descriptor, final String value) { // Do nothing. } @Override - public Printer visitAnnotation(final String name, final String descriptor) { + public Printer visitAnnotation(final @Identifier String name, final @FieldDescriptor String descriptor) { return null; } @@ -385,7 +385,7 @@ public void visitAnnotationEnd() { } @Override - public Printer visitFieldAnnotation(final String descriptor, final boolean visible) { + public Printer visitFieldAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { return null; } @@ -405,13 +405,13 @@ public Printer visitAnnotationDefault() { } @Override - public Printer visitMethodAnnotation(final String descriptor, final boolean visible) { + public Printer visitMethodAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { return null; } @Override public Printer visitParameterAnnotation( - final int parameter, final String descriptor, final boolean visible) { + final int parameter, final @FieldDescriptor String descriptor, final boolean visible) { return null; } @@ -451,20 +451,20 @@ public void visitVarInsn(final int opcode, final int varIndex) { } @Override - public void visitTypeInsn(final int opcode, final String type) { + public void visitTypeInsn(final int opcode, final @InternalForm String type) { // Do nothing. } @Override public void visitFieldInsn( - final int opcode, final String owner, final String name, final String descriptor) { + final int opcode, final @InternalForm String owner, final @Identifier String name, final @FieldDescriptor String descriptor) { // Do nothing. } @Override public void visitInvokeDynamicInsn( final String name, - final String descriptor, + final @MethodDescriptor String descriptor, final Handle bootstrapMethodHandle, final Object... bootstrapMethodArguments) { // Do nothing. @@ -502,20 +502,20 @@ public void visitLookupSwitchInsn(final Label dflt, final int[] keys, final Labe } @Override - public void visitMultiANewArrayInsn(final String descriptor, final int numDimensions) { + public void visitMultiANewArrayInsn(final @FieldDescriptor String descriptor, final int numDimensions) { // Do nothing. } @Override public void visitTryCatchBlock( - final Label start, final Label end, final Label handler, final String type) { + final Label start, final Label end, final Label handler, final @InternalForm String type) { // Do nothing. } @Override public void visitLocalVariable( - final String name, - final String descriptor, + final @Identifier String name, + final @FieldDescriptor String descriptor, final String signature, final Label start, final Label end, diff --git a/asm-util/src/test/java/org/objectweb/asm/util/SignaturesProviders.java b/asm-util/src/test/java/org/objectweb/asm/util/SignaturesProviders.java index fdc28a1d..44e55de1 100644 --- a/asm-util/src/test/java/org/objectweb/asm/util/SignaturesProviders.java +++ b/asm-util/src/test/java/org/objectweb/asm/util/SignaturesProviders.java @@ -44,10 +44,10 @@ private static void collectSignatures(final PrecompiledClass classParameter) { public void visit( final int version, final int access, - final String name, + final @InternalForm String name, final String signature, - final String superName, - final String[] interfaces) { + final @InternalForm String superName, + final @InternalForm String @Nullable [] interfaces) { if (signature != null) { CLASS_SIGNATURES.add(signature); } @@ -56,8 +56,8 @@ public void visit( @Override public FieldVisitor visitField( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @FieldDescriptor String descriptor, final String signature, final Object value) { if (signature != null) { @@ -69,10 +69,10 @@ public FieldVisitor visitField( @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { if (signature != null) { METHOD_SIGNATURES.add(signature); } diff --git a/asm-util/src/test/java/org/objectweb/asm/util/TraceClassVisitorTest.java b/asm-util/src/test/java/org/objectweb/asm/util/TraceClassVisitorTest.java index b3491893..8e3d454e 100644 --- a/asm-util/src/test/java/org/objectweb/asm/util/TraceClassVisitorTest.java +++ b/asm-util/src/test/java/org/objectweb/asm/util/TraceClassVisitorTest.java @@ -102,21 +102,21 @@ void testVisitMethods_noNestedDelegate( @Override public ModuleVisitor visitModule( - final String name, final int access, final String version) { + final @DotSeparatedIdentifiers String name, final int access, final String version) { return new TraceModuleVisitor(new Textifier()); } @Override public AnnotationVisitor visitAnnotation( - final String descriptor, final boolean visible) { + final @FieldDescriptor String descriptor, final boolean visible) { return new TraceAnnotationVisitor(new Textifier()); } @Override public FieldVisitor visitField( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @FieldDescriptor String descriptor, final String signature, final Object value) { return new TraceFieldVisitor(new Textifier()); @@ -125,10 +125,10 @@ public FieldVisitor visitField( @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { return new TraceMethodVisitor(new Textifier()); } }, diff --git a/asm/src/main/java/org/objectweb/asm/AnnotationVisitor.java b/asm/src/main/java/org/objectweb/asm/AnnotationVisitor.java index ad5e9634..f8cebc95 100644 --- a/asm/src/main/java/org/objectweb/asm/AnnotationVisitor.java +++ b/asm/src/main/java/org/objectweb/asm/AnnotationVisitor.java @@ -27,6 +27,9 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm; +import org.checkerframework.checker.signature.qual.FieldDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; + /** * A visitor to visit a Java annotation. The methods of this class must be called in the following * order: ( {@code visit} | {@code visitEnum} | {@code visitAnnotation} | {@code visitArray} )* @@ -106,7 +109,7 @@ public AnnotationVisitor getDelegate() { * (this is equivalent to using {@link #visitArray} and visiting each array element in turn, * but is more convenient). */ - public void visit(final String name, final Object value) { + public void visit(final @Identifier String name, final Object value) { if (av != null) { av.visit(name, value); } @@ -119,7 +122,7 @@ public void visit(final String name, final Object value) { * @param descriptor the class descriptor of the enumeration class. * @param value the actual enumeration value. */ - public void visitEnum(final String name, final String descriptor, final String value) { + public void visitEnum(final @Identifier String name, final @FieldDescriptor String descriptor, final String value) { if (av != null) { av.visitEnum(name, descriptor, value); } @@ -134,7 +137,7 @@ public void visitEnum(final String name, final String descriptor, final String v * visitor is not interested in visiting this nested annotation. The nested annotation * value must be fully visited before calling other methods on this annotation visitor. */ - public AnnotationVisitor visitAnnotation(final String name, final String descriptor) { + public AnnotationVisitor visitAnnotation(final @Identifier String name, final @FieldDescriptor String descriptor) { if (av != null) { return av.visitAnnotation(name, descriptor); } @@ -152,7 +155,7 @@ public AnnotationVisitor visitAnnotation(final String name, final String descrip * this visitor are ignored. All the array values must be visited before calling other * methods on this annotation visitor. */ - public AnnotationVisitor visitArray(final String name) { + public AnnotationVisitor visitArray(final @Identifier String name) { if (av != null) { return av.visitArray(name); } diff --git a/asm/src/main/java/org/objectweb/asm/AnnotationWriter.java b/asm/src/main/java/org/objectweb/asm/AnnotationWriter.java index 38693032..5d3a9cc9 100644 --- a/asm/src/main/java/org/objectweb/asm/AnnotationWriter.java +++ b/asm/src/main/java/org/objectweb/asm/AnnotationWriter.java @@ -27,6 +27,9 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.FieldDescriptor; + /** * An {@link AnnotationVisitor} that generates a corresponding 'annotation' or 'type_annotation' * structure, as defined in the Java Virtual Machine Specification (JVMS). AnnotationWriter @@ -136,7 +139,7 @@ final class AnnotationWriter extends AnnotationVisitor { */ static AnnotationWriter create( final SymbolTable symbolTable, - final String descriptor, + final @FieldDescriptor String descriptor, final AnnotationWriter previousAnnotation) { // Create a ByteVector to hold an 'annotation' JVMS structure. // See https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.7.16. @@ -168,7 +171,7 @@ static AnnotationWriter create( final SymbolTable symbolTable, final int typeRef, final TypePath typePath, - final String descriptor, + final @FieldDescriptor String descriptor, final AnnotationWriter previousAnnotation) { // Create a ByteVector to hold a 'type_annotation' JVMS structure. // See https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.7.20. @@ -187,7 +190,7 @@ static AnnotationWriter create( // ----------------------------------------------------------------------------------------------- @Override - public void visit(final String name, final Object value) { + public void visit(final @Identifier String name, final Object value) { // Case of an element_value with a const_value_index, class_info_index or array_index field. // See https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.7.16.1. ++numElementValuePairs; @@ -262,7 +265,7 @@ public void visit(final String name, final Object value) { } @Override - public void visitEnum(final String name, final String descriptor, final String value) { + public void visitEnum(final @Identifier String name, final @FieldDescriptor String descriptor, final String value) { // Case of an element_value with an enum_const_value field. // See https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.7.16.1. ++numElementValuePairs; @@ -275,7 +278,7 @@ public void visitEnum(final String name, final String descriptor, final String v } @Override - public AnnotationVisitor visitAnnotation(final String name, final String descriptor) { + public AnnotationVisitor visitAnnotation(final @Identifier String name, final @FieldDescriptor String descriptor) { // Case of an element_value with an annotation_value field. // See https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.7.16.1. ++numElementValuePairs; diff --git a/asm/src/main/java/org/objectweb/asm/ClassReader.java b/asm/src/main/java/org/objectweb/asm/ClassReader.java index 5f66ed2b..95fa60f2 100644 --- a/asm/src/main/java/org/objectweb/asm/ClassReader.java +++ b/asm/src/main/java/org/objectweb/asm/ClassReader.java @@ -27,6 +27,11 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm; +import org.checkerframework.checker.signature.qual.DotSeparatedIdentifiers; +import org.checkerframework.checker.signature.qual.FieldDescriptor; +import org.checkerframework.checker.signature.qual.FullyQualifiedName; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.InternalForm; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; @@ -41,6 +46,7 @@ * @author Eric Bruneton * @author Eugene Kuleshov */ +@SuppressWarnings("signature") // parsing and string manipulation public class ClassReader { /** @@ -295,7 +301,7 @@ public ClassReader(final InputStream inputStream) throws IOException { * retrieved with the current class loader's {@link ClassLoader#getSystemResourceAsStream}. * @throws IOException if an exception occurs during reading. */ - public ClassReader(final String className) throws IOException { + public ClassReader(final @FullyQualifiedName String className) throws IOException { this( readStream( ClassLoader.getSystemResourceAsStream(className.replace('.', '/') + ".class"), true)); @@ -370,9 +376,9 @@ public int getAccess() { * @return the internal class name. * @see ClassVisitor#visit(int, int, String, String, String, String[]) */ - public String getClassName() { + public @InternalForm String getClassName() { // this_class is just after the access_flags field (using 2 bytes). - return readClass(header + 2, new char[maxStringLength]); + return (@InternalForm String) readClass(header + 2, new char[maxStringLength]); } /** @@ -382,9 +388,9 @@ public String getClassName() { * @return the internal name of the super class, or {@literal null} for {@link Object} class. * @see ClassVisitor#visit(int, int, String, String, String, String[]) */ - public String getSuperName() { + public @InternalForm String getSuperName() { // super_class is after the access_flags and this_class fields (2 bytes each). - return readClass(header + 4, new char[maxStringLength]); + return (@InternalForm String) readClass(header + 4, new char[maxStringLength]); } /** @@ -394,11 +400,11 @@ public String getSuperName() { * interfaces are not returned. * @see ClassVisitor#visit(int, int, String, String, String, String[]) */ - public String[] getInterfaces() { + public @InternalForm String[] getInterfaces() { // interfaces_count is after the access_flags, this_class and super_class fields (2 bytes each). int currentOffset = header + 6; int interfacesCount = readUnsignedShort(currentOffset); - String[] interfaces = new String[interfacesCount]; + @InternalForm String[] interfaces = new String[interfacesCount]; if (interfacesCount > 0) { char[] charBuffer = new char[maxStringLength]; for (int i = 0; i < interfacesCount; ++i) { @@ -452,9 +458,9 @@ public void accept( char[] charBuffer = context.charBuffer; int currentOffset = header; int accessFlags = readUnsignedShort(currentOffset); - String thisClass = readClass(currentOffset + 2, charBuffer); - String superClass = readClass(currentOffset + 4, charBuffer); - String[] interfaces = new String[readUnsignedShort(currentOffset + 6)]; + @InternalForm String thisClass = readClass(currentOffset + 2, charBuffer); + @InternalForm String superClass = readClass(currentOffset + 4, charBuffer); + @InternalForm String[] interfaces = new String[readUnsignedShort(currentOffset + 6)]; currentOffset += 8; for (int i = 0; i < interfaces.length; ++i) { interfaces[i] = readClass(currentOffset, charBuffer); @@ -486,9 +492,9 @@ public void accept( // - The offset of the ModulePackages attribute, or 0. int modulePackagesOffset = 0; // - The string corresponding to the ModuleMainClass attribute, or null. - String moduleMainClass = null; + @InternalForm String moduleMainClass = null; // - The string corresponding to the NestHost attribute, or null. - String nestHostClass = null; + @InternalForm String nestHostClass = null; // - The offset of the NestMembers attribute, or 0. int nestMembersOffset = 0; // - The offset of the PermittedSubclasses attribute, or 0 @@ -589,9 +595,9 @@ public void accept( // Visit the EnclosingMethod attribute. if (enclosingMethodOffset != 0) { - String className = readClass(enclosingMethodOffset, charBuffer); + @InternalForm String className = readClass(enclosingMethodOffset, charBuffer); int methodIndex = readUnsignedShort(enclosingMethodOffset + 2); - String name = methodIndex == 0 ? null : readUTF8(cpInfoOffsets[methodIndex], charBuffer); + @Identifier String name = methodIndex == 0 ? null : (@Identifier String) readUTF8(cpInfoOffsets[methodIndex], charBuffer); String type = methodIndex == 0 ? null : readUTF8(cpInfoOffsets[methodIndex] + 2, charBuffer); classVisitor.visitOuterClass(className, name, type); } @@ -602,7 +608,7 @@ public void accept( int currentAnnotationOffset = runtimeVisibleAnnotationsOffset + 2; while (numAnnotations-- > 0) { // Parse the type_index field. - String annotationDescriptor = readUTF8(currentAnnotationOffset, charBuffer); + @FieldDescriptor String annotationDescriptor = readUTF8(currentAnnotationOffset, charBuffer); currentAnnotationOffset += 2; // Parse num_element_value_pairs and element_value_pairs and visit these values. currentAnnotationOffset = @@ -620,7 +626,7 @@ public void accept( int currentAnnotationOffset = runtimeInvisibleAnnotationsOffset + 2; while (numAnnotations-- > 0) { // Parse the type_index field. - String annotationDescriptor = readUTF8(currentAnnotationOffset, charBuffer); + @FieldDescriptor String annotationDescriptor = readUTF8(currentAnnotationOffset, charBuffer); currentAnnotationOffset += 2; // Parse num_element_value_pairs and element_value_pairs and visit these values. currentAnnotationOffset = @@ -640,7 +646,7 @@ public void accept( // Parse the target_type, target_info and target_path fields. currentAnnotationOffset = readTypeAnnotationTarget(context, currentAnnotationOffset); // Parse the type_index field. - String annotationDescriptor = readUTF8(currentAnnotationOffset, charBuffer); + @FieldDescriptor String annotationDescriptor = readUTF8(currentAnnotationOffset, charBuffer); currentAnnotationOffset += 2; // Parse num_element_value_pairs and element_value_pairs and visit these values. currentAnnotationOffset = @@ -664,7 +670,7 @@ public void accept( // Parse the target_type, target_info and target_path fields. currentAnnotationOffset = readTypeAnnotationTarget(context, currentAnnotationOffset); // Parse the type_index field. - String annotationDescriptor = readUTF8(currentAnnotationOffset, charBuffer); + @FieldDescriptor String annotationDescriptor = readUTF8(currentAnnotationOffset, charBuffer); currentAnnotationOffset += 2; // Parse num_element_value_pairs and element_value_pairs and visit these values. currentAnnotationOffset = @@ -694,7 +700,7 @@ public void accept( int numberOfNestMembers = readUnsignedShort(nestMembersOffset); int currentNestMemberOffset = nestMembersOffset + 2; while (numberOfNestMembers-- > 0) { - classVisitor.visitNestMember(readClass(currentNestMemberOffset, charBuffer)); + classVisitor.visitNestMember((@InternalForm String) readClass(currentNestMemberOffset, charBuffer)); currentNestMemberOffset += 2; } } @@ -705,7 +711,7 @@ public void accept( int currentPermittedSubclassesOffset = permittedSubclassesOffset + 2; while (numberOfPermittedSubclasses-- > 0) { classVisitor.visitPermittedSubclass( - readClass(currentPermittedSubclassesOffset, charBuffer)); + (@InternalForm String) readClass(currentPermittedSubclassesOffset, charBuffer)); currentPermittedSubclassesOffset += 2; } } @@ -716,9 +722,9 @@ public void accept( int currentClassesOffset = innerClassesOffset + 2; while (numberOfClasses-- > 0) { classVisitor.visitInnerClass( - readClass(currentClassesOffset, charBuffer), - readClass(currentClassesOffset + 2, charBuffer), - readUTF8(currentClassesOffset + 4, charBuffer), + (@InternalForm String) readClass(currentClassesOffset, charBuffer), + (@InternalForm String) readClass(currentClassesOffset + 2, charBuffer), + (@Identifier String) readUTF8(currentClassesOffset + 4, charBuffer), readUnsignedShort(currentClassesOffset + 6)); currentClassesOffset += 8; } @@ -770,12 +776,12 @@ private void readModuleAttributes( final Context context, final int moduleOffset, final int modulePackagesOffset, - final String moduleMainClass) { + final @InternalForm String moduleMainClass) { char[] buffer = context.charBuffer; // Read the module_name_index, module_flags and module_version_index fields and visit them. int currentOffset = moduleOffset; - String moduleName = readModule(currentOffset, buffer); + @DotSeparatedIdentifiers String moduleName = readModule(currentOffset, buffer); int moduleFlags = readUnsignedShort(currentOffset + 2); String moduleVersion = readUTF8(currentOffset + 4, buffer); currentOffset += 6; @@ -794,7 +800,7 @@ private void readModuleAttributes( int packageCount = readUnsignedShort(modulePackagesOffset); int currentPackageOffset = modulePackagesOffset + 2; while (packageCount-- > 0) { - moduleVisitor.visitPackage(readPackage(currentPackageOffset, buffer)); + moduleVisitor.visitPackage((@InternalForm String) readPackage(currentPackageOffset, buffer)); currentPackageOffset += 2; } } @@ -804,7 +810,7 @@ private void readModuleAttributes( currentOffset += 2; while (requiresCount-- > 0) { // Read the requires_index, requires_flags and requires_version fields and visit them. - String requires = readModule(currentOffset, buffer); + @DotSeparatedIdentifiers String requires = readModule(currentOffset, buffer); int requiresFlags = readUnsignedShort(currentOffset + 2); String requiresVersion = readUTF8(currentOffset + 4, buffer); currentOffset += 6; @@ -817,11 +823,11 @@ private void readModuleAttributes( while (exportsCount-- > 0) { // Read the exports_index, exports_flags, exports_to_count and exports_to_index fields // and visit them. - String exports = readPackage(currentOffset, buffer); + @InternalForm String exports = readPackage(currentOffset, buffer); int exportsFlags = readUnsignedShort(currentOffset + 2); int exportsToCount = readUnsignedShort(currentOffset + 4); currentOffset += 6; - String[] exportsTo = null; + @DotSeparatedIdentifiers String[] exportsTo = null; if (exportsToCount != 0) { exportsTo = new String[exportsToCount]; for (int i = 0; i < exportsToCount; ++i) { @@ -837,11 +843,11 @@ private void readModuleAttributes( currentOffset += 2; while (opensCount-- > 0) { // Read the opens_index, opens_flags, opens_to_count and opens_to_index fields and visit them. - String opens = readPackage(currentOffset, buffer); + @InternalForm String opens = readPackage(currentOffset, buffer); int opensFlags = readUnsignedShort(currentOffset + 2); int opensToCount = readUnsignedShort(currentOffset + 4); currentOffset += 6; - String[] opensTo = null; + @DotSeparatedIdentifiers String[] opensTo = null; if (opensToCount != 0) { opensTo = new String[opensToCount]; for (int i = 0; i < opensToCount; ++i) { @@ -856,7 +862,7 @@ private void readModuleAttributes( int usesCount = readUnsignedShort(currentOffset); currentOffset += 2; while (usesCount-- > 0) { - moduleVisitor.visitUse(readClass(currentOffset, buffer)); + moduleVisitor.visitUse((@InternalForm String) readClass(currentOffset, buffer)); currentOffset += 2; } @@ -865,10 +871,10 @@ private void readModuleAttributes( currentOffset += 2; while (providesCount-- > 0) { // Read the provides_index, provides_with_count and provides_with_index fields and visit them. - String provides = readClass(currentOffset, buffer); + @InternalForm String provides = readClass(currentOffset, buffer); int providesWithCount = readUnsignedShort(currentOffset + 2); currentOffset += 4; - String[] providesWith = new String[providesWithCount]; + @InternalForm String[] providesWith = new String[providesWithCount]; for (int i = 0; i < providesWithCount; ++i) { providesWith[i] = readClass(currentOffset, buffer); currentOffset += 2; @@ -1069,8 +1075,8 @@ private int readField( // Read the access_flags, name_index and descriptor_index fields. int currentOffset = fieldInfoOffset; int accessFlags = readUnsignedShort(currentOffset); - String name = readUTF8(currentOffset + 2, charBuffer); - String descriptor = readUTF8(currentOffset + 4, charBuffer); + @Identifier String name = readUTF8(currentOffset + 2, charBuffer); + @FieldDescriptor String descriptor = readUTF8(currentOffset + 4, charBuffer); currentOffset += 6; // Read the field attributes (the variables are ordered as in Section 4.7 of the JVMS). @@ -1264,7 +1270,7 @@ private int readMethod( // - The offset of the Exceptions attribute, or 0. int exceptionsOffset = 0; // - The strings corresponding to the Exceptions attribute, or null. - String[] exceptions = null; + @InternalForm String[] exceptions = null; // - Whether the method has a Synthetic attribute. boolean synthetic = false; // - The constant pool index contained in the Signature attribute, or 0. @@ -1850,7 +1856,7 @@ private void readCode( Label start = createLabel(readUnsignedShort(currentOffset), labels); Label end = createLabel(readUnsignedShort(currentOffset + 2), labels); Label handler = createLabel(readUnsignedShort(currentOffset + 4), labels); - String catchType = readUTF8(cpInfoOffsets[readUnsignedShort(currentOffset + 6)], charBuffer); + @InternalForm String catchType = (@InternalForm String) readUTF8(cpInfoOffsets[readUnsignedShort(currentOffset + 6)], charBuffer); currentOffset += 8; methodVisitor.visitTryCatchBlock(start, end, handler, catchType); } @@ -2436,9 +2442,9 @@ private void readCode( { int cpInfoOffset = cpInfoOffsets[readUnsignedShort(currentOffset + 1)]; int nameAndTypeCpInfoOffset = cpInfoOffsets[readUnsignedShort(cpInfoOffset + 2)]; - String owner = readClass(cpInfoOffset, charBuffer); - String name = readUTF8(nameAndTypeCpInfoOffset, charBuffer); - String descriptor = readUTF8(nameAndTypeCpInfoOffset + 2, charBuffer); + @InternalForm String owner = readClass(cpInfoOffset, charBuffer); + @Identifier String name = (@Identifier String) readUTF8(nameAndTypeCpInfoOffset, charBuffer); + @FieldDescriptor String descriptor = readUTF8(nameAndTypeCpInfoOffset + 2, charBuffer); if (opcode < Opcodes.INVOKEVIRTUAL) { methodVisitor.visitFieldInsn(opcode, owner, name, descriptor); } else { @@ -2479,7 +2485,7 @@ private void readCode( case Opcodes.ANEWARRAY: case Opcodes.CHECKCAST: case Opcodes.INSTANCEOF: - methodVisitor.visitTypeInsn(opcode, readClass(currentOffset + 1, charBuffer)); + methodVisitor.visitTypeInsn(opcode, (@InternalForm String) readClass(currentOffset + 1, charBuffer)); currentOffset += 3; break; case Opcodes.IINC: @@ -2489,7 +2495,7 @@ private void readCode( break; case Opcodes.MULTIANEWARRAY: methodVisitor.visitMultiANewArrayInsn( - readClass(currentOffset + 1, charBuffer), classBuffer[currentOffset + 3] & 0xFF); + (@FieldDescriptor String) readClass(currentOffset + 1, charBuffer), classBuffer[currentOffset + 3] & 0xFF); currentOffset += 4; break; default: @@ -3031,7 +3037,7 @@ private int readElementValues( private int readElementValue( final AnnotationVisitor annotationVisitor, final int elementValueOffset, - final String elementName, + final @Identifier String elementName, final char[] charBuffer) { int currentOffset = elementValueOffset; if (annotationVisitor == null) { @@ -3779,8 +3785,8 @@ public String readClass(final int offset, final char[] charBuffer) { * large. It is not automatically resized. * @return the String corresponding to the specified CONSTANT_Module entry. */ - public String readModule(final int offset, final char[] charBuffer) { - return readStringish(offset, charBuffer); + public @DotSeparatedIdentifiers String readModule(final int offset, final char[] charBuffer) { + return (@DotSeparatedIdentifiers String) readStringish(offset, charBuffer); } /** @@ -3794,8 +3800,8 @@ public String readModule(final int offset, final char[] charBuffer) { * large. It is not automatically resized. * @return the String corresponding to the specified CONSTANT_Package entry. */ - public String readPackage(final int offset, final char[] charBuffer) { - return readStringish(offset, charBuffer); + public @InternalForm String readPackage(final int offset, final char[] charBuffer) { + return (@InternalForm String) readStringish(offset, charBuffer); } /** @@ -3816,7 +3822,7 @@ private ConstantDynamic readConstantDynamic( int cpInfoOffset = cpInfoOffsets[constantPoolEntryIndex]; int nameAndTypeCpInfoOffset = cpInfoOffsets[readUnsignedShort(cpInfoOffset + 2)]; String name = readUTF8(nameAndTypeCpInfoOffset, charBuffer); - String descriptor = readUTF8(nameAndTypeCpInfoOffset + 2, charBuffer); + @FieldDescriptor String descriptor = readUTF8(nameAndTypeCpInfoOffset + 2, charBuffer); int bootstrapMethodOffset = bootstrapMethodOffsets[readUnsignedShort(cpInfoOffset)]; Handle handle = (Handle) readConst(readUnsignedShort(bootstrapMethodOffset), charBuffer); Object[] bootstrapMethodArguments = new Object[readUnsignedShort(bootstrapMethodOffset + 2)]; @@ -3855,7 +3861,7 @@ public Object readConst(final int constantPoolEntryIndex, final char[] charBuffe case Symbol.CONSTANT_DOUBLE_TAG: return Double.longBitsToDouble(readLong(cpInfoOffset)); case Symbol.CONSTANT_CLASS_TAG: - return Type.getObjectType(readUTF8(cpInfoOffset, charBuffer)); + return Type.getObjectType((@InternalForm String) readUTF8(cpInfoOffset, charBuffer)); case Symbol.CONSTANT_STRING_TAG: return readUTF8(cpInfoOffset, charBuffer); case Symbol.CONSTANT_METHOD_TYPE_TAG: @@ -3864,7 +3870,7 @@ public Object readConst(final int constantPoolEntryIndex, final char[] charBuffe int referenceKind = readByte(cpInfoOffset); int referenceCpInfoOffset = cpInfoOffsets[readUnsignedShort(cpInfoOffset + 1)]; int nameAndTypeCpInfoOffset = cpInfoOffsets[readUnsignedShort(referenceCpInfoOffset + 2)]; - String owner = readClass(referenceCpInfoOffset, charBuffer); + @InternalForm String owner = readClass(referenceCpInfoOffset, charBuffer); String name = readUTF8(nameAndTypeCpInfoOffset, charBuffer); String descriptor = readUTF8(nameAndTypeCpInfoOffset + 2, charBuffer); boolean isInterface = diff --git a/asm/src/main/java/org/objectweb/asm/ClassTooLargeException.java b/asm/src/main/java/org/objectweb/asm/ClassTooLargeException.java index de177b1e..58aa107d 100644 --- a/asm/src/main/java/org/objectweb/asm/ClassTooLargeException.java +++ b/asm/src/main/java/org/objectweb/asm/ClassTooLargeException.java @@ -27,6 +27,8 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm; +import org.checkerframework.checker.signature.qual.InternalForm; + /** * Exception thrown when the constant pool of a class produced by a {@link ClassWriter} is too * large. @@ -36,7 +38,7 @@ public final class ClassTooLargeException extends IndexOutOfBoundsException { private static final long serialVersionUID = 160715609518896765L; - private final String className; + private final @InternalForm String className; private final int constantPoolCount; /** @@ -46,7 +48,7 @@ public final class ClassTooLargeException extends IndexOutOfBoundsException { * org.objectweb.asm.Type#getInternalName()}). * @param constantPoolCount the number of constant pool items of the class. */ - public ClassTooLargeException(final String className, final int constantPoolCount) { + public ClassTooLargeException(final @InternalForm String className, final int constantPoolCount) { super("Class too large: " + className); this.className = className; this.constantPoolCount = constantPoolCount; @@ -57,7 +59,7 @@ public ClassTooLargeException(final String className, final int constantPoolCoun * * @return the internal name of the class. */ - public String getClassName() { + public @InternalForm String getClassName() { return className; } diff --git a/asm/src/main/java/org/objectweb/asm/ClassVisitor.java b/asm/src/main/java/org/objectweb/asm/ClassVisitor.java index b4cba80b..d1ba6ee4 100644 --- a/asm/src/main/java/org/objectweb/asm/ClassVisitor.java +++ b/asm/src/main/java/org/objectweb/asm/ClassVisitor.java @@ -27,6 +27,14 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm; +import org.checkerframework.checker.signature.qual.MethodDescriptor; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.checkerframework.checker.signature.qual.DotSeparatedIdentifiers; +import org.checkerframework.checker.signature.qual.FieldDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.InternalForm; + /** * A visitor to visit a Java class. The methods of this class must be called in the following order: * {@code visit} [ {@code visitSource} ] [ {@code visitModule} ][ {@code visitNestHost} ][ {@code @@ -112,10 +120,10 @@ public ClassVisitor getDelegate() { public void visit( final int version, final int access, - final String name, + final @InternalForm String name, final String signature, - final String superName, - final String[] interfaces) { + final @InternalForm String superName, + final @InternalForm String @Nullable [] interfaces) { if (api < Opcodes.ASM8 && (access & Opcodes.ACC_RECORD) != 0) { throw new UnsupportedOperationException("Records requires ASM8"); } @@ -148,7 +156,7 @@ public void visitSource(final String source, final String debug) { * @return a visitor to visit the module values, or {@literal null} if this visitor is not * interested in visiting this module. */ - public ModuleVisitor visitModule(final String name, final int access, final String version) { + public ModuleVisitor visitModule(final @DotSeparatedIdentifiers String name, final int access, final String version) { if (api < Opcodes.ASM6) { throw new UnsupportedOperationException("Module requires ASM6"); } @@ -169,7 +177,7 @@ public ModuleVisitor visitModule(final String name, final int access, final Stri * @param nestHost the internal name of the host class of the nest (see {@link * Type#getInternalName()}). */ - public void visitNestHost(final String nestHost) { + public void visitNestHost(final @InternalForm String nestHost) { if (api < Opcodes.ASM7) { throw new UnsupportedOperationException("NestHost requires ASM7"); } @@ -193,7 +201,7 @@ public void visitNestHost(final String nestHost) { * enclosed in an instance initializer, static initializer, instance variable initializer, or * class variable initializer). */ - public void visitOuterClass(final String owner, final String name, final String descriptor) { + public void visitOuterClass(final @InternalForm String owner, final @Nullable @Identifier String name, final @MethodDescriptor String descriptor) { if (cv != null) { cv.visitOuterClass(owner, name, descriptor); } @@ -207,7 +215,7 @@ public void visitOuterClass(final String owner, final String name, final String * @return a visitor to visit the annotation values, or {@literal null} if this visitor is not * interested in visiting this annotation. */ - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { if (cv != null) { return cv.visitAnnotation(descriptor, visible); } @@ -230,7 +238,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean * interested in visiting this annotation. */ public AnnotationVisitor visitTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { if (api < Opcodes.ASM5) { throw new UnsupportedOperationException("TypeAnnotation requires ASM5"); } @@ -260,7 +268,7 @@ public void visitAttribute(final Attribute attribute) { * * @param nestMember the internal name of a nest member (see {@link Type#getInternalName()}). */ - public void visitNestMember(final String nestMember) { + public void visitNestMember(final @InternalForm String nestMember) { if (api < Opcodes.ASM7) { throw new UnsupportedOperationException("NestMember requires ASM7"); } @@ -276,7 +284,7 @@ public void visitNestMember(final String nestMember) { * @param permittedSubclass the internal name of a permitted subclass (see {@link * Type#getInternalName()}). */ - public void visitPermittedSubclass(final String permittedSubclass) { + public void visitPermittedSubclass(final @InternalForm String permittedSubclass) { if (api < Opcodes.ASM9) { throw new UnsupportedOperationException("PermittedSubclasses requires ASM9"); } @@ -301,7 +309,7 @@ public void visitPermittedSubclass(final String permittedSubclass) { * class was compiled. */ public void visitInnerClass( - final String name, final String outerName, final String innerName, final int access) { + final @InternalForm String name, final @InternalForm String outerName, final @Identifier String innerName, final int access) { if (cv != null) { cv.visitInnerClass(name, outerName, innerName, access); } @@ -318,7 +326,7 @@ public void visitInnerClass( * if this class visitor is not interested in visiting these annotations and attributes. */ public RecordComponentVisitor visitRecordComponent( - final String name, final String descriptor, final String signature) { + final @Identifier String name, final @FieldDescriptor String descriptor, final String signature) { if (api < Opcodes.ASM8) { throw new UnsupportedOperationException("Record requires ASM8"); } @@ -348,8 +356,8 @@ public RecordComponentVisitor visitRecordComponent( */ public FieldVisitor visitField( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @FieldDescriptor String descriptor, final String signature, final Object value) { if (cv != null) { @@ -376,10 +384,10 @@ public FieldVisitor visitField( */ public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { if (cv != null) { return cv.visitMethod(access, name, descriptor, signature, exceptions); } diff --git a/asm/src/main/java/org/objectweb/asm/ClassWriter.java b/asm/src/main/java/org/objectweb/asm/ClassWriter.java index eeff8130..8194b61e 100644 --- a/asm/src/main/java/org/objectweb/asm/ClassWriter.java +++ b/asm/src/main/java/org/objectweb/asm/ClassWriter.java @@ -27,6 +27,15 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm; +import org.checkerframework.checker.signature.qual.MethodDescriptor; +import org.checkerframework.checker.signature.qual.FieldDescriptor; + +import org.plumelib.reflection.Signatures; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.checkerframework.checker.signature.qual.DotSeparatedIdentifiers; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.InternalForm; + /** * A {@link ClassVisitor} that generates a corresponding ClassFile structure, as defined in the Java * Virtual Machine Specification (JVMS). It can be used alone, to generate a Java class "from @@ -290,10 +299,10 @@ public boolean hasFlags(final int flags) { public final void visit( final int version, final int access, - final String name, + final @InternalForm String name, final String signature, - final String superName, - final String[] interfaces) { + final @InternalForm String superName, + final @InternalForm String @Nullable [] interfaces) { this.version = version; this.accessFlags = access; this.thisClass = symbolTable.setMajorVersionAndClassName(version & 0xFFFF, name); @@ -325,7 +334,7 @@ public final void visitSource(final String file, final String debug) { @Override public final ModuleVisitor visitModule( - final String name, final int access, final String version) { + final @DotSeparatedIdentifiers String name, final int access, final String version) { return moduleWriter = new ModuleWriter( symbolTable, @@ -335,13 +344,13 @@ public final ModuleVisitor visitModule( } @Override - public final void visitNestHost(final String nestHost) { + public final void visitNestHost(final @InternalForm String nestHost) { nestHostClassIndex = symbolTable.addConstantClass(nestHost).index; } @Override public final void visitOuterClass( - final String owner, final String name, final String descriptor) { + final @InternalForm String owner, final @Nullable @Identifier String name, final @MethodDescriptor String descriptor) { enclosingClassIndex = symbolTable.addConstantClass(owner).index; if (name != null && descriptor != null) { enclosingMethodIndex = symbolTable.addConstantNameAndType(name, descriptor); @@ -349,7 +358,7 @@ public final void visitOuterClass( } @Override - public final AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public final AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { if (visible) { return lastRuntimeVisibleAnnotation = AnnotationWriter.create(symbolTable, descriptor, lastRuntimeVisibleAnnotation); @@ -361,7 +370,7 @@ public final AnnotationVisitor visitAnnotation(final String descriptor, final bo @Override public final AnnotationVisitor visitTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { if (visible) { return lastRuntimeVisibleTypeAnnotation = AnnotationWriter.create( @@ -381,7 +390,7 @@ public final void visitAttribute(final Attribute attribute) { } @Override - public final void visitNestMember(final String nestMember) { + public final void visitNestMember(final @InternalForm String nestMember) { if (nestMemberClasses == null) { nestMemberClasses = new ByteVector(); } @@ -390,7 +399,7 @@ public final void visitNestMember(final String nestMember) { } @Override - public final void visitPermittedSubclass(final String permittedSubclass) { + public final void visitPermittedSubclass(final @InternalForm String permittedSubclass) { if (permittedSubclasses == null) { permittedSubclasses = new ByteVector(); } @@ -400,7 +409,7 @@ public final void visitPermittedSubclass(final String permittedSubclass) { @Override public final void visitInnerClass( - final String name, final String outerName, final String innerName, final int access) { + final @InternalForm String name, final @InternalForm String outerName, final @Identifier String innerName, final int access) { if (innerClasses == null) { innerClasses = new ByteVector(); } @@ -425,7 +434,7 @@ public final void visitInnerClass( @Override public final RecordComponentVisitor visitRecordComponent( - final String name, final String descriptor, final String signature) { + final @Identifier String name, final @FieldDescriptor String descriptor, final String signature) { RecordComponentWriter recordComponentWriter = new RecordComponentWriter(symbolTable, name, descriptor, signature); if (firstRecordComponent == null) { @@ -439,8 +448,8 @@ public final RecordComponentVisitor visitRecordComponent( @Override public final FieldVisitor visitField( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @FieldDescriptor String descriptor, final String signature, final Object value) { FieldWriter fieldWriter = @@ -456,10 +465,10 @@ public final FieldVisitor visitField( @Override public final MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { MethodWriter methodWriter = new MethodWriter(symbolTable, access, name, descriptor, signature, exceptions, compute); if (firstMethod == null) { @@ -840,7 +849,7 @@ public int newUTF8(final String value) { * @param value the internal name of the class (see {@link Type#getInternalName()}). * @return the index of a new or already existing class reference item. */ - public int newClass(final String value) { + public int newClass(final @InternalForm String value) { return symbolTable.addConstantClass(value).index; } @@ -864,7 +873,7 @@ public int newMethodType(final String methodDescriptor) { * @param moduleName name of the module. * @return the index of a new or already existing module reference item. */ - public int newModule(final String moduleName) { + public int newModule(final @DotSeparatedIdentifiers String moduleName) { return symbolTable.addConstantModule(moduleName).index; } @@ -876,7 +885,7 @@ public int newModule(final String moduleName) { * @param packageName name of the package in its internal form. * @return the index of a new or already existing module reference item. */ - public int newPackage(final String packageName) { + public int newPackage(final @DotSeparatedIdentifiers String packageName) { return symbolTable.addConstantPackage(packageName).index; } @@ -899,7 +908,7 @@ public int newPackage(final String packageName) { */ @Deprecated public int newHandle( - final int tag, final String owner, final String name, final String descriptor) { + final int tag, final @InternalForm String owner, final String name, final String descriptor) { return newHandle(tag, owner, name, descriptor, tag == Opcodes.H_INVOKEINTERFACE); } @@ -921,7 +930,7 @@ public int newHandle( */ public int newHandle( final int tag, - final String owner, + final @InternalForm String owner, final String name, final String descriptor, final boolean isInterface) { @@ -941,7 +950,7 @@ public int newHandle( */ public int newConstantDynamic( final String name, - final String descriptor, + final @FieldDescriptor String descriptor, final Handle bootstrapMethodHandle, final Object... bootstrapMethodArguments) { return symbolTable.addConstantDynamic( @@ -962,7 +971,7 @@ public int newConstantDynamic( */ public int newInvokeDynamic( final String name, - final String descriptor, + final @MethodDescriptor String descriptor, final Handle bootstrapMethodHandle, final Object... bootstrapMethodArguments) { return symbolTable.addConstantInvokeDynamic( @@ -980,7 +989,7 @@ public int newInvokeDynamic( * @param descriptor the field's descriptor. * @return the index of a new or already existing field reference item. */ - public int newField(final String owner, final String name, final String descriptor) { + public int newField(final @InternalForm String owner, final @Identifier String name, final @FieldDescriptor String descriptor) { return symbolTable.addConstantFieldref(owner, name, descriptor).index; } @@ -997,7 +1006,7 @@ public int newField(final String owner, final String name, final String descript * @return the index of a new or already existing method reference item. */ public int newMethod( - final String owner, final String name, final String descriptor, final boolean isInterface) { + final @InternalForm String owner, final @Identifier String name, final @MethodDescriptor String descriptor, final boolean isInterface) { return symbolTable.addConstantMethodref(owner, name, descriptor, isInterface).index; } @@ -1010,7 +1019,7 @@ public int newMethod( * @param descriptor a type descriptor. * @return the index of a new or already existing name and type item. */ - public int newNameType(final String name, final String descriptor) { + public int newNameType(final String name, final @FieldDescriptor String descriptor) { return symbolTable.addConstantNameAndType(name, descriptor); } @@ -1053,19 +1062,19 @@ public final void setFlags(final int flags) { * @return the internal name of the common super class of the two given classes (see {@link * Type#getInternalName()}). */ - protected String getCommonSuperClass(final String type1, final String type2) { + protected @InternalForm String getCommonSuperClass(final @InternalForm String type1, final @InternalForm String type2) { ClassLoader classLoader = getClassLoader(); Class class1; try { class1 = Class.forName(type1.replace('/', '.'), false, classLoader); } catch (ClassNotFoundException e) { - throw new TypeNotPresentException(type1, e); + throw new TypeNotPresentException(Signatures.internalFormToFullyQualified(type1), e); // bug fix } Class class2; try { class2 = Class.forName(type2.replace('/', '.'), false, classLoader); } catch (ClassNotFoundException e) { - throw new TypeNotPresentException(type2, e); + throw new TypeNotPresentException(Signatures.internalFormToFullyQualified(type2), e); // bug fix } if (class1.isAssignableFrom(class2)) { return type1; @@ -1079,7 +1088,8 @@ protected String getCommonSuperClass(final String type1, final String type2) { do { class1 = class1.getSuperclass(); } while (!class1.isAssignableFrom(class2)); - return class1.getName().replace('.', '/'); + // If not an array or primitives, this conversion works. + return (@InternalForm String) class1.getName().replace('.', '/'); } } diff --git a/asm/src/main/java/org/objectweb/asm/ConstantDynamic.java b/asm/src/main/java/org/objectweb/asm/ConstantDynamic.java index f3d21277..7772a640 100644 --- a/asm/src/main/java/org/objectweb/asm/ConstantDynamic.java +++ b/asm/src/main/java/org/objectweb/asm/ConstantDynamic.java @@ -27,6 +27,7 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm; +import org.checkerframework.checker.signature.qual.FieldDescriptor; import java.util.Arrays; /** @@ -40,7 +41,7 @@ public final class ConstantDynamic { private final String name; /** The constant type (must be a field descriptor). */ - private final String descriptor; + private final @FieldDescriptor String descriptor; /** The bootstrap method to use to compute the constant value at runtime. */ private final Handle bootstrapMethod; @@ -62,7 +63,7 @@ public final class ConstantDynamic { */ public ConstantDynamic( final String name, - final String descriptor, + final @FieldDescriptor String descriptor, final Handle bootstrapMethod, final Object... bootstrapMethodArguments) { this.name = name; @@ -85,7 +86,7 @@ public String getName() { * * @return the type of this constant, as a field descriptor. */ - public String getDescriptor() { + public @FieldDescriptor String getDescriptor() { return descriptor; } diff --git a/asm/src/main/java/org/objectweb/asm/Constants.java b/asm/src/main/java/org/objectweb/asm/Constants.java index 98684e2a..865ac150 100644 --- a/asm/src/main/java/org/objectweb/asm/Constants.java +++ b/asm/src/main/java/org/objectweb/asm/Constants.java @@ -27,6 +27,7 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm; +import org.checkerframework.checker.signature.qual.InternalForm; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; @@ -184,13 +185,14 @@ private Constants() {} static void checkAsmExperimental(final Object caller) { Class callerClass = caller.getClass(); - String internalName = callerClass.getName().replace('.', '/'); + @SuppressWarnings("signature:assignment") // If not an array or primitive, this conversion works. + @InternalForm String internalName = callerClass.getName().replace('.', '/'); if (!isWhitelisted(internalName)) { checkIsPreview(callerClass.getClassLoader().getResourceAsStream(internalName + ".class")); } } - static boolean isWhitelisted(final String internalName) { + static boolean isWhitelisted(final @InternalForm String internalName) { if (!internalName.startsWith("org/objectweb/asm/")) { return false; } diff --git a/asm/src/main/java/org/objectweb/asm/FieldVisitor.java b/asm/src/main/java/org/objectweb/asm/FieldVisitor.java index 2893d9f5..39db6156 100644 --- a/asm/src/main/java/org/objectweb/asm/FieldVisitor.java +++ b/asm/src/main/java/org/objectweb/asm/FieldVisitor.java @@ -27,6 +27,8 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm; +import org.checkerframework.checker.signature.qual.FieldDescriptor; + /** * A visitor to visit a Java field. The methods of this class must be called in the following order: * ( {@code visitAnnotation} | {@code visitTypeAnnotation} | {@code visitAttribute} )* {@code @@ -97,7 +99,7 @@ public FieldVisitor getDelegate() { * @return a visitor to visit the annotation values, or {@literal null} if this visitor is not * interested in visiting this annotation. */ - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { if (fv != null) { return fv.visitAnnotation(descriptor, visible); } @@ -118,9 +120,9 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean * interested in visiting this annotation. */ public AnnotationVisitor visitTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { if (api < Opcodes.ASM5) { - throw new UnsupportedOperationException("This feature requires ASM5"); + throw new UnsupportedOperationException("visitTypeAnnotation requires ASM5"); } if (fv != null) { return fv.visitTypeAnnotation(typeRef, typePath, descriptor, visible); diff --git a/asm/src/main/java/org/objectweb/asm/FieldWriter.java b/asm/src/main/java/org/objectweb/asm/FieldWriter.java index b0c4502b..243ddea4 100644 --- a/asm/src/main/java/org/objectweb/asm/FieldWriter.java +++ b/asm/src/main/java/org/objectweb/asm/FieldWriter.java @@ -27,6 +27,8 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm; +import org.checkerframework.checker.signature.qual.FieldDescriptor; + /** * A {@link FieldVisitor} that generates a corresponding 'field_info' structure, as defined in the * Java Virtual Machine Specification (JVMS). @@ -121,7 +123,7 @@ final class FieldWriter extends FieldVisitor { final SymbolTable symbolTable, final int access, final String name, - final String descriptor, + final @FieldDescriptor String descriptor, final String signature, final Object constantValue) { super(/* latest api = */ Opcodes.ASM9); @@ -142,7 +144,7 @@ final class FieldWriter extends FieldVisitor { // ----------------------------------------------------------------------------------------------- @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { if (visible) { return lastRuntimeVisibleAnnotation = AnnotationWriter.create(symbolTable, descriptor, lastRuntimeVisibleAnnotation); @@ -154,7 +156,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean @Override public AnnotationVisitor visitTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { if (visible) { return lastRuntimeVisibleTypeAnnotation = AnnotationWriter.create( diff --git a/asm/src/main/java/org/objectweb/asm/Frame.java b/asm/src/main/java/org/objectweb/asm/Frame.java index 5047d41e..f1f5bcb0 100644 --- a/asm/src/main/java/org/objectweb/asm/Frame.java +++ b/asm/src/main/java/org/objectweb/asm/Frame.java @@ -27,6 +27,9 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm; +import org.checkerframework.checker.signature.qual.MethodDescriptor; +import org.checkerframework.checker.signature.qual.InternalForm; + /** * The input and output stack map frames of a basic block. * @@ -285,14 +288,14 @@ static int getAbstractTypeFromApiFormat(final SymbolTable symbolTable, final Obj if (type instanceof Integer) { return CONSTANT_KIND | ((Integer) type).intValue(); } else if (type instanceof String) { - String descriptor = Type.getObjectType((String) type).getDescriptor(); + String descriptor = Type.getObjectType((@InternalForm String) type).getDescriptor(); return getAbstractTypeFromDescriptor(symbolTable, descriptor, 0); } else { Label label = (Label) type; if ((label.flags & Label.FLAG_RESOLVED) != 0) { - return UNINITIALIZED_KIND | symbolTable.addUninitializedType("", label.bytecodeOffset); + return UNINITIALIZED_KIND | symbolTable.addUninitializedType((@InternalForm String) "", label.bytecodeOffset); } else { - return FORWARD_UNINITIALIZED_KIND | symbolTable.addForwardUninitializedType("", label); + return FORWARD_UNINITIALIZED_KIND | symbolTable.addForwardUninitializedType((@InternalForm String) "", label); } } } @@ -306,7 +309,7 @@ static int getAbstractTypeFromApiFormat(final SymbolTable symbolTable, final Obj * @return the abstract type value corresponding to the given internal name. */ static int getAbstractTypeFromInternalName( - final SymbolTable symbolTable, final String internalName) { + final SymbolTable symbolTable, final @InternalForm String internalName) { return REFERENCE_KIND | symbolTable.addType(internalName); } @@ -320,7 +323,7 @@ static int getAbstractTypeFromInternalName( */ private static int getAbstractTypeFromDescriptor( final SymbolTable symbolTable, final String buffer, final int offset) { - String internalName; + @InternalForm String internalName; switch (buffer.charAt(offset)) { case 'V': return 0; @@ -337,7 +340,7 @@ private static int getAbstractTypeFromDescriptor( case 'D': return DOUBLE; case 'L': - internalName = buffer.substring(offset + 1, buffer.length() - 1); + internalName = (@InternalForm String) buffer.substring(offset + 1, buffer.length() - 1); return REFERENCE_KIND | symbolTable.addType(internalName); case '[': int elementDescriptorOffset = offset + 1; @@ -371,7 +374,7 @@ private static int getAbstractTypeFromDescriptor( typeValue = DOUBLE; break; case 'L': - internalName = buffer.substring(elementDescriptorOffset + 1, buffer.length() - 1); + internalName = (@InternalForm String) buffer.substring(elementDescriptorOffset + 1, buffer.length() - 1); typeValue = REFERENCE_KIND | symbolTable.addType(internalName); break; default: @@ -401,7 +404,7 @@ private static int getAbstractTypeFromDescriptor( final void setInputFrameFromDescriptor( final SymbolTable symbolTable, final int access, - final String descriptor, + final @MethodDescriptor String descriptor, final int maxLocals) { inputLocals = new int[maxLocals]; inputStack = new int[0]; @@ -668,7 +671,7 @@ private int getInitializedType(final SymbolTable symbolTable, final int abstract return REFERENCE_KIND | symbolTable.addType(symbolTable.getClassName()); } else { return REFERENCE_KIND - | symbolTable.addType(symbolTable.getType(abstractType & VALUE_MASK).value); + | symbolTable.addType((@InternalForm String) symbolTable.getType(abstractType & VALUE_MASK).value); } } } @@ -1058,7 +1061,7 @@ void execute( push(symbolTable, argSymbol.value); break; case Opcodes.NEW: - push(UNINITIALIZED_KIND | symbolTable.addUninitializedType(argSymbol.value, arg)); + push(UNINITIALIZED_KIND | symbolTable.addUninitializedType((@InternalForm String) argSymbol.value, arg)); break; case Opcodes.NEWARRAY: pop(); @@ -1092,7 +1095,7 @@ void execute( } break; case Opcodes.ANEWARRAY: - String arrayElementType = argSymbol.value; + @InternalForm String arrayElementType = argSymbol.value; pop(); if (arrayElementType.charAt(0) == '[') { push(symbolTable, '[' + arrayElementType); @@ -1101,7 +1104,7 @@ void execute( } break; case Opcodes.CHECKCAST: - String castType = argSymbol.value; + @InternalForm String castType = argSymbol.value; pop(); if (castType.charAt(0) == '[') { push(symbolTable, castType); @@ -1429,7 +1432,7 @@ static void putAbstractType( case REFERENCE_KIND: output .putByte(ITEM_OBJECT) - .putShort(symbolTable.addConstantClass(symbolTable.getType(typeValue).value).index); + .putShort(symbolTable.addConstantClass((@InternalForm String) symbolTable.getType(typeValue).value).index); break; case UNINITIALIZED_KIND: output.putByte(ITEM_UNINITIALIZED).putShort((int) symbolTable.getType(typeValue).data); @@ -1484,7 +1487,7 @@ static void putAbstractType( } output .putByte(ITEM_OBJECT) - .putShort(symbolTable.addConstantClass(typeDescriptor.toString()).index); + .putShort(symbolTable.addConstantClass((@InternalForm String) typeDescriptor.toString()).index); } } } diff --git a/asm/src/main/java/org/objectweb/asm/Handle.java b/asm/src/main/java/org/objectweb/asm/Handle.java index 6ffae75b..d94bdd72 100644 --- a/asm/src/main/java/org/objectweb/asm/Handle.java +++ b/asm/src/main/java/org/objectweb/asm/Handle.java @@ -28,6 +28,8 @@ package org.objectweb.asm; +import org.checkerframework.checker.signature.qual.InternalForm; + /** * A reference to a field or a method. * @@ -45,7 +47,7 @@ public final class Handle { private final int tag; /** The internal name of the class that owns the field or method designated by this handle. */ - private final String owner; + private final @InternalForm String owner; /** The name of the field or method designated by this handle. */ private final String name; @@ -72,7 +74,7 @@ public final class Handle { * boolean)}. */ @Deprecated - public Handle(final int tag, final String owner, final String name, final String descriptor) { + public Handle(final int tag, final @InternalForm String owner, final String name, final String descriptor) { this(tag, owner, name, descriptor, tag == Opcodes.H_INVOKEINTERFACE); } @@ -92,7 +94,7 @@ public Handle(final int tag, final String owner, final String name, final String */ public Handle( final int tag, - final String owner, + final @InternalForm String owner, final String name, final String descriptor, final boolean isInterface) { @@ -121,7 +123,7 @@ public int getTag() { * @return the internal name of the class that owns the field or method designated by this handle * (see {@link Type#getInternalName()}). */ - public String getOwner() { + public @InternalForm String getOwner() { return owner; } diff --git a/asm/src/main/java/org/objectweb/asm/Handler.java b/asm/src/main/java/org/objectweb/asm/Handler.java index 21593b65..9689fa92 100644 --- a/asm/src/main/java/org/objectweb/asm/Handler.java +++ b/asm/src/main/java/org/objectweb/asm/Handler.java @@ -27,6 +27,8 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm; +import org.checkerframework.checker.signature.qual.InternalForm; + /** * Information about an exception handler. Corresponds to an element of the exception_table array of * a Code attribute, as defined in the Java Virtual Machine Specification (JVMS). Handler instances @@ -67,7 +69,7 @@ final class Handler { * The internal name of the type of exceptions handled by this handler, or {@literal null} to * catch any exceptions. */ - final String catchTypeDescriptor; + final @InternalForm String catchTypeDescriptor; /** The next exception handler. */ Handler nextHandler; @@ -87,7 +89,7 @@ final class Handler { final Label endPc, final Label handlerPc, final int catchType, - final String catchTypeDescriptor) { + final @InternalForm String catchTypeDescriptor) { this.startPc = startPc; this.endPc = endPc; this.handlerPc = handlerPc; diff --git a/asm/src/main/java/org/objectweb/asm/MethodTooLargeException.java b/asm/src/main/java/org/objectweb/asm/MethodTooLargeException.java index 2fbf23b0..bbe4900a 100644 --- a/asm/src/main/java/org/objectweb/asm/MethodTooLargeException.java +++ b/asm/src/main/java/org/objectweb/asm/MethodTooLargeException.java @@ -27,6 +27,10 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.InternalForm; +import org.checkerframework.checker.signature.qual.MethodDescriptor; + /** * Exception thrown when the Code attribute of a method produced by a {@link ClassWriter} is too * large. @@ -36,9 +40,9 @@ public final class MethodTooLargeException extends IndexOutOfBoundsException { private static final long serialVersionUID = 6807380416709738314L; - private final String className; - private final String methodName; - private final String descriptor; + private final @InternalForm String className; + private final @Identifier String methodName; + private final @MethodDescriptor String descriptor; private final int codeSize; /** @@ -50,9 +54,9 @@ public final class MethodTooLargeException extends IndexOutOfBoundsException { * @param codeSize the size of the method's Code attribute, in bytes. */ public MethodTooLargeException( - final String className, - final String methodName, - final String descriptor, + final @InternalForm String className, + final @Identifier String methodName, + final @MethodDescriptor String descriptor, final int codeSize) { super("Method too large: " + className + "." + methodName + " " + descriptor); this.className = className; @@ -66,7 +70,7 @@ public MethodTooLargeException( * * @return the internal name of the owner class (see {@link Type#getInternalName()}). */ - public String getClassName() { + public @InternalForm String getClassName() { return className; } @@ -84,7 +88,7 @@ public String getMethodName() { * * @return the descriptor of the method. */ - public String getDescriptor() { + public @MethodDescriptor String getDescriptor() { return descriptor; } diff --git a/asm/src/main/java/org/objectweb/asm/MethodVisitor.java b/asm/src/main/java/org/objectweb/asm/MethodVisitor.java index 751bc7f5..665eab68 100644 --- a/asm/src/main/java/org/objectweb/asm/MethodVisitor.java +++ b/asm/src/main/java/org/objectweb/asm/MethodVisitor.java @@ -27,6 +27,11 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm; +import org.checkerframework.checker.signature.qual.MethodDescriptor; +import org.checkerframework.checker.signature.qual.FieldDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.InternalForm; + /** * A visitor to visit a Java method. The methods of this class must be called in the following * order: ( {@code visitParameter} )* [ {@code visitAnnotationDefault} ] ( {@code visitAnnotation} | @@ -120,7 +125,7 @@ public MethodVisitor getDelegate() { */ public void visitParameter(final String name, final int access) { if (api < Opcodes.ASM5) { - throw new UnsupportedOperationException(REQUIRES_ASM5); + throw new UnsupportedOperationException("visitParameter requires ASM5, found " + (api >> 16)); } if (mv != null) { mv.visitParameter(name, access); @@ -150,7 +155,7 @@ public AnnotationVisitor visitAnnotationDefault() { * @return a visitor to visit the annotation values, or {@literal null} if this visitor is not * interested in visiting this annotation. */ - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { if (mv != null) { return mv.visitAnnotation(descriptor, visible); } @@ -174,9 +179,9 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean * interested in visiting this annotation. */ public AnnotationVisitor visitTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { if (api < Opcodes.ASM5) { - throw new UnsupportedOperationException(REQUIRES_ASM5); + throw new UnsupportedOperationException("visitTypeAnnotation requires ASM5, found " + (api >> 16)); } if (mv != null) { return mv.visitTypeAnnotation(typeRef, typePath, descriptor, visible); @@ -219,7 +224,7 @@ public void visitAnnotableParameterCount(final int parameterCount, final boolean * interested in visiting this annotation. */ public AnnotationVisitor visitParameterAnnotation( - final int parameter, final String descriptor, final boolean visible) { + final int parameter, final @FieldDescriptor String descriptor, final boolean visible) { if (mv != null) { return mv.visitParameterAnnotation(parameter, descriptor, visible); } @@ -382,7 +387,7 @@ public void visitVarInsn(final int opcode, final int varIndex) { * @param type the operand of the instruction to be visited. This operand must be the internal * name of an object or array class (see {@link Type#getInternalName()}). */ - public void visitTypeInsn(final int opcode, final String type) { + public void visitTypeInsn(final int opcode, final @InternalForm String type) { if (mv != null) { mv.visitTypeInsn(opcode, type); } @@ -399,7 +404,7 @@ public void visitTypeInsn(final int opcode, final String type) { * @param descriptor the field's descriptor (see {@link Type}). */ public void visitFieldInsn( - final int opcode, final String owner, final String name, final String descriptor) { + final int opcode, final @InternalForm String owner, final @Identifier String name, final @FieldDescriptor String descriptor) { if (mv != null) { mv.visitFieldInsn(opcode, owner, name, descriptor); } @@ -418,7 +423,7 @@ public void visitFieldInsn( */ @Deprecated public void visitMethodInsn( - final int opcode, final String owner, final String name, final String descriptor) { + final int opcode, final @InternalForm String owner, final @Identifier String name, final @MethodDescriptor String descriptor) { int opcodeAndSource = opcode | (api < Opcodes.ASM5 ? Opcodes.SOURCE_DEPRECATED : 0); visitMethodInsn(opcodeAndSource, owner, name, descriptor, opcode == Opcodes.INVOKEINTERFACE); } @@ -436,13 +441,13 @@ public void visitMethodInsn( */ public void visitMethodInsn( final int opcode, - final String owner, - final String name, - final String descriptor, + final @InternalForm String owner, + final @Identifier String name, + final @MethodDescriptor String descriptor, final boolean isInterface) { if (api < Opcodes.ASM5 && (opcode & Opcodes.SOURCE_DEPRECATED) == 0) { if (isInterface != (opcode == Opcodes.INVOKEINTERFACE)) { - throw new UnsupportedOperationException("INVOKESPECIAL/STATIC on interfaces requires ASM5"); + throw new UnsupportedOperationException("INVOKESPECIAL/STATIC on interfaces requires ASM5, found " + (api >> 16)); } visitMethodInsn(opcode, owner, name, descriptor); return; @@ -465,11 +470,11 @@ public void visitMethodInsn( */ public void visitInvokeDynamicInsn( final String name, - final String descriptor, + final @MethodDescriptor String descriptor, final Handle bootstrapMethodHandle, final Object... bootstrapMethodArguments) { if (api < Opcodes.ASM5) { - throw new UnsupportedOperationException(REQUIRES_ASM5); + throw new UnsupportedOperationException("visitInvokeDynamicInsn requires ASM5, found " + (api >> 16)); } if (mv != null) { mv.visitInvokeDynamicInsn(name, descriptor, bootstrapMethodHandle, bootstrapMethodArguments); @@ -554,7 +559,7 @@ public void visitLdcInsn(final Object value) { if (api < Opcodes.ASM5 && (value instanceof Handle || (value instanceof Type && ((Type) value).getSort() == Type.METHOD))) { - throw new UnsupportedOperationException(REQUIRES_ASM5); + throw new UnsupportedOperationException("visitLdcInsn requires ASM5, found " + (api >> 16)); } if (api < Opcodes.ASM7 && value instanceof ConstantDynamic) { throw new UnsupportedOperationException("This feature requires ASM7"); @@ -612,7 +617,7 @@ public void visitLookupSwitchInsn(final Label dflt, final int[] keys, final Labe * @param descriptor an array type descriptor (see {@link Type}). * @param numDimensions the number of dimensions of the array to allocate. */ - public void visitMultiANewArrayInsn(final String descriptor, final int numDimensions) { + public void visitMultiANewArrayInsn(final @FieldDescriptor String descriptor, final int numDimensions) { if (mv != null) { mv.visitMultiANewArrayInsn(descriptor, numDimensions); } @@ -638,9 +643,9 @@ public void visitMultiANewArrayInsn(final String descriptor, final int numDimens * interested in visiting this annotation. */ public AnnotationVisitor visitInsnAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { if (api < Opcodes.ASM5) { - throw new UnsupportedOperationException(REQUIRES_ASM5); + throw new UnsupportedOperationException("visitInsnAnnotation requires ASM5, found " + (api >> 16)); } if (mv != null) { return mv.visitInsnAnnotation(typeRef, typePath, descriptor, visible); @@ -665,7 +670,7 @@ public AnnotationVisitor visitInsnAnnotation( * (by the {@link #visitLabel} method). */ public void visitTryCatchBlock( - final Label start, final Label end, final Label handler, final String type) { + final Label start, final Label end, final Label handler, final @InternalForm String type) { if (mv != null) { mv.visitTryCatchBlock(start, end, handler, type); } @@ -687,9 +692,9 @@ public void visitTryCatchBlock( * interested in visiting this annotation. */ public AnnotationVisitor visitTryCatchAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { if (api < Opcodes.ASM5) { - throw new UnsupportedOperationException(REQUIRES_ASM5); + throw new UnsupportedOperationException("visitTryCatchAnnotation requires ASM5, found " + (api >> 16)); } if (mv != null) { return mv.visitTryCatchAnnotation(typeRef, typePath, descriptor, visible); @@ -712,8 +717,8 @@ public AnnotationVisitor visitTryCatchAnnotation( * visitor (by the {@link #visitLabel} method). */ public void visitLocalVariable( - final String name, - final String descriptor, + final @Identifier String name, + final @FieldDescriptor String descriptor, final String signature, final Label start, final Label end, @@ -749,10 +754,10 @@ public AnnotationVisitor visitLocalVariableAnnotation( final Label[] start, final Label[] end, final int[] index, - final String descriptor, + final @FieldDescriptor String descriptor, final boolean visible) { if (api < Opcodes.ASM5) { - throw new UnsupportedOperationException(REQUIRES_ASM5); + throw new UnsupportedOperationException("visitLocalVariableAnnotation requires ASM5, found " + (api >> 16)); } if (mv != null) { return mv.visitLocalVariableAnnotation( diff --git a/asm/src/main/java/org/objectweb/asm/MethodWriter.java b/asm/src/main/java/org/objectweb/asm/MethodWriter.java index 65f20251..b25a0934 100644 --- a/asm/src/main/java/org/objectweb/asm/MethodWriter.java +++ b/asm/src/main/java/org/objectweb/asm/MethodWriter.java @@ -27,6 +27,12 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm; +import org.checkerframework.checker.signature.qual.MethodDescriptor; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.checkerframework.checker.signature.qual.FieldDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.InternalForm; + /** * A {@link MethodVisitor} that generates a corresponding 'method_info' structure, as defined in the * Java Virtual Machine Specification (JVMS). @@ -300,13 +306,13 @@ final class MethodWriter extends MethodVisitor { private final int nameIndex; /** The name of this method. */ - private final String name; + private final @Identifier String name; /** The descriptor_index field of the method_info JVMS structure. */ private final int descriptorIndex; /** The descriptor of this method. */ - private final String descriptor; + private final @MethodDescriptor String descriptor; // Code attribute fields and sub attributes: @@ -590,9 +596,9 @@ final class MethodWriter extends MethodVisitor { final SymbolTable symbolTable, final int access, final String name, - final String descriptor, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions, + final @InternalForm String @Nullable [] exceptions, final int compute) { super(/* latest api = */ Opcodes.ASM9); this.symbolTable = symbolTable; @@ -655,7 +661,7 @@ public AnnotationVisitor visitAnnotationDefault() { } @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { if (visible) { return lastRuntimeVisibleAnnotation = AnnotationWriter.create(symbolTable, descriptor, lastRuntimeVisibleAnnotation); @@ -667,7 +673,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean @Override public AnnotationVisitor visitTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { if (visible) { return lastRuntimeVisibleTypeAnnotation = AnnotationWriter.create( @@ -690,7 +696,7 @@ public void visitAnnotableParameterCount(final int parameterCount, final boolean @Override public AnnotationVisitor visitParameterAnnotation( - final int parameter, final String annotationDescriptor, final boolean visible) { + final int parameter, final @FieldDescriptor String annotationDescriptor, final boolean visible) { if (visible) { if (lastRuntimeVisibleParameterAnnotations == null) { lastRuntimeVisibleParameterAnnotations = @@ -968,7 +974,7 @@ public void visitVarInsn(final int opcode, final int varIndex) { } @Override - public void visitTypeInsn(final int opcode, final String type) { + public void visitTypeInsn(final int opcode, final @InternalForm String type) { lastBytecodeOffset = code.length; // Add the instruction to the bytecode of the method. Symbol typeSymbol = symbolTable.addConstantClass(type); @@ -990,7 +996,7 @@ public void visitTypeInsn(final int opcode, final String type) { @Override public void visitFieldInsn( - final int opcode, final String owner, final String name, final String descriptor) { + final int opcode, final @InternalForm String owner, final @Identifier String name, final @FieldDescriptor String descriptor) { lastBytecodeOffset = code.length; // Add the instruction to the bytecode of the method. Symbol fieldrefSymbol = symbolTable.addConstantFieldref(owner, name, descriptor); @@ -1028,9 +1034,9 @@ public void visitFieldInsn( @Override public void visitMethodInsn( final int opcode, - final String owner, - final String name, - final String descriptor, + final @InternalForm String owner, + final @Identifier String name, + final @MethodDescriptor String descriptor, final boolean isInterface) { lastBytecodeOffset = code.length; // Add the instruction to the bytecode of the method. @@ -1065,7 +1071,7 @@ public void visitMethodInsn( @Override public void visitInvokeDynamicInsn( final String name, - final String descriptor, + final @MethodDescriptor String descriptor, final Handle bootstrapMethodHandle, final Object... bootstrapMethodArguments) { lastBytecodeOffset = code.length; @@ -1386,9 +1392,10 @@ private void visitSwitchInsn(final Label dflt, final Label[] labels) { } @Override - public void visitMultiANewArrayInsn(final String descriptor, final int numDimensions) { + public void visitMultiANewArrayInsn(final @FieldDescriptor String descriptor, final int numDimensions) { lastBytecodeOffset = code.length; // Add the instruction to the bytecode of the method. + @SuppressWarnings("signature:argument") // BUG?? Symbol descSymbol = symbolTable.addConstantClass(descriptor); code.put12(Opcodes.MULTIANEWARRAY, descSymbol.index).putByte(numDimensions); // If needed, update the maximum stack size and number of locals, and stack map frames. @@ -1405,7 +1412,7 @@ public void visitMultiANewArrayInsn(final String descriptor, final int numDimens @Override public AnnotationVisitor visitInsnAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { if (visible) { return lastCodeRuntimeVisibleTypeAnnotation = AnnotationWriter.create( @@ -1427,7 +1434,7 @@ public AnnotationVisitor visitInsnAnnotation( @Override public void visitTryCatchBlock( - final Label start, final Label end, final Label handler, final String type) { + final Label start, final Label end, final Label handler, final @InternalForm String type) { Handler newHandler = new Handler( start, end, handler, type != null ? symbolTable.addConstantClass(type).index : 0, type); @@ -1441,7 +1448,7 @@ public void visitTryCatchBlock( @Override public AnnotationVisitor visitTryCatchAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { if (visible) { return lastCodeRuntimeVisibleTypeAnnotation = AnnotationWriter.create( @@ -1455,8 +1462,8 @@ public AnnotationVisitor visitTryCatchAnnotation( @Override public void visitLocalVariable( - final String name, - final String descriptor, + final @Identifier String name, + final @FieldDescriptor String descriptor, final String signature, final Label start, final Label end, @@ -1499,7 +1506,7 @@ public AnnotationVisitor visitLocalVariableAnnotation( final Label[] start, final Label[] end, final int[] index, - final String descriptor, + final @FieldDescriptor String descriptor, final boolean visible) { // Create a ByteVector to hold a 'type_annotation' JVMS structure. // See https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.7.20. @@ -1978,7 +1985,7 @@ private void putFrameType(final Object type) { } else if (type instanceof String) { stackMapTableEntries .putByte(Frame.ITEM_OBJECT) - .putShort(symbolTable.addConstantClass((String) type).index); + .putShort(symbolTable.addConstantClass((@InternalForm String) type).index); } else { stackMapTableEntries.putByte(Frame.ITEM_UNINITIALIZED); ((Label) type).put(stackMapTableEntries); diff --git a/asm/src/main/java/org/objectweb/asm/ModuleVisitor.java b/asm/src/main/java/org/objectweb/asm/ModuleVisitor.java index 9a566f3d..68af6ae0 100644 --- a/asm/src/main/java/org/objectweb/asm/ModuleVisitor.java +++ b/asm/src/main/java/org/objectweb/asm/ModuleVisitor.java @@ -27,6 +27,9 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm; +import org.checkerframework.checker.signature.qual.DotSeparatedIdentifiers; +import org.checkerframework.checker.signature.qual.InternalForm; + /** * A visitor to visit a Java module. The methods of this class must be called in the following * order: ( {@code visitMainClass} | ( {@code visitPackage} | {@code visitRequire} | {@code @@ -98,7 +101,7 @@ public ModuleVisitor getDelegate() { * @param mainClass the internal name of the main class of the current module (see {@link * Type#getInternalName()}). */ - public void visitMainClass(final String mainClass) { + public void visitMainClass(final @InternalForm String mainClass) { if (mv != null) { mv.visitMainClass(mainClass); } @@ -109,7 +112,7 @@ public void visitMainClass(final String mainClass) { * * @param packaze the internal name of a package (see {@link Type#getInternalName()}). */ - public void visitPackage(final String packaze) { + public void visitPackage(final @DotSeparatedIdentifiers String packaze) { if (mv != null) { mv.visitPackage(packaze); } @@ -123,7 +126,7 @@ public void visitPackage(final String packaze) { * ACC_STATIC_PHASE}, {@code ACC_SYNTHETIC} and {@code ACC_MANDATED}. * @param version the module version at compile time, or {@literal null}. */ - public void visitRequire(final String module, final int access, final String version) { + public void visitRequire(final @DotSeparatedIdentifiers String module, final int access, final String version) { if (mv != null) { mv.visitRequire(module, access, version); } @@ -138,7 +141,7 @@ public void visitRequire(final String module, final int access, final String ver * @param modules the fully qualified names (using dots) of the modules that can access the public * classes of the exported package, or {@literal null}. */ - public void visitExport(final String packaze, final int access, final String... modules) { + public void visitExport(final @DotSeparatedIdentifiers String packaze, final int access, final @DotSeparatedIdentifiers String... modules) { if (mv != null) { mv.visitExport(packaze, access, modules); } @@ -153,7 +156,7 @@ public void visitExport(final String packaze, final int access, final String... * @param modules the fully qualified names (using dots) of the modules that can use deep * reflection to the classes of the open package, or {@literal null}. */ - public void visitOpen(final String packaze, final int access, final String... modules) { + public void visitOpen(final @DotSeparatedIdentifiers String packaze, final int access, final @DotSeparatedIdentifiers String... modules) { if (mv != null) { mv.visitOpen(packaze, access, modules); } @@ -165,7 +168,7 @@ public void visitOpen(final String packaze, final int access, final String... mo * * @param service the internal name of the service (see {@link Type#getInternalName()}). */ - public void visitUse(final String service) { + public void visitUse(final @InternalForm String service) { if (mv != null) { mv.visitUse(service); } @@ -178,7 +181,7 @@ public void visitUse(final String service) { * @param providers the internal names (see {@link Type#getInternalName()}) of the implementations * of the service (there is at least one provider). */ - public void visitProvide(final String service, final String... providers) { + public void visitProvide(final @InternalForm String service, final @InternalForm String... providers) { if (mv != null) { mv.visitProvide(service, providers); } diff --git a/asm/src/main/java/org/objectweb/asm/ModuleWriter.java b/asm/src/main/java/org/objectweb/asm/ModuleWriter.java index 0ace0fa7..8548ec8b 100644 --- a/asm/src/main/java/org/objectweb/asm/ModuleWriter.java +++ b/asm/src/main/java/org/objectweb/asm/ModuleWriter.java @@ -27,6 +27,9 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm; +import org.checkerframework.checker.signature.qual.DotSeparatedIdentifiers; +import org.checkerframework.checker.signature.qual.InternalForm; + /** * A {@link ModuleVisitor} that generates the corresponding Module, ModulePackages and * ModuleMainClass attributes, as defined in the Java Virtual Machine Specification (JVMS). @@ -108,18 +111,18 @@ final class ModuleWriter extends ModuleVisitor { } @Override - public void visitMainClass(final String mainClass) { + public void visitMainClass(final @InternalForm String mainClass) { this.mainClassIndex = symbolTable.addConstantClass(mainClass).index; } @Override - public void visitPackage(final String packaze) { + public void visitPackage(final @DotSeparatedIdentifiers String packaze) { packageIndex.putShort(symbolTable.addConstantPackage(packaze).index); packageCount++; } @Override - public void visitRequire(final String module, final int access, final String version) { + public void visitRequire(final @DotSeparatedIdentifiers String module, final int access, final String version) { requires .putShort(symbolTable.addConstantModule(module).index) .putShort(access) @@ -128,7 +131,7 @@ public void visitRequire(final String module, final int access, final String ver } @Override - public void visitExport(final String packaze, final int access, final String... modules) { + public void visitExport(final @DotSeparatedIdentifiers String packaze, final int access, final @DotSeparatedIdentifiers String... modules) { exports.putShort(symbolTable.addConstantPackage(packaze).index).putShort(access); if (modules == null) { exports.putShort(0); @@ -142,7 +145,7 @@ public void visitExport(final String packaze, final int access, final String... } @Override - public void visitOpen(final String packaze, final int access, final String... modules) { + public void visitOpen(final @DotSeparatedIdentifiers String packaze, final int access, final @DotSeparatedIdentifiers String... modules) { opens.putShort(symbolTable.addConstantPackage(packaze).index).putShort(access); if (modules == null) { opens.putShort(0); @@ -156,13 +159,13 @@ public void visitOpen(final String packaze, final int access, final String... mo } @Override - public void visitUse(final String service) { + public void visitUse(final @InternalForm String service) { usesIndex.putShort(symbolTable.addConstantClass(service).index); usesCount++; } @Override - public void visitProvide(final String service, final String... providers) { + public void visitProvide(final @InternalForm String service, final @InternalForm String... providers) { provides.putShort(symbolTable.addConstantClass(service).index); provides.putShort(providers.length); for (String provider : providers) { diff --git a/asm/src/main/java/org/objectweb/asm/RecordComponentVisitor.java b/asm/src/main/java/org/objectweb/asm/RecordComponentVisitor.java index 32784e2a..dc4f57eb 100644 --- a/asm/src/main/java/org/objectweb/asm/RecordComponentVisitor.java +++ b/asm/src/main/java/org/objectweb/asm/RecordComponentVisitor.java @@ -27,6 +27,8 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm; +import org.checkerframework.checker.signature.qual.FieldDescriptor; + /** * A visitor to visit a record component. The methods of this class must be called in the following * order: ( {@code visitAnnotation} | {@code visitTypeAnnotation} | {@code visitAttribute} )* {@code @@ -100,7 +102,7 @@ public RecordComponentVisitor getDelegate() { * @return a visitor to visit the annotation values, or {@literal null} if this visitor is not * interested in visiting this annotation. */ - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { if (delegate != null) { return delegate.visitAnnotation(descriptor, visible); } @@ -123,7 +125,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean * interested in visiting this annotation. */ public AnnotationVisitor visitTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { if (delegate != null) { return delegate.visitTypeAnnotation(typeRef, typePath, descriptor, visible); } diff --git a/asm/src/main/java/org/objectweb/asm/RecordComponentWriter.java b/asm/src/main/java/org/objectweb/asm/RecordComponentWriter.java index 0dabb754..746181e1 100644 --- a/asm/src/main/java/org/objectweb/asm/RecordComponentWriter.java +++ b/asm/src/main/java/org/objectweb/asm/RecordComponentWriter.java @@ -27,6 +27,9 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm; +import org.checkerframework.checker.signature.qual.FieldDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; + final class RecordComponentWriter extends RecordComponentVisitor { /** Where the constants used in this RecordComponentWriter must be stored. */ private final SymbolTable symbolTable; @@ -91,8 +94,8 @@ final class RecordComponentWriter extends RecordComponentVisitor { */ RecordComponentWriter( final SymbolTable symbolTable, - final String name, - final String descriptor, + final @Identifier String name, + final @FieldDescriptor String descriptor, final String signature) { super(/* latest api = */ Opcodes.ASM9); this.symbolTable = symbolTable; @@ -108,7 +111,7 @@ final class RecordComponentWriter extends RecordComponentVisitor { // ----------------------------------------------------------------------------------------------- @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { if (visible) { return lastRuntimeVisibleAnnotation = AnnotationWriter.create(symbolTable, descriptor, lastRuntimeVisibleAnnotation); @@ -120,7 +123,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean @Override public AnnotationVisitor visitTypeAnnotation( - final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) { + final int typeRef, final TypePath typePath, final @FieldDescriptor String descriptor, final boolean visible) { if (visible) { return lastRuntimeVisibleTypeAnnotation = AnnotationWriter.create( diff --git a/asm/src/main/java/org/objectweb/asm/Symbol.java b/asm/src/main/java/org/objectweb/asm/Symbol.java index 8d3d3169..b66c18d8 100644 --- a/asm/src/main/java/org/objectweb/asm/Symbol.java +++ b/asm/src/main/java/org/objectweb/asm/Symbol.java @@ -27,6 +27,8 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm; +import org.checkerframework.checker.signature.qual.InternalForm; + /** * An entry of the constant pool, of the BootstrapMethods attribute, or of the (ASM specific) type * table of a class. @@ -142,7 +144,7 @@ abstract class Symbol { * #CONSTANT_FIELDREF_TAG}, {@link #CONSTANT_METHODREF_TAG}, {@link * #CONSTANT_INTERFACE_METHODREF_TAG}, and {@link #CONSTANT_METHOD_HANDLE_TAG} symbols. */ - final String owner; + final @InternalForm String owner; /** * The name of the class field or method corresponding to this symbol. Only used for {@link @@ -232,7 +234,7 @@ abstract class Symbol { Symbol( final int index, final int tag, - final String owner, + final @InternalForm String owner, final String name, final String value, final long data) { diff --git a/asm/src/main/java/org/objectweb/asm/SymbolTable.java b/asm/src/main/java/org/objectweb/asm/SymbolTable.java index c3b17957..99f6b68c 100644 --- a/asm/src/main/java/org/objectweb/asm/SymbolTable.java +++ b/asm/src/main/java/org/objectweb/asm/SymbolTable.java @@ -27,6 +27,12 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm; +import org.checkerframework.checker.signature.qual.MethodDescriptor; +import org.checkerframework.checker.signature.qual.DotSeparatedIdentifiers; +import org.checkerframework.checker.signature.qual.FieldDescriptor; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.InternalForm; + /** * The constant pool entries, the BootstrapMethods attribute entries and the (ASM specific) type * table entries of a class. @@ -56,7 +62,7 @@ final class SymbolTable { private int majorVersion; /** The internal name of the class to which this symbol table belongs. */ - private String className; + private @InternalForm String className; /** * The total number of {@link Entry} instances in {@link #entries}. This includes entries that are @@ -190,7 +196,7 @@ final class SymbolTable { addConstantMemberReference( itemIndex, itemTag, - classReader.readClass(itemOffset, charBuffer), + (@InternalForm String) classReader.readClass(itemOffset, charBuffer), classReader.readUTF8(nameAndTypeItemOffset, charBuffer), classReader.readUTF8(nameAndTypeItemOffset + 2, charBuffer)); break; @@ -219,7 +225,7 @@ final class SymbolTable { addConstantMethodHandle( itemIndex, classReader.readByte(itemOffset), - classReader.readClass(memberRefItemOffset, charBuffer), + (@InternalForm String) classReader.readClass(memberRefItemOffset, charBuffer), classReader.readUTF8(nameAndTypeItemOffset, charBuffer), classReader.readUTF8(nameAndTypeItemOffset + 2, charBuffer), classReader.readByte(memberRefItemOffset - 1) @@ -233,7 +239,7 @@ final class SymbolTable { addConstantDynamicOrInvokeDynamicReference( itemTag, itemIndex, - classReader.readUTF8(nameAndTypeItemOffset, charBuffer), + (@Identifier String) classReader.readUTF8(nameAndTypeItemOffset, charBuffer), classReader.readUTF8(nameAndTypeItemOffset + 2, charBuffer), classReader.readUnsignedShort(itemOffset)); break; @@ -328,7 +334,7 @@ int getMajorVersion() { * * @return the internal name of the class to which this symbol table belongs. */ - String getClassName() { + @InternalForm String getClassName() { return className; } @@ -340,7 +346,7 @@ String getClassName() { * @param className an internal class name. * @return the constant pool index of a new or already existing Symbol with the given class name. */ - int setMajorVersionAndClassName(final int majorVersion, final String className) { + int setMajorVersionAndClassName(final int majorVersion, final @InternalForm String className) { this.majorVersion = majorVersion; this.className = className; return addConstantClass(className).index; @@ -506,7 +512,7 @@ Symbol addConstant(final Object value) { } else if (typeSort == Type.METHOD) { return addConstantMethodType(type.getDescriptor()); } else { // type is a primitive or array type. - return addConstantClass(type.getDescriptor()); + return addConstantClass((@InternalForm String) type.getDescriptor()); } } else if (value instanceof Handle) { Handle handle = (Handle) value; @@ -535,7 +541,7 @@ Symbol addConstant(final Object value) { * @param value the internal name of a class. * @return a new or already existing Symbol with the given value. */ - Symbol addConstantClass(final String value) { + Symbol addConstantClass(final @InternalForm String value) { return addConstantUtf8Reference(Symbol.CONSTANT_CLASS_TAG, value); } @@ -548,7 +554,7 @@ Symbol addConstantClass(final String value) { * @param descriptor a field descriptor. * @return a new or already existing Symbol with the given value. */ - Symbol addConstantFieldref(final String owner, final String name, final String descriptor) { + Symbol addConstantFieldref(final @InternalForm String owner, final String name, final @FieldDescriptor String descriptor) { return addConstantMemberReference(Symbol.CONSTANT_FIELDREF_TAG, owner, name, descriptor); } @@ -563,7 +569,7 @@ Symbol addConstantFieldref(final String owner, final String name, final String d * @return a new or already existing Symbol with the given value. */ Symbol addConstantMethodref( - final String owner, final String name, final String descriptor, final boolean isInterface) { + final @InternalForm String owner, final String name, final @MethodDescriptor String descriptor, final boolean isInterface) { int tag = isInterface ? Symbol.CONSTANT_INTERFACE_METHODREF_TAG : Symbol.CONSTANT_METHODREF_TAG; return addConstantMemberReference(tag, owner, name, descriptor); } @@ -581,7 +587,7 @@ Symbol addConstantMethodref( * @return a new or already existing Symbol with the given value. */ private Entry addConstantMemberReference( - final int tag, final String owner, final String name, final String descriptor) { + final int tag, final @InternalForm String owner, final String name, final String descriptor) { int hashCode = hash(tag, owner, name, descriptor); Entry entry = get(hashCode); while (entry != null) { @@ -613,7 +619,7 @@ private Entry addConstantMemberReference( private void addConstantMemberReference( final int index, final int tag, - final String owner, + final @InternalForm String owner, final String name, final String descriptor) { add(new Entry(index, tag, owner, name, descriptor, 0, hash(tag, owner, name, descriptor))); @@ -827,7 +833,7 @@ private void addConstantUtf8(final int index, final String value) { */ Symbol addConstantMethodHandle( final int referenceKind, - final String owner, + final @InternalForm String owner, final String name, final String descriptor, final boolean isInterface) { @@ -849,10 +855,10 @@ Symbol addConstantMethodHandle( entry = entry.next; } if (referenceKind <= Opcodes.H_PUTSTATIC) { - constantPool.put112(tag, referenceKind, addConstantFieldref(owner, name, descriptor).index); + constantPool.put112(tag, referenceKind, addConstantFieldref(owner, name, (@FieldDescriptor String) descriptor).index); } else { constantPool.put112( - tag, referenceKind, addConstantMethodref(owner, name, descriptor, isInterface).index); + tag, referenceKind, addConstantMethodref(owner, name, (@MethodDescriptor String) descriptor, isInterface).index); } return put(new Entry(constantPoolCount++, tag, owner, name, descriptor, data, hashCode)); } @@ -873,7 +879,7 @@ Symbol addConstantMethodHandle( private void addConstantMethodHandle( final int index, final int referenceKind, - final String owner, + final @InternalForm String owner, final String name, final String descriptor, final boolean isInterface) { @@ -924,7 +930,7 @@ Symbol addConstantMethodType(final String methodDescriptor) { */ Symbol addConstantDynamic( final String name, - final String descriptor, + final @FieldDescriptor String descriptor, final Handle bootstrapMethodHandle, final Object... bootstrapMethodArguments) { Symbol bootstrapMethod = addBootstrapMethod(bootstrapMethodHandle, bootstrapMethodArguments); @@ -945,7 +951,7 @@ Symbol addConstantDynamic( */ Symbol addConstantInvokeDynamic( final String name, - final String descriptor, + final @MethodDescriptor String descriptor, final Handle bootstrapMethodHandle, final Object... bootstrapMethodArguments) { Symbol bootstrapMethod = addBootstrapMethod(bootstrapMethodHandle, bootstrapMethodArguments); @@ -966,7 +972,7 @@ Symbol addConstantInvokeDynamic( * @return a new or already existing Symbol with the given value. */ private Symbol addConstantDynamicOrInvokeDynamicReference( - final int tag, final String name, final String descriptor, final int bootstrapMethodIndex) { + final int tag, final String name, final /*@FieldOrMethodDescriptor*/ String descriptor, final int bootstrapMethodIndex) { int hashCode = hash(tag, name, descriptor, bootstrapMethodIndex); Entry entry = get(hashCode); while (entry != null) { @@ -1000,8 +1006,8 @@ private Symbol addConstantDynamicOrInvokeDynamicReference( private void addConstantDynamicOrInvokeDynamicReference( final int tag, final int index, - final String name, - final String descriptor, + final @Identifier String name, + final /*@FieldOrMethodDescriptor*/ String descriptor, final int bootstrapMethodIndex) { int hashCode = hash(tag, name, descriptor, bootstrapMethodIndex); add(new Entry(index, tag, null, name, descriptor, bootstrapMethodIndex, hashCode)); @@ -1014,7 +1020,7 @@ private void addConstantDynamicOrInvokeDynamicReference( * @param moduleName a fully qualified name (using dots) of a module. * @return a new or already existing Symbol with the given value. */ - Symbol addConstantModule(final String moduleName) { + Symbol addConstantModule(final @DotSeparatedIdentifiers String moduleName) { return addConstantUtf8Reference(Symbol.CONSTANT_MODULE_TAG, moduleName); } @@ -1025,7 +1031,7 @@ Symbol addConstantModule(final String moduleName) { * @param packageName the internal name of a package. * @return a new or already existing Symbol with the given value. */ - Symbol addConstantPackage(final String packageName) { + Symbol addConstantPackage(final @DotSeparatedIdentifiers String packageName) { return addConstantUtf8Reference(Symbol.CONSTANT_PACKAGE_TAG, packageName); } @@ -1194,7 +1200,7 @@ Label getForwardUninitializedLabel(final int typeIndex) { * @param value an internal class name. * @return the index of a new or already existing type Symbol with the given value. */ - int addType(final String value) { + int addType(final @InternalForm String value) { int hashCode = hash(Symbol.TYPE_TAG, value); Entry entry = get(hashCode); while (entry != null) { @@ -1215,7 +1221,7 @@ int addType(final String value) { * uninitialized type value. * @return the index of a new or already existing type #@link Symbol} with the given value. */ - int addUninitializedType(final String value, final int bytecodeOffset) { + int addUninitializedType(final @InternalForm String value, final int bytecodeOffset) { int hashCode = hash(Symbol.UNINITIALIZED_TYPE_TAG, value, bytecodeOffset); Entry entry = get(hashCode); while (entry != null) { @@ -1240,7 +1246,7 @@ int addUninitializedType(final String value, final int bytecodeOffset) { * the label is resolved, use the {@link #addUninitializedType} method instead. * @return the index of a new or already existing type {@link Symbol} with the given value. */ - int addForwardUninitializedType(final String value, final Label label) { + int addForwardUninitializedType(final @InternalForm String value, final Label label) { int labelIndex = getOrAddLabelEntry(label).index; int hashCode = hash(Symbol.FORWARD_UNINITIALIZED_TYPE_TAG, value, labelIndex); Entry entry = get(hashCode); @@ -1281,8 +1287,8 @@ int addMergedType(final int typeTableIndex1, final int typeTableIndex2) { } entry = entry.next; } - String type1 = typeTable[typeTableIndex1].value; - String type2 = typeTable[typeTableIndex2].value; + @InternalForm String type1 = typeTable[typeTableIndex1].value; + @InternalForm String type2 = typeTable[typeTableIndex2].value; int commonSuperTypeIndex = addType(classWriter.getCommonSuperClass(type1, type2)); put(new Entry(typeCount, Symbol.MERGED_TYPE_TAG, data, hashCode)).info = commonSuperTypeIndex; return commonSuperTypeIndex; @@ -1426,7 +1432,7 @@ private static final class Entry extends Symbol { Entry( final int index, final int tag, - final String owner, + final @InternalForm String owner, final String name, final String value, final long data, diff --git a/asm/src/main/java/org/objectweb/asm/Type.java b/asm/src/main/java/org/objectweb/asm/Type.java index c60a4233..4641393d 100644 --- a/asm/src/main/java/org/objectweb/asm/Type.java +++ b/asm/src/main/java/org/objectweb/asm/Type.java @@ -27,6 +27,12 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm; +import org.checkerframework.checker.signature.qual.MethodDescriptor; +import org.checkerframework.checker.signature.qual.FieldDescriptor; +import org.checkerframework.checker.signature.qual.BinaryName; +import org.checkerframework.checker.signature.qual.BinaryNameOrPrimitiveType; +import org.checkerframework.checker.signature.qual.InternalForm; + import java.lang.reflect.Constructor; import java.lang.reflect.Method; @@ -248,7 +254,7 @@ public Type getElementType() { * @param internalName an internal name (see {@link Type#getInternalName()}). * @return the {@link Type} corresponding to the given internal name. */ - public static Type getObjectType(final String internalName) { + public static Type getObjectType(final @InternalForm String internalName) { return new Type( internalName.charAt(0) == '[' ? ARRAY : INTERNAL, internalName, 0, internalName.length()); } @@ -440,10 +446,10 @@ private static Type getTypeInternal( * * @return the binary name of the class corresponding to this type. */ - public String getClassName() { + public @BinaryNameOrPrimitiveType String getClassName() { switch (sort) { case VOID: - return "void"; + return (@BinaryNameOrPrimitiveType String) "void"; // to make type-checking pass case BOOLEAN: return "boolean"; case CHAR: @@ -465,10 +471,11 @@ public String getClassName() { for (int i = getDimensions(); i > 0; --i) { stringBuilder.append("[]"); } - return stringBuilder.toString(); + return (@BinaryNameOrPrimitiveType String) stringBuilder.toString(); case OBJECT: case INTERNAL: - return valueBuffer.substring(valueBegin, valueEnd).replace('/', '.'); + // If not an array or primitive, this conversion works. + return (@BinaryNameOrPrimitiveType String) valueBuffer.substring(valueBegin, valueEnd).replace('/', '.'); default: throw new AssertionError(); } @@ -481,7 +488,8 @@ public String getClassName() { * * @return the internal name of the class corresponding to this object type. */ - public String getInternalName() { + @SuppressWarnings("signature:return") // string manipulation + public @InternalForm String getInternalName() { return valueBuffer.substring(valueBegin, valueEnd); } @@ -492,7 +500,8 @@ public String getInternalName() { * @param clazz an object or array class. * @return the internal name of the given class. */ - public static String getInternalName(final Class clazz) { + @SuppressWarnings("signature:return") // If not an array or primitive, this conversion works. + public static @InternalForm String getInternalName(final Class clazz) { return clazz.getName().replace('.', '/'); } @@ -501,7 +510,8 @@ public static String getInternalName(final Class clazz) { * * @return the descriptor corresponding to this type. */ - public String getDescriptor() { + @SuppressWarnings("return") // string concatenation + public @FieldDescriptor String getDescriptor() { if (sort == OBJECT) { return valueBuffer.substring(valueBegin - 1, valueEnd + 1); } else if (sort == INTERNAL) { @@ -517,7 +527,8 @@ public String getDescriptor() { * @param clazz an object class, a primitive class or an array class. * @return the descriptor corresponding to the given class. */ - public static String getDescriptor(final Class clazz) { + @SuppressWarnings("return") // string concatenation + public static @FieldDescriptor String getDescriptor(final Class clazz) { StringBuilder stringBuilder = new StringBuilder(); appendDescriptor(clazz, stringBuilder); return stringBuilder.toString(); @@ -529,7 +540,8 @@ public static String getDescriptor(final Class clazz) { * @param constructor a {@link Constructor} object. * @return the descriptor of the given constructor. */ - public static String getConstructorDescriptor(final Constructor constructor) { + @SuppressWarnings("signature:return") // string concatenation + public static @MethodDescriptor String getConstructorDescriptor(final Constructor constructor) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append('('); Class[] parameters = constructor.getParameterTypes(); @@ -546,7 +558,8 @@ public static String getConstructorDescriptor(final Constructor constructor) * @param argumentTypes the argument types of the method. * @return the descriptor corresponding to the given argument and return types. */ - public static String getMethodDescriptor(final Type returnType, final Type... argumentTypes) { + @SuppressWarnings("signature:return") // string concatenation + public static @MethodDescriptor String getMethodDescriptor(final Type returnType, final Type... argumentTypes) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append('('); for (Type argumentType : argumentTypes) { @@ -563,7 +576,8 @@ public static String getMethodDescriptor(final Type returnType, final Type... ar * @param method a {@link Method} object. * @return the descriptor of the given method. */ - public static String getMethodDescriptor(final Method method) { + @SuppressWarnings("signature:return") // string concatenation + public static @MethodDescriptor String getMethodDescriptor(final Method method) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append('('); Class[] parameters = method.getParameterTypes(); diff --git a/asm/src/main/java/org/objectweb/asm/signature/SignatureReader.java b/asm/src/main/java/org/objectweb/asm/signature/SignatureReader.java index 304c6f34..3ef1ed6a 100644 --- a/asm/src/main/java/org/objectweb/asm/signature/SignatureReader.java +++ b/asm/src/main/java/org/objectweb/asm/signature/SignatureReader.java @@ -27,6 +27,8 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.signature; +import org.checkerframework.checker.signature.qual.InternalForm; + /** * A parser for signature literals, as defined in the Java Virtual Machine Specification (JVMS), to * visit them with a SignatureVisitor. @@ -36,6 +38,7 @@ * @author Thomas Hallgren * @author Eric Bruneton */ +@SuppressWarnings("signature") // parsing and string manipulation public class SignatureReader { /** The JVMS signature to be read. */ @@ -193,7 +196,7 @@ private static int parseType( // or an inner class name. This name may already have been visited it is was followed by // type arguments between '<' and '>'. If not, we need to visit it here. if (!visited) { - String name = signature.substring(start, offset - 1); + @InternalForm String name = signature.substring(start, offset - 1); if (inner) { signatureVisitor.visitInnerClassType(name); } else { @@ -213,7 +216,7 @@ private static int parseType( // If a '<' is encountered, this means we have fully parsed the main class name or an // inner class name, and that we now need to parse TypeArguments. First, we need to // visit the parsed class name. - String name = signature.substring(start, offset - 1); + @InternalForm String name = signature.substring(start, offset - 1); if (inner) { signatureVisitor.visitInnerClassType(name); } else { diff --git a/asm/src/main/java/org/objectweb/asm/signature/SignatureVisitor.java b/asm/src/main/java/org/objectweb/asm/signature/SignatureVisitor.java index b34df1d6..eb03c311 100644 --- a/asm/src/main/java/org/objectweb/asm/signature/SignatureVisitor.java +++ b/asm/src/main/java/org/objectweb/asm/signature/SignatureVisitor.java @@ -27,6 +27,9 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.signature; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.InternalForm; + import org.objectweb.asm.Opcodes; /** @@ -89,7 +92,7 @@ protected SignatureVisitor(final int api) { * * @param name the name of the formal parameter. */ - public void visitFormalTypeParameter(final String name) {} + public void visitFormalTypeParameter(final @Identifier String name) {} /** * Visits the class bound of the last visited formal type parameter. @@ -166,7 +169,7 @@ public void visitBaseType(final char descriptor) {} * * @param name the name of the type variable. */ - public void visitTypeVariable(final String name) {} + public void visitTypeVariable(final @Identifier String name) {} /** * Visits a signature corresponding to an array type. @@ -183,7 +186,7 @@ public SignatureVisitor visitArrayType() { * @param name the internal name of the class or interface (see {@link * org.objectweb.asm.Type#getInternalName()}). */ - public void visitClassType(final String name) {} + public void visitClassType(final @InternalForm String name) {} /** * Visits an inner class. diff --git a/asm/src/main/java/org/objectweb/asm/signature/SignatureWriter.java b/asm/src/main/java/org/objectweb/asm/signature/SignatureWriter.java index c8d80f92..8c525be8 100644 --- a/asm/src/main/java/org/objectweb/asm/signature/SignatureWriter.java +++ b/asm/src/main/java/org/objectweb/asm/signature/SignatureWriter.java @@ -27,6 +27,9 @@ // THE POSSIBILITY OF SUCH DAMAGE. package org.objectweb.asm.signature; +import org.checkerframework.checker.signature.qual.Identifier; +import org.checkerframework.checker.signature.qual.InternalForm; + import org.objectweb.asm.Opcodes; /** @@ -84,7 +87,7 @@ private SignatureWriter(final StringBuilder stringBuilder) { // ----------------------------------------------------------------------------------------------- @Override - public void visitFormalTypeParameter(final String name) { + public void visitFormalTypeParameter(final @Identifier String name) { if (!hasFormals) { hasFormals = true; stringBuilder.append('<'); @@ -147,7 +150,7 @@ public void visitBaseType(final char descriptor) { } @Override - public void visitTypeVariable(final String name) { + public void visitTypeVariable(final @Identifier String name) { stringBuilder.append('T'); stringBuilder.append(name); stringBuilder.append(';'); @@ -160,7 +163,7 @@ public SignatureVisitor visitArrayType() { } @Override - public void visitClassType(final String name) { + public void visitClassType(final @InternalForm String name) { stringBuilder.append('L'); stringBuilder.append(name); // Pushes 'false' on the stack, meaning that this type does not have type arguments (as far as diff --git a/asm/src/test/java/org/objectweb/asm/AnnotationVisitorTest.java b/asm/src/test/java/org/objectweb/asm/AnnotationVisitorTest.java index 6b06d081..24551c5b 100644 --- a/asm/src/test/java/org/objectweb/asm/AnnotationVisitorTest.java +++ b/asm/src/test/java/org/objectweb/asm/AnnotationVisitorTest.java @@ -112,7 +112,7 @@ private static class EmptyAnnotationVisitor extends AnnotationVisitor { } @Override - public AnnotationVisitor visitAnnotation(final String name, final String descriptor) { + public AnnotationVisitor visitAnnotation(final @Identifier String name, final @FieldDescriptor String descriptor) { return this; } @@ -129,7 +129,7 @@ private static class RemoveAnnotationsAdapter extends ClassVisitor { } @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { return new EmptyAnnotationVisitor(api); } @@ -137,7 +137,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean public AnnotationVisitor visitTypeAnnotation( final int typeRef, final TypePath typePath, - final String descriptor, + final @FieldDescriptor String descriptor, final boolean visible) { return new EmptyAnnotationVisitor(api); } @@ -145,10 +145,10 @@ public AnnotationVisitor visitTypeAnnotation( @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { return new MethodVisitor( api, super.visitMethod(access, name, descriptor, signature, exceptions)) { @@ -158,7 +158,7 @@ public AnnotationVisitor visitAnnotationDefault() { } @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { return new EmptyAnnotationVisitor(api); } @@ -166,14 +166,14 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean public AnnotationVisitor visitTypeAnnotation( final int typeRef, final TypePath typePath, - final String descriptor, + final @FieldDescriptor String descriptor, final boolean visible) { return new EmptyAnnotationVisitor(api); } @Override public AnnotationVisitor visitParameterAnnotation( - final int parameter, final String descriptor, final boolean visible) { + final int parameter, final @FieldDescriptor String descriptor, final boolean visible) { return new EmptyAnnotationVisitor(api); } @@ -217,7 +217,7 @@ private static class DeleteAnnotationsAdapter extends ClassVisitor { } @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { return null; } @@ -225,7 +225,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean public AnnotationVisitor visitTypeAnnotation( final int typeRef, final TypePath typePath, - final String descriptor, + final @FieldDescriptor String descriptor, final boolean visible) { return null; } @@ -233,10 +233,10 @@ public AnnotationVisitor visitTypeAnnotation( @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { return new MethodVisitor( api, super.visitMethod(access, name, descriptor, signature, exceptions)) { @@ -246,7 +246,7 @@ public AnnotationVisitor visitAnnotationDefault() { } @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { return null; } @@ -254,14 +254,14 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean public AnnotationVisitor visitTypeAnnotation( final int typeRef, final TypePath typePath, - final String descriptor, + final @FieldDescriptor String descriptor, final boolean visible) { return null; } @Override public AnnotationVisitor visitParameterAnnotation( - final int parameter, final String descriptor, final boolean visible) { + final int parameter, final @FieldDescriptor String descriptor, final boolean visible) { return null; } diff --git a/asm/src/test/java/org/objectweb/asm/ClassReaderTest.java b/asm/src/test/java/org/objectweb/asm/ClassReaderTest.java index 10d39b4c..98fc4bca 100644 --- a/asm/src/test/java/org/objectweb/asm/ClassReaderTest.java +++ b/asm/src/test/java/org/objectweb/asm/ClassReaderTest.java @@ -160,10 +160,10 @@ void testByteArrayConstructor_withOffset( public void visit( final int version, final int access, - final String name, + final @InternalForm String name, final String signature, - final String superName, - final String[] interfaces) { + final @InternalForm String superName, + final @InternalForm String @Nullable [] interfaces) { classVersion.set(version); } }, @@ -377,16 +377,16 @@ void testAccept_emptyVisitor_skipFieldMethodAndModuleContent( public void visit( final int version, final int access, - final String name, + final @InternalForm String name, final String signature, - final String superName, - final String[] interfaces) { + final @InternalForm String superName, + final @InternalForm String @Nullable [] interfaces) { // access may contain ACC_RECORD } @Override public ModuleVisitor visitModule( - final String name, final int access, final String version) { + final @DotSeparatedIdentifiers String name, final int access, final String version) { return null; } @@ -399,8 +399,8 @@ public RecordComponentVisitor visitRecordComponent( @Override public FieldVisitor visitField( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @FieldDescriptor String descriptor, final String signature, final Object value) { return null; @@ -409,21 +409,21 @@ public FieldVisitor visitField( @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { return null; } @Override - public void visitNestHost(final String nestHost) {} + public void visitNestHost(final @InternalForm String nestHost) {} @Override - public void visitNestMember(final String nestMember) {} + public void visitNestMember(final @InternalForm String nestMember) {} @Override - public void visitPermittedSubclass(final String permittedSubclass) {} + public void visitPermittedSubclass(final @InternalForm String permittedSubclass) {} }; Executable accept = () -> classReader.accept(classVisitor, 0); @@ -496,7 +496,7 @@ void testAccept_defaultAnnotationFieldMethodAndModuleVisitors( new EmptyClassVisitor(apiParameter.value()) { @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { return new AnnotationVisitor(api) {}; } @@ -504,14 +504,14 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean public AnnotationVisitor visitTypeAnnotation( final int typeRef, final TypePath typePath, - final String descriptor, + final @FieldDescriptor String descriptor, final boolean visible) { return new AnnotationVisitor(api) {}; } @Override public ModuleVisitor visitModule( - final String name, final int access, final String version) { + final @DotSeparatedIdentifiers String name, final int access, final String version) { super.visitModule(name, access, version); return new ModuleVisitor(api) {}; } @@ -523,7 +523,7 @@ public RecordComponentVisitor visitRecordComponent( return new RecordComponentVisitor(api) { @Override public AnnotationVisitor visitAnnotation( - final String descriptor, final boolean visible) { + final @FieldDescriptor String descriptor, final boolean visible) { return new AnnotationVisitor(api) {}; } @@ -531,7 +531,7 @@ public AnnotationVisitor visitAnnotation( public AnnotationVisitor visitTypeAnnotation( final int typeRef, final TypePath typePath, - final String descriptor, + final @FieldDescriptor String descriptor, final boolean visible) { return new AnnotationVisitor(api) {}; } @@ -541,8 +541,8 @@ public AnnotationVisitor visitTypeAnnotation( @Override public FieldVisitor visitField( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @FieldDescriptor String descriptor, final String signature, final Object value) { return new FieldVisitor(api) {}; @@ -551,10 +551,10 @@ public FieldVisitor visitField( @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { return new MethodVisitor(api) {}; } }; @@ -580,14 +580,14 @@ void testAccept_parameterAnnotationIndices() { @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { return new MethodVisitor(api, null) { @Override public AnnotationVisitor visitParameterAnnotation( - final int parameter, final String descriptor, final boolean visible) { + final int parameter, final @FieldDescriptor String descriptor, final boolean visible) { if (descriptor.equals("Ljava/lang/Deprecated;")) { parameterIndex.set(parameter); } @@ -616,10 +616,10 @@ void testAccept_previewClass() { public void visit( final int version, final int access, - final String name, + final @InternalForm String name, final String signature, - final String superName, - final String[] interfaces) { + final @InternalForm String superName, + final @InternalForm String @Nullable [] interfaces) { classVersion.set(version); } }; @@ -635,7 +635,7 @@ private static class EmptyClassVisitor extends ClassVisitor { new AnnotationVisitor(api) { @Override - public AnnotationVisitor visitAnnotation(final String name, final String descriptor) { + public AnnotationVisitor visitAnnotation(final @Identifier String name, final @FieldDescriptor String descriptor) { return this; } @@ -650,7 +650,7 @@ public AnnotationVisitor visitArray(final String name) { } @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { return annotationVisitor; } @@ -658,7 +658,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean public AnnotationVisitor visitTypeAnnotation( final int typeRef, final TypePath typePath, - final String descriptor, + final @FieldDescriptor String descriptor, final boolean visible) { return annotationVisitor; } @@ -666,14 +666,14 @@ public AnnotationVisitor visitTypeAnnotation( @Override public FieldVisitor visitField( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @FieldDescriptor String descriptor, final String signature, final Object value) { return new FieldVisitor(api) { @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { return annotationVisitor; } @@ -681,7 +681,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean public AnnotationVisitor visitTypeAnnotation( final int typeRef, final TypePath typePath, - final String descriptor, + final @FieldDescriptor String descriptor, final boolean visible) { return annotationVisitor; } @@ -691,10 +691,10 @@ public AnnotationVisitor visitTypeAnnotation( @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { return new MethodVisitor(api) { @Override @@ -703,7 +703,7 @@ public AnnotationVisitor visitAnnotationDefault() { } @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { return annotationVisitor; } @@ -711,14 +711,14 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean public AnnotationVisitor visitTypeAnnotation( final int typeRef, final TypePath typePath, - final String descriptor, + final @FieldDescriptor String descriptor, final boolean visible) { return annotationVisitor; } @Override public AnnotationVisitor visitParameterAnnotation( - final int parameter, final String descriptor, final boolean visible) { + final int parameter, final @FieldDescriptor String descriptor, final boolean visible) { return annotationVisitor; } diff --git a/asm/src/test/java/org/objectweb/asm/ClassVisitorTest.java b/asm/src/test/java/org/objectweb/asm/ClassVisitorTest.java index 5c04868f..5baf8a5e 100644 --- a/asm/src/test/java/org/objectweb/asm/ClassVisitorTest.java +++ b/asm/src/test/java/org/objectweb/asm/ClassVisitorTest.java @@ -263,14 +263,14 @@ void testReadAndWrite_removeOptionalModuleData() { @Override public ModuleVisitor visitModule( - final String name, final int access, final String version) { + final @DotSeparatedIdentifiers String name, final int access, final String version) { return new ModuleVisitor(api, super.visitModule(name, access, version)) { @Override - public void visitMainClass(final String mainClass) {} + public void visitMainClass(final @InternalForm String mainClass) {} @Override - public void visitPackage(final String packaze) {} + public void visitPackage(final @DotSeparatedIdentifiers String packaze) {} @Override public void visitRequire( @@ -280,13 +280,13 @@ public void visitRequire( @Override public void visitExport( - final String packaze, final int access, final String... modules) { + final @DotSeparatedIdentifiers String packaze, final int access, final @DotSeparatedIdentifiers String... modules) { super.visitExport(packaze, access, (String[]) null); } @Override public void visitOpen( - final String packaze, final int access, final String... modules) { + final @DotSeparatedIdentifiers String packaze, final int access, final @DotSeparatedIdentifiers String... modules) { super.visitOpen(packaze, access, (String[]) null); } }; @@ -311,7 +311,7 @@ private static class AnnotationAdapter extends AnnotationVisitor { } @Override - public AnnotationVisitor visitAnnotation(final String name, final String descriptor) { + public AnnotationVisitor visitAnnotation(final @Identifier String name, final @FieldDescriptor String descriptor) { return new AnnotationAdapter(api, super.visitAnnotation(name, descriptor)); } @@ -328,7 +328,7 @@ private static class ClassAdapter extends ClassVisitor { } @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { return new AnnotationAdapter(api, super.visitAnnotation(descriptor, visible)); } @@ -336,7 +336,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean public AnnotationVisitor visitTypeAnnotation( final int typeRef, final TypePath typePath, - final String descriptor, + final @FieldDescriptor String descriptor, final boolean visible) { return new AnnotationAdapter( api, super.visitTypeAnnotation(typeRef, typePath, descriptor, visible)); @@ -345,8 +345,8 @@ public AnnotationVisitor visitTypeAnnotation( @Override public FieldVisitor visitField( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @FieldDescriptor String descriptor, final String signature, final Object value) { return new FieldAdapter(api, super.visitField(access, name, descriptor, signature, value)); @@ -355,16 +355,16 @@ public FieldVisitor visitField( @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { return new MethodAdapter( api, super.visitMethod(access, name, descriptor, signature, exceptions)); } @Override - public ModuleVisitor visitModule(final String name, final int access, final String version) { + public ModuleVisitor visitModule(final @DotSeparatedIdentifiers String name, final int access, final String version) { return new ModuleVisitor(api, super.visitModule(name, access, version)) {}; } } @@ -376,7 +376,7 @@ private static class FieldAdapter extends FieldVisitor { } @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { return new AnnotationAdapter(api, super.visitAnnotation(descriptor, visible)); } @@ -384,7 +384,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean public AnnotationVisitor visitTypeAnnotation( final int typeRef, final TypePath typePath, - final String descriptor, + final @FieldDescriptor String descriptor, final boolean visible) { return new AnnotationAdapter( api, super.visitTypeAnnotation(typeRef, typePath, descriptor, visible)); @@ -403,7 +403,7 @@ public AnnotationVisitor visitAnnotationDefault() { } @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { return new AnnotationAdapter(api, super.visitAnnotation(descriptor, visible)); } @@ -411,7 +411,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean public AnnotationVisitor visitTypeAnnotation( final int typeRef, final TypePath typePath, - final String descriptor, + final @FieldDescriptor String descriptor, final boolean visible) { return new AnnotationAdapter( api, super.visitTypeAnnotation(typeRef, typePath, descriptor, visible)); @@ -419,7 +419,7 @@ public AnnotationVisitor visitTypeAnnotation( @Override public AnnotationVisitor visitParameterAnnotation( - final int parameter, final String descriptor, final boolean visible) { + final int parameter, final @FieldDescriptor String descriptor, final boolean visible) { return new AnnotationAdapter( api, super.visitParameterAnnotation(parameter, descriptor, visible)); } @@ -428,7 +428,7 @@ public AnnotationVisitor visitParameterAnnotation( public AnnotationVisitor visitInsnAnnotation( final int typeRef, final TypePath typePath, - final String descriptor, + final @FieldDescriptor String descriptor, final boolean visible) { return new AnnotationAdapter( api, super.visitInsnAnnotation(typeRef, typePath, descriptor, visible)); @@ -438,7 +438,7 @@ public AnnotationVisitor visitInsnAnnotation( public AnnotationVisitor visitTryCatchAnnotation( final int typeRef, final TypePath typePath, - final String descriptor, + final @FieldDescriptor String descriptor, final boolean visible) { return new AnnotationAdapter( api, super.visitTryCatchAnnotation(typeRef, typePath, descriptor, visible)); @@ -451,7 +451,7 @@ public AnnotationVisitor visitLocalVariableAnnotation( final Label[] start, final Label[] end, final int[] index, - final String descriptor, + final @FieldDescriptor String descriptor, final boolean visible) { return new AnnotationAdapter( api, @@ -469,10 +469,10 @@ private static class ChangeExceptionAdapter extends ClassVisitor { @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { if (exceptions != null && exceptions.length > 0) { exceptions[0] = "java/lang/Throwable"; } @@ -493,10 +493,10 @@ private static class ChangeVersionAdapter extends ClassVisitor { public void visit( final int version, final int access, - final String name, + final @InternalForm String name, final String signature, - final String superName, - final String[] interfaces) { + final @InternalForm String superName, + final @InternalForm String @Nullable [] interfaces) { super.visit(newVersion, access, name, signature, superName, interfaces); } } @@ -513,10 +513,10 @@ private static class ChangeAccessAdapter extends ClassVisitor { @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { return super.visitMethod(access ^ accessFlags, name, descriptor, signature, exceptions); } } @@ -532,7 +532,7 @@ private static class RemoveAnnotationAdapter extends ClassVisitor { } @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { if (visible == visibilityValue) { return null; } @@ -543,7 +543,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean public AnnotationVisitor visitTypeAnnotation( final int typeRef, final TypePath typePath, - final String descriptor, + final @FieldDescriptor String descriptor, final boolean visible) { if (visible == visibilityValue) { return null; @@ -554,14 +554,14 @@ public AnnotationVisitor visitTypeAnnotation( @Override public FieldVisitor visitField( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @FieldDescriptor String descriptor, final String signature, final Object value) { return new FieldVisitor(api, super.visitField(access, name, descriptor, signature, value)) { @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { if (visible == visibilityValue) { return null; } @@ -572,7 +572,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean public AnnotationVisitor visitTypeAnnotation( final int typeRef, final TypePath typePath, - final String descriptor, + final @FieldDescriptor String descriptor, final boolean visible) { if (visible == visibilityValue) { return null; @@ -585,15 +585,15 @@ public AnnotationVisitor visitTypeAnnotation( @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { return new MethodVisitor( api, super.visitMethod(access, name, descriptor, signature, exceptions)) { @Override - public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) { + public AnnotationVisitor visitAnnotation(final @FieldDescriptor String descriptor, final boolean visible) { if (visible == visibilityValue) { return null; } @@ -604,7 +604,7 @@ public AnnotationVisitor visitAnnotation(final String descriptor, final boolean public AnnotationVisitor visitTypeAnnotation( final int typeRef, final TypePath typePath, - final String descriptor, + final @FieldDescriptor String descriptor, final boolean visible) { if (visible == visibilityValue) { return null; @@ -614,7 +614,7 @@ public AnnotationVisitor visitTypeAnnotation( @Override public AnnotationVisitor visitParameterAnnotation( - final int parameter, final String descriptor, final boolean visible) { + final int parameter, final @FieldDescriptor String descriptor, final boolean visible) { if (visible == visibilityValue) { return null; } @@ -674,10 +674,10 @@ public AddParameterAdapter(final ClassVisitor classVisitor) { @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { List argumentTypes = new ArrayList<>(Arrays.asList(Type.getArgumentTypes(descriptor))); argumentTypes.add(Type.INT_TYPE); Type returnType = Type.getReturnType(descriptor); diff --git a/asm/src/test/java/org/objectweb/asm/ClassWriterComputeMaxsTest.java b/asm/src/test/java/org/objectweb/asm/ClassWriterComputeMaxsTest.java index 363ff000..ee642e90 100644 --- a/asm/src/test/java/org/objectweb/asm/ClassWriterComputeMaxsTest.java +++ b/asm/src/test/java/org/objectweb/asm/ClassWriterComputeMaxsTest.java @@ -963,10 +963,10 @@ private static MethodInfo readMaxStackAndLocals(final byte[] classFile) { @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { if (name.equals("m")) { return new MethodVisitor(Opcodes.ASM5) { @Override diff --git a/asm/src/test/java/org/objectweb/asm/ClassWriterFlagsTest.java b/asm/src/test/java/org/objectweb/asm/ClassWriterFlagsTest.java index f0726d6d..e324281e 100644 --- a/asm/src/test/java/org/objectweb/asm/ClassWriterFlagsTest.java +++ b/asm/src/test/java/org/objectweb/asm/ClassWriterFlagsTest.java @@ -113,10 +113,10 @@ Maxs maxs(final String method) { @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { if (name.equals(method)) { return new MethodVisitor(Opcodes.ASM5) { @Override diff --git a/asm/src/test/java/org/objectweb/asm/ClassWriterTest.java b/asm/src/test/java/org/objectweb/asm/ClassWriterTest.java index bb9e095f..c720b567 100644 --- a/asm/src/test/java/org/objectweb/asm/ClassWriterTest.java +++ b/asm/src/test/java/org/objectweb/asm/ClassWriterTest.java @@ -341,7 +341,7 @@ void testToByteArray_constantPoolSizeTooLarge(final int constantPoolCount) { @ValueSource(ints = {65535, 65536}) void testToByteArray_methodCodeSizeTooLarge(final int methodCodeSize) { ClassWriter classWriter = newEmptyClassWriter(); - String methodName = "m"; + @Identifier String methodName = "m"; String descriptor = "()V"; MethodVisitor methodVisitor = classWriter.visitMethod(Opcodes.ACC_STATIC, methodName, descriptor, null, null); @@ -853,10 +853,10 @@ private static class DeadCodeInserter extends ClassVisitor { public void visit( final int version, final int access, - final String name, + final @InternalForm String name, final String signature, - final String superName, - final String[] interfaces) { + final @InternalForm String superName, + final @InternalForm String @Nullable [] interfaces) { className = name; // Set V1_7 version to prevent fallback to old verifier. super.visit( @@ -871,10 +871,10 @@ public void visit( @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { int seed = (className + "." + name + descriptor).hashCode(); return new MethodDeadCodeInserter( api, seed, super.visitMethod(access, name, descriptor, signature, exceptions)); @@ -910,14 +910,14 @@ public void visitVarInsn(final int opcode, final int varIndex) { } @Override - public void visitTypeInsn(final int opcode, final String type) { + public void visitTypeInsn(final int opcode, final @InternalForm String type) { super.visitTypeInsn(opcode, type); maybeInsertDeadCode(); } @Override public void visitFieldInsn( - final int opcode, final String owner, final String name, final String descriptor) { + final int opcode, final @InternalForm String owner, final @Identifier String name, final @FieldDescriptor String descriptor) { super.visitFieldInsn(opcode, owner, name, descriptor); maybeInsertDeadCode(); } @@ -925,9 +925,9 @@ public void visitFieldInsn( @Override public void visitMethodInsn( final int opcode, - final String owner, - final String name, - final String descriptor, + final @InternalForm String owner, + final @Identifier String name, + final @MethodDescriptor String descriptor, final boolean isInterface) { super.visitMethodInsn(opcode, owner, name, descriptor, isInterface); maybeInsertDeadCode(); @@ -936,7 +936,7 @@ public void visitMethodInsn( @Override public void visitInvokeDynamicInsn( final String name, - final String descriptor, + final @MethodDescriptor String descriptor, final Handle bootstrapMethodHandle, final Object... bootstrapMethodArguments) { super.visitInvokeDynamicInsn( @@ -993,7 +993,7 @@ public void visitLookupSwitchInsn(final Label dflt, final int[] keys, final Labe } @Override - public void visitMultiANewArrayInsn(final String descriptor, final int numDimensions) { + public void visitMultiANewArrayInsn(final @FieldDescriptor String descriptor, final int numDimensions) { super.visitMultiANewArrayInsn(descriptor, numDimensions); maybeInsertDeadCode(); } @@ -1034,10 +1034,10 @@ private static class ForwardJumpNopInserter extends ClassVisitor { @Override public MethodVisitor visitMethod( final int access, - final String name, - final String descriptor, + final @Identifier String name, + final @MethodDescriptor String descriptor, final String signature, - final String[] exceptions) { + final @InternalForm String @Nullable [] exceptions) { return new MethodVisitor( api, super.visitMethod(access, name, descriptor, signature, exceptions)) { private final HashSet