use super::*;
bitflags! {
#[derive(Default)]
pub struct FieldAccessFlags : u16 {
const PUBLIC = 0x0001;
const PRIVATE = 0x0002;
const PROTECTED = 0x0004;
const STATIC = 0x0008;
const FINAL = 0x0010;
const VOLATILE = 0x0040;
const TRANSIENT = 0x0080;
const SYNTHETIC = 0x1000;
const ENUM = 0x4000;
}
}
impl FieldAccessFlags {
pub(crate) fn read(r: &mut impl Read) -> io::Result<Self> {
Ok(Self::from_bits_truncate(read_u2(r)?))
}
}
#[derive(Clone, Copy, Debug)]
pub struct Field {
pub access_flags: FieldAccessFlags,
pub name_index: u16,
pub descriptor_index: u16,
pub attributes_count: u16,
}
impl Field {
pub(crate) fn read_except_attributes(read: &mut impl Read) -> io::Result<Self> {
Ok(Self{
access_flags: FieldAccessFlags::read(read)?,
name_index: read_u2(read)?,
descriptor_index: read_u2(read)?,
attributes_count: read_u2(read)?,
})
}
pub(crate) fn read_list_visitor(read: &mut impl Read, visitor: &mut impl Visitor) -> io::Result<()> {
let field_count = read_u2(read)?;
for field_index in 0..field_count {
let field = Field::read_except_attributes(read)?;
visitor.on_field(field_index, field);
Attribute::read_list_callback(read, field.attributes_count, |attribute_index, attribute| visitor.on_field_attribute(field_index, attribute_index, attribute))?;
}
Ok(())
}
}
pub trait Visitor {
fn on_field(&mut self, _index: u16, _field: Field) {}
fn on_field_attribute(&mut self, _field_index: u16, _attribute_index: u16, _attribute: Attribute) {}
}