133d722a9Sopenharmony_ci//! The CXX code generator for constructing and compiling C++ code.
233d722a9Sopenharmony_ci//!
333d722a9Sopenharmony_ci//! This is intended as a mechanism for embedding the `cxx` crate into
433d722a9Sopenharmony_ci//! higher-level code generators. See [dtolnay/cxx#235] and
533d722a9Sopenharmony_ci//! [https://github.com/google/autocxx].
633d722a9Sopenharmony_ci//!
733d722a9Sopenharmony_ci//! [dtolnay/cxx#235]: https://github.com/dtolnay/cxx/issues/235
833d722a9Sopenharmony_ci//! [https://github.com/google/autocxx]: https://github.com/google/autocxx
933d722a9Sopenharmony_ci
1033d722a9Sopenharmony_ci#![doc(html_root_url = "https://docs.rs/cxx-gen/0.7.97")]
1133d722a9Sopenharmony_ci#![deny(missing_docs)]
1233d722a9Sopenharmony_ci#![allow(dead_code)]
1333d722a9Sopenharmony_ci#![allow(
1433d722a9Sopenharmony_ci    clippy::cast_sign_loss,
1533d722a9Sopenharmony_ci    clippy::default_trait_access,
1633d722a9Sopenharmony_ci    clippy::derive_partial_eq_without_eq,
1733d722a9Sopenharmony_ci    clippy::enum_glob_use,
1833d722a9Sopenharmony_ci    clippy::if_same_then_else,
1933d722a9Sopenharmony_ci    clippy::inherent_to_string,
2033d722a9Sopenharmony_ci    clippy::items_after_statements,
2133d722a9Sopenharmony_ci    clippy::match_bool,
2233d722a9Sopenharmony_ci    clippy::match_on_vec_items,
2333d722a9Sopenharmony_ci    clippy::match_same_arms,
2433d722a9Sopenharmony_ci    clippy::missing_errors_doc,
2533d722a9Sopenharmony_ci    clippy::module_name_repetitions,
2633d722a9Sopenharmony_ci    clippy::needless_pass_by_value,
2733d722a9Sopenharmony_ci    clippy::new_without_default,
2833d722a9Sopenharmony_ci    clippy::nonminimal_bool,
2933d722a9Sopenharmony_ci    clippy::option_if_let_else,
3033d722a9Sopenharmony_ci    clippy::or_fun_call,
3133d722a9Sopenharmony_ci    clippy::redundant_else,
3233d722a9Sopenharmony_ci    clippy::shadow_unrelated,
3333d722a9Sopenharmony_ci    clippy::similar_names,
3433d722a9Sopenharmony_ci    clippy::single_match_else,
3533d722a9Sopenharmony_ci    clippy::struct_excessive_bools,
3633d722a9Sopenharmony_ci    clippy::too_many_arguments,
3733d722a9Sopenharmony_ci    clippy::too_many_lines,
3833d722a9Sopenharmony_ci    clippy::toplevel_ref_arg,
3933d722a9Sopenharmony_ci    // clippy bug: https://github.com/rust-lang/rust-clippy/issues/6983
4033d722a9Sopenharmony_ci    clippy::wrong_self_convention
4133d722a9Sopenharmony_ci)]
4233d722a9Sopenharmony_ci
4333d722a9Sopenharmony_cimod error;
4433d722a9Sopenharmony_cimod gen;
4533d722a9Sopenharmony_cimod syntax;
4633d722a9Sopenharmony_ci
4733d722a9Sopenharmony_cipub use crate::error::Error;
4833d722a9Sopenharmony_cipub use crate::gen::include::{Include, HEADER};
4933d722a9Sopenharmony_cipub use crate::gen::{GeneratedCode, Opt};
5033d722a9Sopenharmony_cipub use crate::syntax::IncludeKind;
5133d722a9Sopenharmony_ciuse proc_macro2::TokenStream;
5233d722a9Sopenharmony_ci
5333d722a9Sopenharmony_ci/// Generate C++ bindings code from a Rust token stream. This should be a Rust
5433d722a9Sopenharmony_ci/// token stream which somewhere contains a `#[cxx::bridge] mod {}`.
5533d722a9Sopenharmony_cipub fn generate_header_and_cc(rust_source: TokenStream, opt: &Opt) -> Result<GeneratedCode, Error> {
5633d722a9Sopenharmony_ci    let syntax = syn::parse2(rust_source)
5733d722a9Sopenharmony_ci        .map_err(crate::gen::Error::from)
5833d722a9Sopenharmony_ci        .map_err(Error::from)?;
5933d722a9Sopenharmony_ci    gen::generate(syntax, opt).map_err(Error::from)
6033d722a9Sopenharmony_ci}
61