diff options
Diffstat (limited to 'src/codegen/mod.rs')
-rw-r--r-- | src/codegen/mod.rs | 86 |
1 files changed, 45 insertions, 41 deletions
diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index b30da19b..6483412e 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -38,6 +38,7 @@ use ir::ty::{Type, TypeKind}; use ir::var::Var; use quote; +use proc_macro2::{self, Term, Span}; use std::borrow::Cow; use std::cell::Cell; @@ -74,7 +75,7 @@ fn root_import(ctx: &BindgenContext, module: &Item) -> quote::Tokens { let mut tokens = quote! {}; - tokens.append_separated(path, "::"); + tokens.append_separated(path, Term::new("::", Span::call_site())); quote! { #[allow(unused_imports)] @@ -308,7 +309,7 @@ impl AppendImplicitTemplateParams for quote::Tokens { .expect("template params cannot fail to be a rust type") }); - self.append(quote! { + self.append_all(quote! { < #( #params ),* > }); } @@ -690,7 +691,7 @@ impl CodeGenerator for Type { // We prefer using `pub use` over `pub type` because of: // https://github.com/rust-lang/rust/issues/26264 - if inner_rust_type.as_str() + if inner_rust_type.to_string() .chars() .all(|c| match c { // These are the only characters allowed in simple @@ -701,19 +702,19 @@ impl CodeGenerator for Type { outer_params.is_none() && inner_item.expect_type().canonical_type(ctx).is_enum() { - tokens.append(quote! { + tokens.append_all(quote! { pub use }); let path = top_level_path(ctx, item); - tokens.append_separated(path, "::"); - tokens.append(quote! { + tokens.append_separated(path, Term::new("::", Span::call_site())); + tokens.append_all(quote! { :: #inner_rust_type as #rust_name ; }); result.push(tokens); return; } - tokens.append(quote! { + tokens.append_all(quote! { pub type #rust_name }); @@ -736,12 +737,12 @@ impl CodeGenerator for Type { .expect("type parameters can always convert to rust ty OK") }); - tokens.append(quote! { + tokens.append_all(quote! { < #( #params ),* > }); } - tokens.append(quote! { + tokens.append_all(quote! { = #inner_rust_type ; }); @@ -1058,11 +1059,11 @@ impl<'a> FieldCodegen<'a> for FieldData { self.annotations().accessor_kind().unwrap_or(accessor_kind); if is_private { - field.append(quote! { + field.append_all(quote! { #field_ident : #ty , }); } else { - field.append(quote! { + field.append_all(quote! { pub #field_ident : #ty , }); } @@ -1122,7 +1123,7 @@ impl<'a> FieldCodegen<'a> for FieldData { impl BitfieldUnit { /// Get the constructor name for this bitfield unit. fn ctor_name(&self) -> quote::Tokens { - let ctor_name = quote::Ident::new(format!("new_bitfield_{}", self.nth())); + let ctor_name = Term::new(&format!("new_bitfield_{}", self.nth()), Span::call_site()); quote! { #ctor_name } @@ -1153,7 +1154,7 @@ impl Bitfield { let width = self.width() as u8; let prefix = ctx.trait_prefix(); - ctor_impl.append(quote! { + ctor_impl.append_all(quote! { __bindgen_bitfield_unit.set( #offset, #width, @@ -1321,7 +1322,7 @@ impl<'a> FieldCodegen<'a> for Bitfield { let prefix = ctx.trait_prefix(); let getter_name = bitfield_getter_name(ctx, self); let setter_name = bitfield_setter_name(ctx, self); - let unit_field_ident = quote::Ident::new(unit_field_name); + let unit_field_ident = Term::new(unit_field_name, Span::call_site()); let bitfield_ty_item = ctx.resolve_item(self.ty()); let bitfield_ty = bitfield_ty_item.expect_type(); @@ -1726,7 +1727,7 @@ impl CodeGenerator for CompInfo { } }; - tokens.append(quote! { + tokens.append_all(quote! { #generics { #( #fields )* } @@ -1749,7 +1750,7 @@ impl CodeGenerator for CompInfo { if self.found_unknown_attr() { warn!( "Type {} has an unkown attribute that may affect layout", - canonical_ident + canonical_ident.as_str() ); } @@ -1763,7 +1764,7 @@ impl CodeGenerator for CompInfo { if ctx.options().layout_tests && !self.is_forward_declaration() { if let Some(layout) = layout { let fn_name = - format!("bindgen_test_layout_{}", canonical_ident); + format!("bindgen_test_layout_{}", canonical_ident.as_str()); let fn_name = ctx.rust_ident_raw(fn_name); let prefix = ctx.trait_prefix(); let size_of_expr = quote! { @@ -2146,7 +2147,7 @@ enum EnumBuilder<'a> { Rust { codegen_depth: usize, attrs: Vec<quote::Tokens>, - ident: quote::Ident, + ident: Term, tokens: quote::Tokens, emitted_any_variants: bool, }, @@ -2186,7 +2187,7 @@ impl<'a> EnumBuilder<'a> { enum_variation: EnumVariation, enum_codegen_depth: usize, ) -> Self { - let ident = quote::Ident::new(name); + let ident = Term::new(name, Span::call_site()); match enum_variation { EnumVariation::Bitfield => { @@ -2201,7 +2202,7 @@ impl<'a> EnumBuilder<'a> { } EnumVariation::Rust => { - let tokens = quote!{}; + let tokens = quote!(); EnumBuilder::Rust { codegen_depth: enum_codegen_depth + 1, attrs, @@ -2224,7 +2225,7 @@ impl<'a> EnumBuilder<'a> { } EnumVariation::ModuleConsts => { - let ident = quote::Ident::new(CONSTIFIED_ENUM_MODULE_REPR_NAME); + let ident = Term::new(CONSTIFIED_ENUM_MODULE_REPR_NAME, Span::call_site()); let type_definition = quote! { #( #attrs )* pub type #ident = #repr; @@ -2523,18 +2524,18 @@ impl CodeGenerator for Enum { ctx: &BindgenContext, enum_: &Type, // Only to avoid recomputing every time. - enum_canonical_name: "e::Ident, + enum_canonical_name: &Term, // May be the same as "variant" if it's because the // enum is unnamed and we still haven't seen the // value. variant_name: &str, - referenced_name: "e::Ident, + referenced_name: &Term, enum_rust_ty: quote::Tokens, result: &mut CodegenResult<'a>, ) { let constant_name = if enum_.name().is_some() { if ctx.options().prepend_enum_name { - format!("{}_{}", enum_canonical_name, variant_name) + format!("{}_{}", enum_canonical_name.as_str(), variant_name) } else { variant_name.into() } @@ -2563,7 +2564,7 @@ impl CodeGenerator for Enum { ); // A map where we keep a value -> variant relation. - let mut seen_values = HashMap::<_, quote::Ident>::new(); + let mut seen_values = HashMap::<_, Term>::new(); let enum_rust_ty = item.to_rust_ty_or_opaque(ctx, &()); let is_toplevel = item.is_toplevel(ctx); @@ -2663,12 +2664,13 @@ impl CodeGenerator for Enum { let parent_name = parent_canonical_name.as_ref().unwrap(); - quote::Ident::new( - format!( + Term::new( + &format!( "{}_{}", parent_name, - variant_name - ) + variant_name.as_str() + ), + Span::call_site() ) }; @@ -2676,14 +2678,14 @@ impl CodeGenerator for Enum { ctx, enum_ty, &ident, - mangled_name.as_ref(), + mangled_name.as_str(), &variant_name, enum_rust_ty.clone(), result, ); } - entry.insert(quote::Ident::new(variant_name)); + entry.insert(variant_name); } } } @@ -3010,10 +3012,9 @@ impl TryToRustTy for Type { }) } TypeKind::Enum(..) => { - let mut tokens = quote! {}; let path = item.namespace_aware_canonical_path(ctx); - tokens.append_separated(path.into_iter().map(quote::Ident::new), "::"); - Ok(tokens) + let path = Term::new(&path.join("::"), Span::call_site()); + Ok(quote!(#path)) } TypeKind::TemplateInstantiation(ref inst) => { inst.try_to_rust_ty(ctx, item) @@ -3135,7 +3136,7 @@ impl TryToRustTy for TemplateInstantiation { let mut ty = quote! {}; let def_path = def.namespace_aware_canonical_path(ctx); - ty.append_separated(def_path.into_iter().map(|p| ctx.rust_ident(p)), "::"); + ty.append_separated(def_path.into_iter().map(|p| ctx.rust_ident(p)), Term::new("::", Span::call_site())); let def_params = match def.self_template_params(ctx) { Some(params) => params, @@ -3348,7 +3349,7 @@ fn objc_method_codegen( let class_name = class_name .expect("Generating a class method without class name?") .to_owned(); - let expect_msg = format!("Couldn't find {}", class_name); + let expect_msg = proc_macro2::Literal::string(&format!("Couldn't find {}", class_name)); quote! { msg_send!(objc::runtime::Class::get(#class_name).expect(#expect_msg), #methods_and_args) } @@ -3474,11 +3475,12 @@ mod utils { use ir::item::{Item, ItemCanonicalPath}; use ir::ty::TypeKind; use quote; + use proc_macro2::{Term, Span}; use std::mem; pub fn prepend_bitfield_unit_type(result: &mut Vec<quote::Tokens>) { - let mut bitfield_unit_type = quote! {}; - bitfield_unit_type.append(include_str!("./bitfield_unit.rs")); + let bitfield_unit_type = Term::new(include_str!("./bitfield_unit.rs"), Span::call_site()); + let bitfield_unit_type = quote!(#bitfield_unit_type); let items = vec![bitfield_unit_type]; let old_items = mem::replace(result, items); @@ -3704,10 +3706,12 @@ mod utils { item: &Item, ctx: &BindgenContext, ) -> error::Result<quote::Tokens> { - let path = item.namespace_aware_canonical_path(ctx); + use proc_macro2::{Term, Span}; - let mut tokens = quote! {}; - tokens.append_separated(path.into_iter().map(quote::Ident::new), "::"); + let path = item.namespace_aware_canonical_path(ctx); + let path = Term::new(&path.join("::"), Span::call_site()); + let tokens = quote! {#path}; + //tokens.append_separated(path, "::"); Ok(tokens) } |