blob: 0d395e3d7413d06646b673827238a2a6539d44c8 [file] [log] [blame]
David Tolnay891061b2020-04-19 22:42:33 -07001use crate::syntax::symbol::{self, Symbol};
David Tolnayb960ed22020-11-27 14:34:30 -08002use crate::syntax::{ExternFn, Pair, Types};
David Tolnay891061b2020-04-19 22:42:33 -07003use proc_macro2::Ident;
David Tolnay5ea922a2020-04-19 21:58:06 -07004
David Tolnay0f0162f2020-11-16 23:43:37 -08005const CXXBRIDGE: &str = "cxxbridge1";
David Tolnay5ea922a2020-04-19 21:58:06 -07006
7macro_rules! join {
David Tolnayad3db802020-11-27 14:45:49 -08008 ($($segment:expr),+ $(,)?) => {
9 symbol::join(&[$(&$segment),+])
David Tolnay5ea922a2020-04-19 21:58:06 -070010 };
11}
David Tolnay3caa50a2020-04-19 21:25:34 -070012
Adrian Taylorc8713432020-10-21 18:20:55 -070013pub fn extern_fn(efn: &ExternFn, types: &Types) -> Symbol {
David Tolnay5ea922a2020-04-19 21:58:06 -070014 match &efn.receiver {
Adrian Taylorc8713432020-10-21 18:20:55 -070015 Some(receiver) => {
16 let receiver_ident = types.resolve(&receiver.ty);
17 join!(
David Tolnay17a934c2020-11-02 00:40:04 -080018 efn.name.namespace,
Adrian Taylorc8713432020-10-21 18:20:55 -070019 CXXBRIDGE,
David Tolnay8faec772020-11-02 00:18:19 -080020 receiver_ident.cxx,
David Tolnayad3db802020-11-27 14:45:49 -080021 efn.name.rust,
Adrian Taylorc8713432020-10-21 18:20:55 -070022 )
23 }
David Tolnay17a934c2020-11-02 00:40:04 -080024 None => join!(efn.name.namespace, CXXBRIDGE, efn.name.rust),
David Tolnay5ea922a2020-04-19 21:58:06 -070025 }
David Tolnay891061b2020-04-19 22:42:33 -070026}
27
David Tolnayb960ed22020-11-27 14:34:30 -080028pub fn operator(receiver: &Pair, operator: &'static str) -> Symbol {
David Tolnay7da38202020-11-27 17:36:16 -080029 join!(
30 receiver.namespace,
31 CXXBRIDGE,
32 receiver.cxx,
33 "operator",
34 operator,
35 )
David Tolnayb960ed22020-11-27 14:34:30 -080036}
37
David Tolnay891061b2020-04-19 22:42:33 -070038// The C half of a function pointer trampoline.
Adrian Taylorc8713432020-10-21 18:20:55 -070039pub fn c_trampoline(efn: &ExternFn, var: &Ident, types: &Types) -> Symbol {
40 join!(extern_fn(efn, types), var, 0)
David Tolnay891061b2020-04-19 22:42:33 -070041}
42
43// The Rust half of a function pointer trampoline.
Adrian Taylorc8713432020-10-21 18:20:55 -070044pub fn r_trampoline(efn: &ExternFn, var: &Ident, types: &Types) -> Symbol {
45 join!(extern_fn(efn, types), var, 1)
David Tolnay3caa50a2020-04-19 21:25:34 -070046}