133d722a9Sopenharmony_ci// Functionality that is shared between the cxxbridge macro and the cmd.
233d722a9Sopenharmony_ci
333d722a9Sopenharmony_cipub mod atom;
433d722a9Sopenharmony_cipub mod attrs;
533d722a9Sopenharmony_cipub mod cfg;
633d722a9Sopenharmony_cipub mod check;
733d722a9Sopenharmony_cipub mod derive;
833d722a9Sopenharmony_cimod discriminant;
933d722a9Sopenharmony_cimod doc;
1033d722a9Sopenharmony_cipub mod error;
1133d722a9Sopenharmony_cipub mod file;
1233d722a9Sopenharmony_cipub mod ident;
1333d722a9Sopenharmony_cimod impls;
1433d722a9Sopenharmony_cimod improper;
1533d722a9Sopenharmony_cipub mod instantiate;
1633d722a9Sopenharmony_cipub mod mangle;
1733d722a9Sopenharmony_cipub mod map;
1833d722a9Sopenharmony_cimod names;
1933d722a9Sopenharmony_cipub mod namespace;
2033d722a9Sopenharmony_cimod parse;
2133d722a9Sopenharmony_cimod pod;
2233d722a9Sopenharmony_cipub mod qualified;
2333d722a9Sopenharmony_cipub mod report;
2433d722a9Sopenharmony_cipub mod resolve;
2533d722a9Sopenharmony_cipub mod set;
2633d722a9Sopenharmony_cipub mod symbol;
2733d722a9Sopenharmony_cimod tokens;
2833d722a9Sopenharmony_cimod toposort;
2933d722a9Sopenharmony_cipub mod trivial;
3033d722a9Sopenharmony_cipub mod types;
3133d722a9Sopenharmony_cimod visit;
3233d722a9Sopenharmony_ci
3333d722a9Sopenharmony_ciuse self::attrs::OtherAttrs;
3433d722a9Sopenharmony_ciuse self::cfg::CfgExpr;
3533d722a9Sopenharmony_ciuse self::namespace::Namespace;
3633d722a9Sopenharmony_ciuse self::parse::kw;
3733d722a9Sopenharmony_ciuse self::symbol::Symbol;
3833d722a9Sopenharmony_ciuse proc_macro2::{Ident, Span};
3933d722a9Sopenharmony_ciuse syn::punctuated::Punctuated;
4033d722a9Sopenharmony_ciuse syn::token::{Brace, Bracket, Paren};
4133d722a9Sopenharmony_ciuse syn::{Attribute, Expr, Generics, Lifetime, LitInt, Token, Type as RustType};
4233d722a9Sopenharmony_ci
4333d722a9Sopenharmony_cipub use self::atom::Atom;
4433d722a9Sopenharmony_cipub use self::derive::{Derive, Trait};
4533d722a9Sopenharmony_cipub use self::discriminant::Discriminant;
4633d722a9Sopenharmony_cipub use self::doc::Doc;
4733d722a9Sopenharmony_cipub use self::names::ForeignName;
4833d722a9Sopenharmony_cipub use self::parse::parse_items;
4933d722a9Sopenharmony_cipub use self::types::Types;
5033d722a9Sopenharmony_ci
5133d722a9Sopenharmony_cipub enum Api {
5233d722a9Sopenharmony_ci    Include(Include),
5333d722a9Sopenharmony_ci    Struct(Struct),
5433d722a9Sopenharmony_ci    Enum(Enum),
5533d722a9Sopenharmony_ci    CxxType(ExternType),
5633d722a9Sopenharmony_ci    CxxFunction(ExternFn),
5733d722a9Sopenharmony_ci    RustType(ExternType),
5833d722a9Sopenharmony_ci    RustFunction(ExternFn),
5933d722a9Sopenharmony_ci    TypeAlias(TypeAlias),
6033d722a9Sopenharmony_ci    Impl(Impl),
6133d722a9Sopenharmony_ci}
6233d722a9Sopenharmony_ci
6333d722a9Sopenharmony_cipub struct Include {
6433d722a9Sopenharmony_ci    pub cfg: CfgExpr,
6533d722a9Sopenharmony_ci    pub path: String,
6633d722a9Sopenharmony_ci    pub kind: IncludeKind,
6733d722a9Sopenharmony_ci    pub begin_span: Span,
6833d722a9Sopenharmony_ci    pub end_span: Span,
6933d722a9Sopenharmony_ci}
7033d722a9Sopenharmony_ci
7133d722a9Sopenharmony_ci/// Whether to emit `#include "path"` or `#include <path>`.
7233d722a9Sopenharmony_ci#[derive(Copy, Clone, PartialEq, Debug)]
7333d722a9Sopenharmony_cipub enum IncludeKind {
7433d722a9Sopenharmony_ci    /// `#include "quoted/path/to"`
7533d722a9Sopenharmony_ci    Quoted,
7633d722a9Sopenharmony_ci    /// `#include <bracketed/path/to>`
7733d722a9Sopenharmony_ci    Bracketed,
7833d722a9Sopenharmony_ci}
7933d722a9Sopenharmony_ci
8033d722a9Sopenharmony_cipub struct ExternType {
8133d722a9Sopenharmony_ci    pub cfg: CfgExpr,
8233d722a9Sopenharmony_ci    pub lang: Lang,
8333d722a9Sopenharmony_ci    pub doc: Doc,
8433d722a9Sopenharmony_ci    pub derives: Vec<Derive>,
8533d722a9Sopenharmony_ci    pub attrs: OtherAttrs,
8633d722a9Sopenharmony_ci    pub visibility: Token![pub],
8733d722a9Sopenharmony_ci    pub type_token: Token![type],
8833d722a9Sopenharmony_ci    pub name: Pair,
8933d722a9Sopenharmony_ci    pub generics: Lifetimes,
9033d722a9Sopenharmony_ci    pub colon_token: Option<Token![:]>,
9133d722a9Sopenharmony_ci    pub bounds: Vec<Derive>,
9233d722a9Sopenharmony_ci    pub semi_token: Token![;],
9333d722a9Sopenharmony_ci    pub trusted: bool,
9433d722a9Sopenharmony_ci}
9533d722a9Sopenharmony_ci
9633d722a9Sopenharmony_cipub struct Struct {
9733d722a9Sopenharmony_ci    pub cfg: CfgExpr,
9833d722a9Sopenharmony_ci    pub doc: Doc,
9933d722a9Sopenharmony_ci    pub derives: Vec<Derive>,
10033d722a9Sopenharmony_ci    pub attrs: OtherAttrs,
10133d722a9Sopenharmony_ci    pub visibility: Token![pub],
10233d722a9Sopenharmony_ci    pub struct_token: Token![struct],
10333d722a9Sopenharmony_ci    pub name: Pair,
10433d722a9Sopenharmony_ci    pub generics: Lifetimes,
10533d722a9Sopenharmony_ci    pub brace_token: Brace,
10633d722a9Sopenharmony_ci    pub fields: Vec<Var>,
10733d722a9Sopenharmony_ci}
10833d722a9Sopenharmony_ci
10933d722a9Sopenharmony_cipub struct Enum {
11033d722a9Sopenharmony_ci    pub cfg: CfgExpr,
11133d722a9Sopenharmony_ci    pub doc: Doc,
11233d722a9Sopenharmony_ci    pub derives: Vec<Derive>,
11333d722a9Sopenharmony_ci    pub attrs: OtherAttrs,
11433d722a9Sopenharmony_ci    pub visibility: Token![pub],
11533d722a9Sopenharmony_ci    pub enum_token: Token![enum],
11633d722a9Sopenharmony_ci    pub name: Pair,
11733d722a9Sopenharmony_ci    pub generics: Lifetimes,
11833d722a9Sopenharmony_ci    pub brace_token: Brace,
11933d722a9Sopenharmony_ci    pub variants: Vec<Variant>,
12033d722a9Sopenharmony_ci    pub variants_from_header: bool,
12133d722a9Sopenharmony_ci    pub variants_from_header_attr: Option<Attribute>,
12233d722a9Sopenharmony_ci    pub repr: EnumRepr,
12333d722a9Sopenharmony_ci    pub explicit_repr: bool,
12433d722a9Sopenharmony_ci}
12533d722a9Sopenharmony_ci
12633d722a9Sopenharmony_cipub enum EnumRepr {
12733d722a9Sopenharmony_ci    Native {
12833d722a9Sopenharmony_ci        atom: Atom,
12933d722a9Sopenharmony_ci        repr_type: Type,
13033d722a9Sopenharmony_ci    },
13133d722a9Sopenharmony_ci    #[cfg(feature = "experimental-enum-variants-from-header")]
13233d722a9Sopenharmony_ci    Foreign {
13333d722a9Sopenharmony_ci        rust_type: syn::Path,
13433d722a9Sopenharmony_ci    },
13533d722a9Sopenharmony_ci}
13633d722a9Sopenharmony_ci
13733d722a9Sopenharmony_cipub struct ExternFn {
13833d722a9Sopenharmony_ci    pub cfg: CfgExpr,
13933d722a9Sopenharmony_ci    pub lang: Lang,
14033d722a9Sopenharmony_ci    pub doc: Doc,
14133d722a9Sopenharmony_ci    pub attrs: OtherAttrs,
14233d722a9Sopenharmony_ci    pub visibility: Token![pub],
14333d722a9Sopenharmony_ci    pub name: Pair,
14433d722a9Sopenharmony_ci    pub sig: Signature,
14533d722a9Sopenharmony_ci    pub semi_token: Token![;],
14633d722a9Sopenharmony_ci    pub trusted: bool,
14733d722a9Sopenharmony_ci}
14833d722a9Sopenharmony_ci
14933d722a9Sopenharmony_cipub struct TypeAlias {
15033d722a9Sopenharmony_ci    pub cfg: CfgExpr,
15133d722a9Sopenharmony_ci    pub doc: Doc,
15233d722a9Sopenharmony_ci    pub derives: Vec<Derive>,
15333d722a9Sopenharmony_ci    pub attrs: OtherAttrs,
15433d722a9Sopenharmony_ci    pub visibility: Token![pub],
15533d722a9Sopenharmony_ci    pub type_token: Token![type],
15633d722a9Sopenharmony_ci    pub name: Pair,
15733d722a9Sopenharmony_ci    pub generics: Lifetimes,
15833d722a9Sopenharmony_ci    pub eq_token: Token![=],
15933d722a9Sopenharmony_ci    pub ty: RustType,
16033d722a9Sopenharmony_ci    pub semi_token: Token![;],
16133d722a9Sopenharmony_ci}
16233d722a9Sopenharmony_ci
16333d722a9Sopenharmony_cipub struct Impl {
16433d722a9Sopenharmony_ci    pub cfg: CfgExpr,
16533d722a9Sopenharmony_ci    pub impl_token: Token![impl],
16633d722a9Sopenharmony_ci    pub impl_generics: Lifetimes,
16733d722a9Sopenharmony_ci    pub negative: bool,
16833d722a9Sopenharmony_ci    pub ty: Type,
16933d722a9Sopenharmony_ci    pub ty_generics: Lifetimes,
17033d722a9Sopenharmony_ci    pub brace_token: Brace,
17133d722a9Sopenharmony_ci    pub negative_token: Option<Token![!]>,
17233d722a9Sopenharmony_ci}
17333d722a9Sopenharmony_ci
17433d722a9Sopenharmony_ci#[derive(Clone, Default)]
17533d722a9Sopenharmony_cipub struct Lifetimes {
17633d722a9Sopenharmony_ci    pub lt_token: Option<Token![<]>,
17733d722a9Sopenharmony_ci    pub lifetimes: Punctuated<Lifetime, Token![,]>,
17833d722a9Sopenharmony_ci    pub gt_token: Option<Token![>]>,
17933d722a9Sopenharmony_ci}
18033d722a9Sopenharmony_ci
18133d722a9Sopenharmony_cipub struct Signature {
18233d722a9Sopenharmony_ci    pub asyncness: Option<Token![async]>,
18333d722a9Sopenharmony_ci    pub unsafety: Option<Token![unsafe]>,
18433d722a9Sopenharmony_ci    pub fn_token: Token![fn],
18533d722a9Sopenharmony_ci    pub generics: Generics,
18633d722a9Sopenharmony_ci    pub receiver: Option<Receiver>,
18733d722a9Sopenharmony_ci    pub args: Punctuated<Var, Token![,]>,
18833d722a9Sopenharmony_ci    pub ret: Option<Type>,
18933d722a9Sopenharmony_ci    pub throws: bool,
19033d722a9Sopenharmony_ci    pub paren_token: Paren,
19133d722a9Sopenharmony_ci    pub throws_tokens: Option<(kw::Result, Token![<], Token![>])>,
19233d722a9Sopenharmony_ci}
19333d722a9Sopenharmony_ci
19433d722a9Sopenharmony_cipub struct Var {
19533d722a9Sopenharmony_ci    pub cfg: CfgExpr,
19633d722a9Sopenharmony_ci    pub doc: Doc,
19733d722a9Sopenharmony_ci    pub attrs: OtherAttrs,
19833d722a9Sopenharmony_ci    pub visibility: Token![pub],
19933d722a9Sopenharmony_ci    pub name: Pair,
20033d722a9Sopenharmony_ci    pub colon_token: Token![:],
20133d722a9Sopenharmony_ci    pub ty: Type,
20233d722a9Sopenharmony_ci}
20333d722a9Sopenharmony_ci
20433d722a9Sopenharmony_cipub struct Receiver {
20533d722a9Sopenharmony_ci    pub pinned: bool,
20633d722a9Sopenharmony_ci    pub ampersand: Token![&],
20733d722a9Sopenharmony_ci    pub lifetime: Option<Lifetime>,
20833d722a9Sopenharmony_ci    pub mutable: bool,
20933d722a9Sopenharmony_ci    pub var: Token![self],
21033d722a9Sopenharmony_ci    pub ty: NamedType,
21133d722a9Sopenharmony_ci    pub colon_token: Token![:],
21233d722a9Sopenharmony_ci    pub shorthand: bool,
21333d722a9Sopenharmony_ci    pub pin_tokens: Option<(kw::Pin, Token![<], Token![>])>,
21433d722a9Sopenharmony_ci    pub mutability: Option<Token![mut]>,
21533d722a9Sopenharmony_ci}
21633d722a9Sopenharmony_ci
21733d722a9Sopenharmony_cipub struct Variant {
21833d722a9Sopenharmony_ci    pub cfg: CfgExpr,
21933d722a9Sopenharmony_ci    pub doc: Doc,
22033d722a9Sopenharmony_ci    pub attrs: OtherAttrs,
22133d722a9Sopenharmony_ci    pub name: Pair,
22233d722a9Sopenharmony_ci    pub discriminant: Discriminant,
22333d722a9Sopenharmony_ci    pub expr: Option<Expr>,
22433d722a9Sopenharmony_ci}
22533d722a9Sopenharmony_ci
22633d722a9Sopenharmony_cipub enum Type {
22733d722a9Sopenharmony_ci    Ident(NamedType),
22833d722a9Sopenharmony_ci    RustBox(Box<Ty1>),
22933d722a9Sopenharmony_ci    RustVec(Box<Ty1>),
23033d722a9Sopenharmony_ci    UniquePtr(Box<Ty1>),
23133d722a9Sopenharmony_ci    SharedPtr(Box<Ty1>),
23233d722a9Sopenharmony_ci    WeakPtr(Box<Ty1>),
23333d722a9Sopenharmony_ci    Ref(Box<Ref>),
23433d722a9Sopenharmony_ci    Ptr(Box<Ptr>),
23533d722a9Sopenharmony_ci    Str(Box<Ref>),
23633d722a9Sopenharmony_ci    CxxVector(Box<Ty1>),
23733d722a9Sopenharmony_ci    Fn(Box<Signature>),
23833d722a9Sopenharmony_ci    Void(Span),
23933d722a9Sopenharmony_ci    SliceRef(Box<SliceRef>),
24033d722a9Sopenharmony_ci    Array(Box<Array>),
24133d722a9Sopenharmony_ci}
24233d722a9Sopenharmony_ci
24333d722a9Sopenharmony_cipub struct Ty1 {
24433d722a9Sopenharmony_ci    pub name: Ident,
24533d722a9Sopenharmony_ci    pub langle: Token![<],
24633d722a9Sopenharmony_ci    pub inner: Type,
24733d722a9Sopenharmony_ci    pub rangle: Token![>],
24833d722a9Sopenharmony_ci}
24933d722a9Sopenharmony_ci
25033d722a9Sopenharmony_cipub struct Ref {
25133d722a9Sopenharmony_ci    pub pinned: bool,
25233d722a9Sopenharmony_ci    pub ampersand: Token![&],
25333d722a9Sopenharmony_ci    pub lifetime: Option<Lifetime>,
25433d722a9Sopenharmony_ci    pub mutable: bool,
25533d722a9Sopenharmony_ci    pub inner: Type,
25633d722a9Sopenharmony_ci    pub pin_tokens: Option<(kw::Pin, Token![<], Token![>])>,
25733d722a9Sopenharmony_ci    pub mutability: Option<Token![mut]>,
25833d722a9Sopenharmony_ci}
25933d722a9Sopenharmony_ci
26033d722a9Sopenharmony_cipub struct Ptr {
26133d722a9Sopenharmony_ci    pub star: Token![*],
26233d722a9Sopenharmony_ci    pub mutable: bool,
26333d722a9Sopenharmony_ci    pub inner: Type,
26433d722a9Sopenharmony_ci    pub mutability: Option<Token![mut]>,
26533d722a9Sopenharmony_ci    pub constness: Option<Token![const]>,
26633d722a9Sopenharmony_ci}
26733d722a9Sopenharmony_ci
26833d722a9Sopenharmony_cipub struct SliceRef {
26933d722a9Sopenharmony_ci    pub ampersand: Token![&],
27033d722a9Sopenharmony_ci    pub lifetime: Option<Lifetime>,
27133d722a9Sopenharmony_ci    pub mutable: bool,
27233d722a9Sopenharmony_ci    pub bracket: Bracket,
27333d722a9Sopenharmony_ci    pub inner: Type,
27433d722a9Sopenharmony_ci    pub mutability: Option<Token![mut]>,
27533d722a9Sopenharmony_ci}
27633d722a9Sopenharmony_ci
27733d722a9Sopenharmony_cipub struct Array {
27833d722a9Sopenharmony_ci    pub bracket: Bracket,
27933d722a9Sopenharmony_ci    pub inner: Type,
28033d722a9Sopenharmony_ci    pub semi_token: Token![;],
28133d722a9Sopenharmony_ci    pub len: usize,
28233d722a9Sopenharmony_ci    pub len_token: LitInt,
28333d722a9Sopenharmony_ci}
28433d722a9Sopenharmony_ci
28533d722a9Sopenharmony_ci#[derive(Copy, Clone, PartialEq)]
28633d722a9Sopenharmony_cipub enum Lang {
28733d722a9Sopenharmony_ci    Cxx,
28833d722a9Sopenharmony_ci    Rust,
28933d722a9Sopenharmony_ci}
29033d722a9Sopenharmony_ci
29133d722a9Sopenharmony_ci// An association of a defined Rust name with a fully resolved, namespace
29233d722a9Sopenharmony_ci// qualified C++ name.
29333d722a9Sopenharmony_ci#[derive(Clone)]
29433d722a9Sopenharmony_cipub struct Pair {
29533d722a9Sopenharmony_ci    pub namespace: Namespace,
29633d722a9Sopenharmony_ci    pub cxx: ForeignName,
29733d722a9Sopenharmony_ci    pub rust: Ident,
29833d722a9Sopenharmony_ci}
29933d722a9Sopenharmony_ci
30033d722a9Sopenharmony_ci// Wrapper for a type which needs to be resolved before it can be printed in
30133d722a9Sopenharmony_ci// C++.
30233d722a9Sopenharmony_ci#[derive(PartialEq, Eq, Hash)]
30333d722a9Sopenharmony_cipub struct NamedType {
30433d722a9Sopenharmony_ci    pub rust: Ident,
30533d722a9Sopenharmony_ci    pub generics: Lifetimes,
30633d722a9Sopenharmony_ci}
307