blob: a89060d6822b81113cc09c7742a33fa1f0583e16 [file] [log] [blame]
use crate::syntax::namespace::Namespace;
use crate::syntax::{Atom, Type};
pub trait ToMangled {
fn to_mangled(&self, namespace: &Namespace) -> String;
}
impl ToMangled for Type {
fn to_mangled(&self, namespace: &Namespace) -> String {
match self {
Type::Ident(ident) => {
let mut instance = String::new();
// Do not apply namespace to built-in type
let is_user_type = Atom::from(ident).is_none();
if is_user_type {
for name in namespace {
instance += name;
instance += "$";
}
}
instance += &ident.to_string();
instance
}
Type::RustBox(ptr) => format!("rust_box${}", ptr.inner.to_mangled(namespace)),
Type::RustVec(ptr) => format!("rust_vec${}", ptr.inner.to_mangled(namespace)),
Type::UniquePtr(ptr) => format!("std$unique_ptr${}", ptr.inner.to_mangled(namespace)),
Type::CxxVector(ptr) => format!("std$vector${}", ptr.inner.to_mangled(namespace)),
_ => unimplemented!(),
}
}
}