1 use crate::syntax::symbol::{self, Symbol};
2 use crate::syntax::{ExternFn, Types};
3 use proc_macro2::Ident;
4 
5 const CXXBRIDGE: &str = "cxxbridge05";
6 
7 macro_rules! join {
8     ($($segment:expr),*) => {
9         symbol::join(&[$(&$segment),*])
10     };
11 }
12 
extern_fn(efn: &ExternFn, types: &Types) -> Symbol13 pub fn extern_fn(efn: &ExternFn, types: &Types) -> Symbol {
14     match &efn.receiver {
15         Some(receiver) => {
16             let receiver_ident = types.resolve(&receiver.ty);
17             join!(
18                 efn.name.namespace,
19                 CXXBRIDGE,
20                 receiver_ident.cxx,
21                 efn.name.rust
22             )
23         }
24         None => join!(efn.name.namespace, CXXBRIDGE, efn.name.rust),
25     }
26 }
27 
28 // The C half of a function pointer trampoline.
c_trampoline(efn: &ExternFn, var: &Ident, types: &Types) -> Symbol29 pub fn c_trampoline(efn: &ExternFn, var: &Ident, types: &Types) -> Symbol {
30     join!(extern_fn(efn, types), var, 0)
31 }
32 
33 // The Rust half of a function pointer trampoline.
r_trampoline(efn: &ExternFn, var: &Ident, types: &Types) -> Symbol34 pub fn r_trampoline(efn: &ExternFn, var: &Ident, types: &Types) -> Symbol {
35     join!(extern_fn(efn, types), var, 1)
36 }
37