bindgen_jni/
gather_java.rs

1use 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    //interface_methods:  Vec<InterfaceMethod>,
22    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 fields(&self) -> impl Iterator<Item = FieldRef> { self.fields.iter().map(move |i| self.constants.field(i.field_index)) } // access_flags, name_index, descriptor_index, attributes_count
48    //pub fn methods(&self) -> impl Iterator<Item = MethodRef> { self.methods.iter().map(move |i| self.constants.method(i.method_index)) } // access_flags, name_index, descriptor_index, attributes_count
49    //pub fn interface_methods(&self) -> impl Iterator<Item = MethodRef> { self.interface_methods.iter().map(move |i| self.constants.interface_method(*i)) } // ???
50
51    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    // constant::Visitor
94
95    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    // field::Visitor
113    // method::Visitor
114
115    fn on_class_attribute(&mut self, _attribute_index: u16, _class_attribute: Attribute) {}
116}