Share function link name mangling logic
diff --git a/gen/write.rs b/gen/write.rs
index 59e12ed..4df404c 100644
--- a/gen/write.rs
+++ b/gen/write.rs
@@ -2,7 +2,9 @@
 use crate::gen::{include, Opt};
 use crate::syntax::atom::Atom::{self, *};
 use crate::syntax::namespace::Namespace;
-use crate::syntax::{Api, ExternFn, ExternType, Receiver, Signature, Struct, Type, Types, Var};
+use crate::syntax::{
+    mangle, Api, ExternFn, ExternType, Receiver, Signature, Struct, Type, Types, Var,
+};
 use proc_macro2::Ident;
 use std::collections::HashMap;
 
@@ -365,15 +367,8 @@
     } else {
         write_extern_return_type_space(out, &efn.ret, types);
     }
-    let receiver_type = match &efn.receiver {
-        Some(base) => base.ident.to_string(),
-        None => "_".to_string(),
-    };
-    write!(
-        out,
-        "{}cxxbridge02${}${}(",
-        out.namespace, receiver_type, efn.ident
-    );
+    let mangled = mangle::extern_fn(&out.namespace, efn);
+    write!(out, "{}(", mangled);
     if let Some(base) = &efn.receiver {
         write!(out, "{} *self$", base.ident);
     }
@@ -519,14 +514,7 @@
 }
 
 fn write_rust_function_decl(out: &mut OutFile, efn: &ExternFn, types: &Types) {
-    let receiver_type = match &efn.receiver {
-        Some(base) => base.ident.to_string(),
-        None => "_".to_string(),
-    };
-    let link_name = format!(
-        "{}cxxbridge02${}${}",
-        out.namespace, receiver_type, efn.ident
-    );
+    let link_name = mangle::extern_fn(&out.namespace, efn);
     let indirect_call = false;
     write_rust_function_decl_impl(out, &link_name, efn, types, indirect_call);
 }
@@ -578,14 +566,7 @@
         writeln!(out, "//{}", line);
     }
     let local_name = efn.ident.to_string();
-    let receiver_type = match &efn.receiver {
-        Some(base) => base.ident.to_string(),
-        None => "_".to_string(),
-    };
-    let invoke = format!(
-        "{}cxxbridge02${}${}",
-        out.namespace, receiver_type, efn.ident
-    );
+    let invoke = mangle::extern_fn(&out.namespace, efn);
     let indirect_call = false;
     write_rust_function_shim_impl(out, &local_name, efn, types, &invoke, indirect_call);
 }