bindgen_jni/
gather_java.rs1use super::*;
2use class_file_visitor::*;
3
4use std::collections::*;
5use std::io;
6
7mod class_constants;
8pub use class_constants::*;
9
10
11
12#[derive(Clone, Debug, Default)]
13pub struct Class {
14 access_flags: ClassAccessFlags,
15 constants: ClassConstants,
16 this_class: u16,
17 super_class: u16,
18 interfaces: Vec<u16>,
19 fields: Vec<Field>,
20 methods: Vec<Method>,
21 inner_classes: BTreeMap<String, Class>,
23}
24
25impl Class {
26 pub fn new() -> Self { Default::default() }
27
28 pub fn try_read(read: &mut impl io::Read) -> io::Result<Self> {
29 let mut c = Class::new();
30 class_file_visitor::read(read, &mut c)?;
31 Ok(c)
32 }
33
34 pub fn try_read_all(mut read: impl io::Read) -> io::Result<Self> {
35 let class = Self::try_read(&mut read)?;
36 let mut last = [0u8; 1];
37 match read.read_exact(&mut last) {
38 Ok(_) => Err(io::Error::new(io::ErrorKind::InvalidData, "Expected EOF, class file continues!")),
39 Err(_) => Ok(class),
40 }
41 }
42
43 pub fn access_flags(&self) -> ClassAccessFlags { self.access_flags }
44 pub fn this_class(&self) -> ClassRef { self.constants.class(self.this_class) }
45 pub fn super_class(&self) -> Option<ClassRef> { if self.super_class == 0 { None } else { Some(self.constants.class(self.super_class)) } }
46 pub fn interfaces(&self) -> impl Iterator<Item = ClassRef> { self.interfaces.iter().map(move |i| self.constants.class(*i)) }
47 pub fn clear(&mut self) {
52 self.access_flags = ClassAccessFlags::default();
53 self.constants.0.clear();
54 self.this_class = 0;
55 self.super_class = 0;
56 self.interfaces.clear();
57 self.fields.clear();
58 self.methods.clear();
59 }
60}
61
62impl constant::Visitor for Class {
63 fn on_unused (&mut self, index: u16, value: constant::UnusedPlaceholder ) { assert_eq!(index as usize, self.constants.0.len()); self.constants.0.push(value.into()); }
64 fn on_class (&mut self, index: u16, value: constant::Class ) { assert_eq!(index as usize, self.constants.0.len()); self.constants.0.push(value.into()); }
65 fn on_field (&mut self, index: u16, value: constant::Fieldref ) { assert_eq!(index as usize, self.constants.0.len()); self.constants.0.push(value.into()); }
66 fn on_method (&mut self, index: u16, value: constant::Methodref ) { assert_eq!(index as usize, self.constants.0.len()); self.constants.0.push(value.into()); }
67 fn on_interface_method (&mut self, index: u16, value: constant::InterfaceMethodref ) { assert_eq!(index as usize, self.constants.0.len()); self.constants.0.push(value.into()); }
68 fn on_string (&mut self, index: u16, value: constant::String ) { assert_eq!(index as usize, self.constants.0.len()); self.constants.0.push(value.into()); }
69 fn on_integer (&mut self, index: u16, value: constant::Integer ) { assert_eq!(index as usize, self.constants.0.len()); self.constants.0.push(value.into()); }
70 fn on_float (&mut self, index: u16, value: constant::Float ) { assert_eq!(index as usize, self.constants.0.len()); self.constants.0.push(value.into()); }
71 fn on_long (&mut self, index: u16, value: constant::Long ) { assert_eq!(index as usize, self.constants.0.len()); self.constants.0.push(value.into()); }
72 fn on_double (&mut self, index: u16, value: constant::Double ) { assert_eq!(index as usize, self.constants.0.len()); self.constants.0.push(value.into()); }
73 fn on_name_and_tag (&mut self, index: u16, value: constant::NameAndType ) { assert_eq!(index as usize, self.constants.0.len()); self.constants.0.push(value.into()); }
74 fn on_utf8 (&mut self, index: u16, value: constant::Utf8 ) { assert_eq!(index as usize, self.constants.0.len()); self.constants.0.push(value.into()); }
75 fn on_method_handle (&mut self, index: u16, value: constant::MethodHandle ) { assert_eq!(index as usize, self.constants.0.len()); self.constants.0.push(value.into()); }
76 fn on_method_type (&mut self, index: u16, value: constant::MethodType ) { assert_eq!(index as usize, self.constants.0.len()); self.constants.0.push(value.into()); }
77 fn on_invoke_dynamic (&mut self, index: u16, value: constant::InvokeDynamic ) { assert_eq!(index as usize, self.constants.0.len()); self.constants.0.push(value.into()); }
78}
79
80impl FieldVisitor for Class {
81 fn on_field(&mut self, _index: u16, field: Field) { self.fields.push(field); }
82 fn on_field_attribute(&mut self, _field_index: u16, _attribute_index: u16, _attribute: Attribute) {}
83}
84
85impl MethodVisitor for Class {
86 fn on_method(&mut self, _index: u16, method: Method) { self.methods.push(method); }
87 fn on_method_attribute(&mut self, _method_index: u16, _attribute_index: u16, _attribute: Attribute) {}
88}
89
90impl Visitor for Class {
91 fn on_header(&mut self, _header: Header) {}
92
93 fn on_class_access_flags(&mut self, class_access_flags: ClassAccessFlags) {
96 self.access_flags = class_access_flags;
97 }
98
99 fn on_this_class(&mut self, this_class: u16) {
100 self.this_class = this_class;
101 }
102
103 fn on_super_class(&mut self, super_class: u16) {
104 self.super_class = super_class;
105
106 }
107
108 fn on_interface(&mut self, interface: u16) {
109 self.interfaces.push(interface);
110 }
111
112 fn on_class_attribute(&mut self, _attribute_index: u16, _class_attribute: Attribute) {}
116}