|
| 1 | +use crate::diff::Demangler; |
| 2 | + |
| 3 | +#[cfg(feature = "demangler")] |
| 4 | +impl Demangler { |
| 5 | + pub fn demangle(&self, name: &str) -> Option<String> { |
| 6 | + match self { |
| 7 | + Demangler::Codewarrior => Self::demangle_codewarrior(name), |
| 8 | + Demangler::Msvc => Self::demangle_msvc(name), |
| 9 | + Demangler::GnuModern => Self::demangle_gnu_modern(name), |
| 10 | + Demangler::GnuV2 => Self::demangle_gnu_v2(name), |
| 11 | + Demangler::Auto => { |
| 12 | + // Try to guess |
| 13 | + if name.starts_with('?') { |
| 14 | + Self::demangle_msvc(name) |
| 15 | + } else { |
| 16 | + Self::demangle_codewarrior(name) |
| 17 | + .or_else(|| Self::demangle_gnu_v2(name)) |
| 18 | + .or_else(|| Self::demangle_gnu_modern(name)) |
| 19 | + } |
| 20 | + } |
| 21 | + } |
| 22 | + } |
| 23 | + |
| 24 | + fn demangle_codewarrior(name: &str) -> Option<String> { |
| 25 | + cwdemangle::demangle(name, &cwdemangle::DemangleOptions::default()) |
| 26 | + } |
| 27 | + |
| 28 | + fn demangle_msvc(name: &str) -> Option<String> { |
| 29 | + msvc_demangler::demangle(name, msvc_demangler::DemangleFlags::llvm()).ok() |
| 30 | + } |
| 31 | + |
| 32 | + fn demangle_gnu_modern(name: &str) -> Option<String> { |
| 33 | + cpp_demangle::Symbol::new(name) |
| 34 | + .ok() |
| 35 | + .and_then(|s| s.demangle(&cpp_demangle::DemangleOptions::default()).ok()) |
| 36 | + } |
| 37 | + |
| 38 | + fn demangle_gnu_v2(name: &str) -> Option<String> { |
| 39 | + gnuv2_demangle::demangle(name, &gnuv2_demangle::DemangleConfig::new_no_cfilt_mimics()).ok() |
| 40 | + } |
| 41 | +} |
| 42 | + |
| 43 | +#[cfg(not(feature = "demangler"))] |
| 44 | +impl Demangler { |
| 45 | + pub fn demangle(&self, _name: &str) -> Option<String> { None } |
| 46 | +} |
0 commit comments