Skip to content

Commit 373d704

Browse files
authored
Merge pull request #334 from dtolnay/kind
Touch up PR 325
2 parents 7426cc1 + 163564c commit 373d704

File tree

3 files changed

+21
-43
lines changed

3 files changed

+21
-43
lines changed

macro/src/expand.rs

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,7 @@ fn expand(ffi: Module, apis: &[Api], types: &Types) -> TokenStream {
5656
}
5757
Api::TypeAlias(alias) => {
5858
expanded.extend(expand_type_alias(alias));
59-
hidden.extend(expand_type_alias_verify(namespace, alias));
60-
let ident = &alias.ident;
61-
if types.required_trivial_aliases.contains(ident) {
62-
hidden.extend(expand_type_alias_kind_trivial_verify(alias));
63-
}
59+
hidden.extend(expand_type_alias_verify(namespace, alias, types));
6460
}
6561
}
6662
}
@@ -671,29 +667,30 @@ fn expand_type_alias(alias: &TypeAlias) -> TokenStream {
671667
}
672668
}
673669

674-
fn expand_type_alias_verify(namespace: &Namespace, alias: &TypeAlias) -> TokenStream {
670+
fn expand_type_alias_verify(
671+
namespace: &Namespace,
672+
alias: &TypeAlias,
673+
types: &Types,
674+
) -> TokenStream {
675675
let ident = &alias.ident;
676676
let type_id = type_id(namespace, ident);
677677
let begin_span = alias.type_token.span;
678678
let end_span = alias.semi_token.span;
679679
let begin = quote_spanned!(begin_span=> ::cxx::private::verify_extern_type::<);
680680
let end = quote_spanned!(end_span=> >);
681681

682-
quote! {
682+
let mut verify = quote! {
683683
const _: fn() = #begin #ident, #type_id #end;
684-
}
685-
}
686-
687-
fn expand_type_alias_kind_trivial_verify(type_alias: &TypeAlias) -> TokenStream {
688-
let ident = &type_alias.ident;
689-
let begin_span = type_alias.type_token.span;
690-
let end_span = type_alias.semi_token.span;
691-
let begin = quote_spanned!(begin_span=> ::cxx::private::verify_extern_kind::<);
692-
let end = quote_spanned!(end_span=> >);
684+
};
693685

694-
quote! {
695-
const _: fn() = #begin #ident, ::cxx::kind::Trivial #end;
686+
if types.required_trivial_aliases.contains(&alias.ident) {
687+
let begin = quote_spanned!(begin_span=> ::cxx::private::verify_extern_kind::<);
688+
verify.extend(quote! {
689+
const _: fn() = #begin #ident, ::cxx::kind::Trivial #end;
690+
});
696691
}
692+
693+
verify
697694
}
698695

699696
fn type_id(namespace: &Namespace, ident: &Ident) -> TokenStream {

src/lib.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -422,8 +422,7 @@ pub type Vector<T> = CxxVector<T>;
422422
#[doc(hidden)]
423423
pub mod private {
424424
pub use crate::cxx_vector::VectorElement;
425-
pub use crate::extern_type::verify_extern_kind;
426-
pub use crate::extern_type::verify_extern_type;
425+
pub use crate::extern_type::{verify_extern_kind, verify_extern_type};
427426
pub use crate::function::FatFunction;
428427
pub use crate::opaque::Opaque;
429428
pub use crate::result::{r#try, Result};

syntax/types.rs

Lines changed: 5 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -141,44 +141,26 @@ impl<'a> Types<'a> {
141141
// the APIs above, in case some function or struct references a type
142142
// which is declared subsequently.
143143
let mut required_trivial_aliases = Set::new();
144-
145-
fn insist_alias_types_are_trivial<'c>(
146-
required_trivial_aliases: &mut Set<&'c Ident>,
147-
aliases: &Map<&'c Ident, &'c TypeAlias>,
148-
ty: &'c Type,
149-
) {
144+
let mut insist_alias_types_are_trivial = |ty: &'a Type| {
150145
if let Type::Ident(ident) = ty {
151146
if aliases.contains_key(ident) {
152147
required_trivial_aliases.insert(ident);
153148
}
154149
}
155-
}
156-
150+
};
157151
for api in apis {
158152
match api {
159153
Api::Struct(strct) => {
160154
for field in &strct.fields {
161-
insist_alias_types_are_trivial(
162-
&mut required_trivial_aliases,
163-
&aliases,
164-
&field.ty,
165-
);
155+
insist_alias_types_are_trivial(&field.ty);
166156
}
167157
}
168158
Api::CxxFunction(efn) | Api::RustFunction(efn) => {
169159
for arg in &efn.args {
170-
insist_alias_types_are_trivial(
171-
&mut required_trivial_aliases,
172-
&aliases,
173-
&arg.ty,
174-
);
160+
insist_alias_types_are_trivial(&arg.ty);
175161
}
176162
if let Some(ret) = &efn.ret {
177-
insist_alias_types_are_trivial(
178-
&mut required_trivial_aliases,
179-
&aliases,
180-
&ret,
181-
);
163+
insist_alias_types_are_trivial(&ret);
182164
}
183165
}
184166
_ => {}

0 commit comments

Comments
 (0)