in sgx_demangle/src/v0.rs [910:1038]
fn print_type(&mut self) -> fmt::Result {
let tag = parse!(self, next);
if let Some(ty) = basic_type(tag) {
return self.print(ty);
}
parse!(self, push_depth);
match tag {
b'R' | b'Q' => {
self.print("&")?;
if self.eat(b'L') {
let lt = parse!(self, integer_62);
if lt != 0 {
self.print_lifetime_from_index(lt)?;
self.print(" ")?;
}
}
if tag != b'R' {
self.print("mut ")?;
}
self.print_type()?;
}
b'P' | b'O' => {
self.print("*")?;
if tag != b'P' {
self.print("mut ")?;
} else {
self.print("const ")?;
}
self.print_type()?;
}
b'A' | b'S' => {
self.print("[")?;
self.print_type()?;
if tag == b'A' {
self.print("; ")?;
self.print_const(true)?;
}
self.print("]")?;
}
b'T' => {
self.print("(")?;
let count = self.print_sep_list(Self::print_type, ", ")?;
if count == 1 {
self.print(",")?;
}
self.print(")")?;
}
b'F' => self.in_binder(|this| {
let is_unsafe = this.eat(b'U');
let abi = if this.eat(b'K') {
if this.eat(b'C') {
Some("C")
} else {
let abi = parse!(this, ident);
if abi.ascii.is_empty() || !abi.punycode.is_empty() {
invalid!(this);
}
Some(abi.ascii)
}
} else {
None
};
if is_unsafe {
this.print("unsafe ")?;
}
if let Some(abi) = abi {
this.print("extern \"")?;
// If the ABI had any `-`, they were replaced with `_`,
// so the parts between `_` have to be re-joined with `-`.
let mut parts = abi.split('_');
this.print(parts.next().unwrap())?;
for part in parts {
this.print("-")?;
this.print(part)?;
}
this.print("\" ")?;
}
this.print("fn(")?;
this.print_sep_list(Self::print_type, ", ")?;
this.print(")")?;
if this.eat(b'u') {
// Skip printing the return type if it's 'u', i.e. `()`.
} else {
this.print(" -> ")?;
this.print_type()?;
}
Ok(())
})?,
b'D' => {
self.print("dyn ")?;
self.in_binder(|this| {
this.print_sep_list(Self::print_dyn_trait, " + ")?;
Ok(())
})?;
if !self.eat(b'L') {
invalid!(self);
}
let lt = parse!(self, integer_62);
if lt != 0 {
self.print(" + ")?;
self.print_lifetime_from_index(lt)?;
}
}
b'B' => {
self.print_backref(Self::print_type)?;
}
_ => {
// Go back to the tag, so `print_path` also sees it.
let _ = self.parser.as_mut().map(|p| p.next -= 1);
self.print_path(false)?;
}
}
self.pop_depth();
Ok(())
}