| Adrian Taylor | 9fc0846 | 2020-08-14 10:51:00 -0700 | [diff] [blame] | 1 | //! The CXX code generator for constructing and compiling C++ code. |
| 2 | //! |
| 3 | //! This is intended to be embedded into higher-level code generators. |
| 4 | |
| 5 | mod gen; |
| 6 | mod syntax; |
| 7 | |
| 8 | use crate::gen::Opt; |
| 9 | use proc_macro2::TokenStream; |
| 10 | |
| Adrian Taylor | 593eddb | 2020-08-21 23:46:08 -0700 | [diff] [blame] | 11 | pub use crate::gen::{Error, GeneratedCode, Result}; |
| Adrian Taylor | 9fc0846 | 2020-08-14 10:51:00 -0700 | [diff] [blame] | 12 | |
| 13 | /// Generate C++ bindings code from a Rust token stream. This should be a Rust |
| 14 | /// token stream which somewhere contains a `#[cxx::bridge] mod {}`. |
| 15 | pub fn generate_header_and_cc(rust_source: TokenStream) -> Result<GeneratedCode> { |
| 16 | gen::do_generate_from_tokens(rust_source, Opt::default()) |
| 17 | } |
| Adrian Taylor | 593eddb | 2020-08-21 23:46:08 -0700 | [diff] [blame] | 18 | |
| 19 | #[cfg(test)] |
| 20 | mod test { |
| 21 | use quote::quote; |
| 22 | |
| 23 | #[test] |
| 24 | fn test_positive() { |
| 25 | let rs = quote! { |
| 26 | #[cxx::bridge] |
| 27 | mod ffi { |
| 28 | extern "C" { |
| 29 | fn in_C(); |
| 30 | } |
| 31 | extern "Rust" { |
| 32 | fn in_rs(); |
| 33 | } |
| 34 | } |
| 35 | }; |
| 36 | let code = crate::generate_header_and_cc(rs).unwrap(); |
| 37 | assert!(code.cxx.len() > 0); |
| 38 | assert!(code.header.len() > 0); |
| 39 | } |
| 40 | |
| 41 | #[test] |
| 42 | fn test_negative() { |
| 43 | let rs = quote! {}; |
| 44 | assert!(crate::generate_header_and_cc(rs).is_err()) |
| 45 | } |
| 46 | } |