use itertools::Itertools;
use wgsl_parse::syntax::*;
fn mangle_arg(ty: &TemplateArg) -> String {
match ty.expression.node() {
Expression::Literal(_) => {
panic!("literal template arguments mangling not implemented")
}
Expression::TypeOrIdentifier(ty) => mangle_ty(ty),
_ => panic!("invalid template argument expression type"),
}
}
fn mangle_ty(ty: &TypeExpression) -> String {
let args = ty.template_args.as_deref().unwrap_or_default();
let n1 = ty.ident.name().len();
let name = &ty.ident;
let n2 = args.len();
let args = args.iter().map(mangle_arg).format("");
format!("{n1}{name}{n2}_{args}")
}
pub fn mangle(name: &str, signature: &[TypeExpression]) -> String {
let n1 = name.len();
let n2 = signature.len();
let sig = signature.iter().map(mangle_ty).format("");
format!("_WESL{n1}{name}{n2}_{sig}")
}