package javassist.bytecode.annotation;
import java.io.IOException;
import java.io.OutputStream;
import javassist.bytecode.ConstPool;
/**
* A convenience class for constructing a
* {@code ..TypeAnnotations_attribute}.
* See the source code of the {@link javassist.bytecode.TypeAnnotationsAttribute} class.
*
* @since 3.19
*/
public class TypeAnnotationsWriter extends AnnotationsWriter {
/**
* Constructs with the given output stream.
*
* @param os the output stream.
* @param cp the constant pool.
*/
public TypeAnnotationsWriter(OutputStream os, ConstPool cp) {
super(os, cp);
}
/**
* Writes {@code num_annotations} in
* {@code Runtime(In)VisibleTypeAnnotations_attribute}.
* It must be followed by {@code num} instances of {@code type_annotation}.
*/
public void numAnnotations(int num) throws IOException {
super.numAnnotations(num);
}
/**
* Writes {@code target_type} and {@code type_parameter_target}
* of {@code target_info} union.
*/
public void typeParameterTarget(int targetType, int typeParameterIndex)
throws IOException
{
output.write(targetType);
output.write(typeParameterIndex);
}
/**
* Writes {@code target_type} and {@code supertype_target}
* of {@code target_info} union.
*/
public void supertypeTarget(int supertypeIndex)
throws IOException
{
output.write(0x10);
write16bit(supertypeIndex);
}
/**
* Writes {@code target_type} and {@code type_parameter_bound_target}
* of {@code target_info} union.
*/
public void typeParameterBoundTarget(int targetType, int typeParameterIndex, int boundIndex)
throws IOException
{
output.write(targetType);
output.write(typeParameterIndex);
output.write(boundIndex);
}
/**
* Writes {@code target_type} and {@code empty_target}
* of {@code target_info} union.
*/
public void emptyTarget(int targetType) throws IOException {
output.write(targetType);
}
/**
* Writes {@code target_type} and {@code type_parameter_target}
* of {@code target_info} union.
*/
public void formalParameterTarget(int formalParameterIndex)
throws IOException
{
output.write(0x16);
output.write(formalParameterIndex);
}
/**
* Writes {@code target_type} and {@code throws_target}
* of {@code target_info} union.
*/
public void throwsTarget(int throwsTypeIndex)
throws IOException
{
output.write(0x17);
write16bit(throwsTypeIndex);
}
/**
* Writes {@code target_type} and {@code localvar_target}
* of {@code target_info} union.
* It must be followed by {@code tableLength} calls
* to {@code localVarTargetTable}.
*/
public void localVarTarget(int targetType, int tableLength)
throws IOException
{
output.write(targetType);
write16bit(tableLength);
}
/**
* Writes an element of {@code table[]} of {@code localvar_target}
* of {@code target_info} union.
*/
public void localVarTargetTable(int startPc, int length, int index)
throws IOException
{
write16bit(startPc);
write16bit(length);
write16bit(index);
}
/**
* Writes {@code target_type} and {@code catch_target}
* of {@code target_info} union.
*/
public void catchTarget(int exceptionTableIndex)
throws IOException
{
output.write(0x42);
write16bit(exceptionTableIndex);
}
/**
* Writes {@code target_type} and {@code offset_target}
* of {@code target_info} union.
*/
public void offsetTarget(int targetType, int offset)
throws IOException
{
output.write(targetType);
write16bit(offset);
}
/**
* Writes {@code target_type} and {@code type_argument_target}
* of {@code target_info} union.
*/
public void typeArgumentTarget(int targetType, int offset, int type_argument_index)
throws IOException
{
output.write(targetType);
write16bit(offset);
output.write(type_argument_index);
}
/**
* Writes {@code path_length} of {@code type_path}.
*/
public void typePath(int pathLength) throws IOException {
output.write(pathLength);
}
/**
* Writes an element of {@code path[]} of {@code type_path}.
*/
public void typePathPath(int typePathKind, int typeArgumentIndex)
throws IOException
{
output.write(typePathKind);
output.write(typeArgumentIndex);
}
}