use bitflags::bitflags;
mod attribute;
pub mod constant;
pub mod field;
mod header;
mod io_ext;
pub mod method;
mod version;
use io_ext::*;
pub use attribute::{Attribute};
pub use constant::{Visitor as ConstantVisitor};
pub use field::{Field, Visitor as FieldVisitor};
pub use header::{Header};
pub use method::{Method, Visitor as MethodVisitor};
pub use version::{MajorVersion};
use std::io::{self, *};
pub trait Visitor : constant::Visitor + field::Visitor + method::Visitor {
fn on_header(&mut self, _header: Header) {}
fn on_class_access_flags(&mut self, _class_access_flags: ClassAccessFlags) {}
fn on_this_class(&mut self, _this_class: u16) {}
fn on_super_class(&mut self, _super_class: u16) {}
fn on_interface(&mut self, _interface: u16) {}
fn on_class_attribute(&mut self, _attribute_index: u16, _class_attribute: Attribute) {}
}
bitflags! {
#[derive(Default)]
pub struct ClassAccessFlags : u16 {
const PUBLIC = 0x0001;
const STATIC = 0x0008;
const FINAL = 0x0010;
const SUPER = 0x0020;
const INTERFACE = 0x0200;
const ABSTRACT = 0x0400;
const SYNTHETIC = 0x1000;
const ANNOTATION = 0x2000;
const ENUM = 0x4000;
}
}
impl ClassAccessFlags {
pub(crate) fn read(r: &mut impl Read) -> io::Result<Self> {
Ok(Self::from_bits_truncate(read_u2(r)?))
}
}
pub fn read(read: &mut impl Read, visitor: &mut impl Visitor) -> io::Result<()> {
visitor.on_header(Header::read(read)?);
constant::read_pool_visitor(read, visitor)?;
visitor.on_class_access_flags(ClassAccessFlags::read(read)?);
visitor.on_this_class(read_u2(read)?);
visitor.on_super_class(read_u2(read)?);
let interfaces = read_u2(read)?;
for _ in 0..interfaces {
visitor.on_interface(read_u2(read)?);
}
Field::read_list_visitor(read, visitor)?;
Method::read_list_visitor(read, visitor)?;
let class_attribute_count = read_u2(read)?;
Attribute::read_list_callback(read, class_attribute_count, |index, attribute| visitor.on_class_attribute(index, attribute))?;
Ok(())
}