Format local variable type table attribute

This commit is contained in:
ktkk 2026-07-05 20:29:06 +02:00
parent b8c63f726e
commit a8c87dc421

View file

@ -425,7 +425,20 @@ pub const AttributeInfo = union(enum) {
try local_variable.indentedFormat(w, depth, local_variable_indent + 1, constant_pool);
}
},
//.local_variable_type_table,
.local_variable_type_table => |attr| {
try w.splatByteAll(' ', depth * indent);
_ = try w.write("local_variable_type_table:\n");
var local_variable_type_indent = indent;
for (attr.local_variable_type_table, 0..) |*local_variable_type, i| {
local_variable_type_indent += 1;
defer local_variable_type_indent -= 1;
try w.splatByteAll(' ', depth * local_variable_type_indent);
try w.print("{d}:\n", .{ i });
try local_variable_type.indentedFormat(w, depth, local_variable_type_indent + 1, constant_pool);
}
},
.deprecated => {},
//.runtime_visible_annotations,
//.runtime_invisible_annotations,
@ -1218,6 +1231,46 @@ pub const LocalVariableTypeTable = struct {
name_index: u16,
signature_index: u16,
index: u16,
pub fn indentedFormat(
self: *const LocalVariableType,
w: *std.Io.Writer,
depth: usize,
indent: u8,
constant_pool: []const ?ConstantPoolInfo,
) std.Io.Writer.Error!void {
try w.splatByteAll(' ', depth * indent);
try w.print("start_pc: {d}\n", .{ self.start_pc });
try w.splatByteAll(' ', depth * indent);
try w.print("length: {d}\n", .{ self.length });
const name_ = self.name(constant_pool) catch return error.WriteFailed;
try w.splatByteAll(' ', depth * indent);
_ = try w.write("name:\n");
try name_.indentedFormat(w, depth, indent + 1, constant_pool);
const signature_ = self.signature(constant_pool) catch return error.WriteFailed;
try w.splatByteAll(' ', depth * indent);
_ = try w.write("signature:\n");
try signature_.indentedFormat(w, depth, indent + 1, constant_pool);
}
pub fn name(self: *const LocalVariableType, constant_pool: []const ?ConstantPoolInfo) ResolveError!ConstantPoolInfo {
const name_index = self.name_index - 1;
if (name_index >= constant_pool.len) return ResolveError.InvalidConstantPoolIndex;
const cp_info = constant_pool[name_index];
if (cp_info == null or @as(ConstantPoolInfo.Tag, cp_info.?) != .utf8) return ResolveError.InvalidConstantType;
return cp_info.?;
}
pub fn signature(self: *const LocalVariableType, constant_pool: []const ?ConstantPoolInfo) ResolveError!ConstantPoolInfo {
const signature_index = self.signature_index - 1;
if (signature_index >= constant_pool.len) return ResolveError.InvalidConstantPoolIndex;
const cp_info = constant_pool[signature_index];
if (cp_info == null or @as(ConstantPoolInfo.Tag, cp_info.?) != .utf8) return ResolveError.InvalidConstantType;
return cp_info.?;
}
};
pub fn parse(input: *std.Io.Reader, allocator: std.mem.Allocator) ParseError!Self {