pub fn demangle_function_name(name: &str) -> String {
let demangled = rustc_demangle::demangle(name).to_string();
if demangled != name {
demangled
} else {
name.to_string()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_demangle_v0_mangled_name() {
let mangled = "_RNvMNtNtNtCs9MAeJIiYlOV_7debtmap8analysis11attribution14change_trackerNtB2_13ChangeTracker13track_changes";
let demangled = demangle_function_name(mangled);
assert!(demangled.contains("ChangeTracker"));
assert!(demangled.contains("track_changes"));
assert!(!demangled.starts_with("_RNv"));
}
#[test]
fn test_demangle_legacy_mangled_name() {
let mangled = "_ZN3foo3barE";
let demangled = demangle_function_name(mangled);
assert!(!demangled.starts_with("_ZN") || demangled == mangled);
}
#[test]
fn test_demangle_already_demangled() {
let name = "my_module::my_function";
let result = demangle_function_name(name);
assert_eq!(result, name);
}
#[test]
fn test_demangle_simple_function() {
let name = "simple_function";
let result = demangle_function_name(name);
assert_eq!(result, name);
}
#[test]
fn test_demangle_with_generics() {
let name = "Vec<T>::push";
let result = demangle_function_name(name);
assert_eq!(result, name);
}
#[test]
fn test_demangle_empty_string() {
let result = demangle_function_name("");
assert_eq!(result, "");
}
}