Actually good handling of the Constant Pool indecies

The code does not compile yet, because `FromCpInfo<'_>` needs to be implemented for some more types.
This commit is contained in:
nora 2021-08-25 22:04:32 +02:00
parent 5ec9260b59
commit 2a85d1fdfd
4 changed files with 188 additions and 153 deletions

View file

@ -1,4 +1,4 @@
use file_parser::{ClassFile, ParseErr};
use file_parser::ClassFile;
use std::error::Error;
use std::io::Write;
@ -16,7 +16,11 @@ pub fn display_class<W: Write>(mut w: W, class: &ClassFile) -> Result<(), Box<dy
writeln!(
w,
"class {} extends {}{} {{",
&class.this_class.get(cp)?.name_index.get(cp)?,
&class.this_class.get(cp).name_index.get(cp),
match class.super_class.maybe_get(cp) {
None => "<none>",
Some(class) => &class.name_index.get(cp),
},
if class.interfaces.len() == 0 {
"".to_string()
} else {
@ -27,22 +31,16 @@ pub fn display_class<W: Write>(mut w: W, class: &ClassFile) -> Result<(), Box<dy
.interfaces
.iter()
.map(|i| i.get(cp))
.collect::<Result<Vec<_>, ParseErr>>()?
.iter()
.map(|i| i.name_index.get(cp))
.collect::<Result<Vec<_>, ParseErr>>()?
.collect::<Vec<_>>()
.join(",")
)
},
match class.super_class.get(cp)? {
None => "<none>",
Some(class) => &class.name_index.get(cp)?,
}
)?;
writeln!(w, " Attributes:")?;
for attr in &class.attributes {
writeln!(w, " {}", &attr.attribute_name_index.get(cp)?)?;
writeln!(w, " {}", &attr.attribute_name_index.get(cp))?;
}
writeln!(w)?;
@ -51,8 +49,8 @@ pub fn display_class<W: Write>(mut w: W, class: &ClassFile) -> Result<(), Box<dy
writeln!(
w,
" {} {}",
&field.descriptor_index.get(cp)?,
&field.name_index.get(cp)?
&field.descriptor_index.get(cp),
&field.name_index.get(cp)
)?;
}
writeln!(w)?;
@ -62,8 +60,8 @@ pub fn display_class<W: Write>(mut w: W, class: &ClassFile) -> Result<(), Box<dy
writeln!(
w,
" {} {}",
&method.descriptor_index.get(cp)?,
&method.name_index.get(cp)?,
&method.descriptor_index.get(cp),
&method.name_index.get(cp),
)?;
}