diff --git a/Cargo.lock b/Cargo.lock index 87cb28a87d..d681e77e3f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -34,7 +34,8 @@ dependencies = [ "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "shlex 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "which 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -154,10 +155,21 @@ name = "peeking_take_while" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "proc-macro2" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "quote" -version = "0.3.15" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "regex" @@ -224,6 +236,11 @@ name = "unicode-width" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "unicode-xid" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "unreachable" version = "0.1.1" @@ -285,7 +302,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1dbccc0e46f1ea47b9f17e6d67c5a96bd27030519c519c9c91327e31275a47b4" "checksum nom 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b8c256fd9471521bcb84c3cdba98921497f1a331cbc15b8030fc63b82050ce" "checksum peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" -"checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" +"checksum proc-macro2 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d1cb7aaaa4bf022ec2b14ff2f2ba1643a22f3cee88df014a85e14b392282c61d" +"checksum quote 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1eca14c727ad12702eb4b6bfb5a232287dcf8385cb8ca83a3eeaf6519c44c408" "checksum regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1731164734096285ec2a5ec7fea5248ae2f5485b3feeb0115af4fda2183b2d1b" "checksum regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad890a5eef7953f55427c50575c680c42841653abd2b028b68cd223d157f62db" "checksum shlex 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" @@ -295,6 +313,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum thread_local 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c85048c6260d17cf486ceae3282d9fb6b90be220bf5b28c400f5485ffc29f0c7" "checksum unicode-segmentation 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a8083c594e02b8ae1654ae26f0ade5158b119bd88ad0e8227a5d8fcd72407946" "checksum unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bf3a113775714a22dcb774d8ea3655c53a32debae63a063acc00a91cc586245f" +"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1f2ae5ddb18e1c92664717616dd9549dde73f539f01bd7b77c2edb2446bdff91" "checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122" "checksum vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "887b5b631c2ad01628bbbaa7dd4c869f80d3186688f8d0b6f58774fbe324988c" diff --git a/Cargo.toml b/Cargo.toml index a5214f9be1..af51e2f63c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -47,9 +47,10 @@ clap = "2" clang-sys = { version = "0.21.0", features = ["runtime", "clang_3_9"] } lazy_static = "1" peeking_take_while = "0.1.2" -quote = "0.3.15" +quote = "0.4" regex = "0.2" which = "1.0.2" +proc-macro2 = "0.2" [dependencies.env_logger] optional = true diff --git a/src/codegen/helpers.rs b/src/codegen/helpers.rs index 9905430572..ca93b51924 100644 --- a/src/codegen/helpers.rs +++ b/src/codegen/helpers.rs @@ -3,27 +3,29 @@ use ir::context::BindgenContext; use ir::layout::Layout; use quote; +use proc_macro2; use std::mem; pub mod attributes { use quote; + use proc_macro2; pub fn repr(which: &str) -> quote::Tokens { - let which = quote::Ident::new(which); + let which = proc_macro2::Term::intern(which); quote! { #[repr( #which )] } } pub fn repr_list(which_ones: &[&str]) -> quote::Tokens { - let which_ones = which_ones.iter().cloned().map(quote::Ident::new); + let which_ones = which_ones.iter().cloned().map(proc_macro2::Term::intern); quote! { #[repr( #( #which_ones ),* )] } } pub fn derives(which_ones: &[&str]) -> quote::Tokens { - let which_ones = which_ones.iter().cloned().map(quote::Ident::new); + let which_ones = which_ones.iter().cloned().map(proc_macro2::Term::intern); quote! { #[derive( #( #which_ones ),* )] } @@ -39,11 +41,8 @@ pub mod attributes { // Doc comments are already preprocessed into nice `///` formats by the // time they get here. Just make sure that we have newlines around it so // that nothing else gets wrapped into the comment. - let mut tokens = quote! {}; - tokens.append("\n"); - tokens.append(comment); - tokens.append("\n"); - tokens + let comment = proc_macro2::Literal::doccomment(&comment); + quote! {#comment} } pub fn link_name(name: &str) -> quote::Tokens { @@ -73,7 +72,7 @@ pub fn blob(layout: Layout) -> quote::Tokens { } }; - let ty_name = quote::Ident::new(ty_name); + let ty_name = proc_macro2::Term::intern(ty_name); let data_len = opaque.array_size().unwrap_or(layout.size); @@ -103,7 +102,7 @@ pub fn bitfield_unit(ctx: &BindgenContext, layout: Layout) -> quote::Tokens { let mut tokens = quote! {}; if ctx.options().enable_cxx_namespaces { - tokens.append(quote! { root:: }); + tokens.append_all(quote! { root:: }); } let align = match layout.align { @@ -114,7 +113,7 @@ pub fn bitfield_unit(ctx: &BindgenContext, layout: Layout) -> quote::Tokens { }; let size = layout.size; - tokens.append(quote! { + tokens.append_all(quote! { __BindgenBitfieldUnit<[u8; #size], #align> }); @@ -126,6 +125,7 @@ pub mod ast_ty { use ir::function::FunctionSig; use ir::ty::FloatKind; use quote; + use proc_macro2; pub fn raw_type(ctx: &BindgenContext, name: &str) -> quote::Tokens { let ident = ctx.rust_ident_raw(name); @@ -166,29 +166,25 @@ pub mod ast_ty { pub fn int_expr(val: i64) -> quote::Tokens { // Don't use quote! { #val } because that adds the type suffix. - let mut tokens = quote! {}; - tokens.append(val.to_string()); - tokens + let val = proc_macro2::Literal::integer(val); + quote!(#val) } pub fn uint_expr(val: u64) -> quote::Tokens { // Don't use quote! { #val } because that adds the type suffix. - let mut tokens = quote! {}; - tokens.append(val.to_string()); - tokens + let val = proc_macro2::Term::intern(&val.to_string()); + quote!(#val) } pub fn byte_array_expr(bytes: &[u8]) -> quote::Tokens { let mut bytes: Vec<_> = bytes.iter().cloned().collect(); bytes.push(0); - quote! { - #bytes - } + quote! { [ #(#bytes),* ] } } pub fn cstr_expr(mut string: String) -> quote::Tokens { string.push('\0'); - let b = quote::ByteStr(&string); + let b = proc_macro2::Literal::byte_string(&string.as_bytes()); quote! { #b } @@ -199,16 +195,9 @@ pub mod ast_ty { f: f64, ) -> Result { if f.is_finite() { - let mut string = f.to_string(); - - // So it gets properly recognised as a floating point constant. - if !string.contains('.') { - string.push('.'); - } + let val = proc_macro2::Literal::float(f); - let mut tokens = quote! {}; - tokens.append(string); - return Ok(tokens); + return Ok(quote!(#val)); } let prefix = ctx.trait_prefix(); diff --git a/src/codegen/impl_partialeq.rs b/src/codegen/impl_partialeq.rs index 0278380897..155f874170 100644 --- a/src/codegen/impl_partialeq.rs +++ b/src/codegen/impl_partialeq.rs @@ -4,6 +4,7 @@ use ir::context::BindgenContext; use ir::item::{IsOpaque, Item}; use ir::ty::{TypeKind, RUST_DERIVE_IN_ARRAY_LIMIT}; use quote; +use proc_macro2; /// Generate a manual implementation of `PartialEq` trait for the /// specified compound type. @@ -71,7 +72,7 @@ pub fn gen_partialeq_impl( } fn gen_field(ctx: &BindgenContext, ty_item: &Item, name: &str) -> quote::Tokens { - fn quote_equals(name_ident: quote::Ident) -> quote::Tokens { + fn quote_equals(name_ident: proc_macro2::Term) -> quote::Tokens { quote! { self.#name_ident == other.#name_ident } } diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 43a2ec0982..af202a0204 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; use std::borrow::Cow; use std::cell::Cell; @@ -75,7 +76,7 @@ fn root_import(ctx: &BindgenContext, module: &Item) -> quote::Tokens { let mut tokens = quote! {}; - tokens.append_separated(path, "::"); + tokens.append_separated(path, proc_macro2::Term::intern("::")); quote! { #[allow(unused_imports)] @@ -309,7 +310,7 @@ impl AppendImplicitTemplateParams for quote::Tokens { .expect("template params cannot fail to be a rust type") }); - self.append(quote! { + self.append_all(quote! { < #( #params ),* > }); } @@ -560,19 +561,12 @@ impl CodeGenerator for Var { attrs.push(attributes::link_name(self.name())); } - let mut tokens = quote! { - extern "C" - }; - tokens.append("{\n"); - if !attrs.is_empty() { - tokens.append_separated(attrs, "\n"); - tokens.append("\n"); - } - tokens.append("pub static mut "); - tokens.append(quote! { #canonical_ident }); - tokens.append(" : "); - tokens.append(quote! { #ty }); - tokens.append(";\n}"); + let mut tokens = quote!( + extern "C" { + #(#attrs)* + pub static mut #canonical_ident: #ty; + } + ); result.push(tokens); } @@ -692,7 +686,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 @@ -703,19 +697,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, proc_macro2::Term::intern("::")); + 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 }); @@ -738,12 +732,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 ; }); @@ -1060,11 +1054,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 , }); } @@ -1124,7 +1118,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 = proc_macro2::Term::intern(&format!("new_bitfield_{}", self.nth())); quote! { #ctor_name } @@ -1155,7 +1149,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, @@ -1323,7 +1317,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 = proc_macro2::Term::intern(unit_field_name); let bitfield_ty_item = ctx.resolve_item(self.ty()); let bitfield_ty = bitfield_ty_item.expect_type(); @@ -1728,7 +1722,7 @@ impl CodeGenerator for CompInfo { } }; - tokens.append(quote! { + tokens.append_all(quote! { #generics { #( #fields )* } @@ -1751,7 +1745,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() ); } @@ -1765,7 +1759,7 @@ impl CodeGenerator for CompInfo { if ctx.options().layout_tests { 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! { @@ -2144,6 +2138,8 @@ impl EnumVariation { /// A helper type to construct different enum variations. enum EnumBuilder<'a> { Rust { + attrs: Vec, + ident: proc_macro2::Term, tokens: quote::Tokens, emitted_any_variants: bool, }, @@ -2167,7 +2163,7 @@ impl<'a> EnumBuilder<'a> { repr: quote::Tokens, enum_variation: EnumVariation ) -> Self { - let ident = quote::Ident::new(name); + let ident = proc_macro2::Term::intern(name); match enum_variation { EnumVariation::Bitfield => { @@ -2181,12 +2177,10 @@ impl<'a> EnumBuilder<'a> { } EnumVariation::Rust => { - let mut tokens = quote! { - #( #attrs )* - pub enum #ident - }; - tokens.append("{"); + let tokens = quote!(); EnumBuilder::Rust { + attrs, + ident, tokens, emitted_any_variants: false, } @@ -2201,7 +2195,7 @@ impl<'a> EnumBuilder<'a> { } EnumVariation::ModuleConsts => { - let ident = quote::Ident::new(CONSTIFIED_ENUM_MODULE_REPR_NAME); + let ident = proc_macro2::Term::intern(CONSTIFIED_ENUM_MODULE_REPR_NAME); let type_definition = quote! { pub type #ident = #repr; }; @@ -2230,9 +2224,11 @@ impl<'a> EnumBuilder<'a> { }; match self { - EnumBuilder::Rust { tokens, emitted_any_variants: _ } => { + EnumBuilder::Rust { attrs, ident, tokens, emitted_any_variants: _ } => { let name = ctx.rust_ident(variant_name); EnumBuilder::Rust { + attrs, + ident, tokens: quote! { #tokens #name = #expr, @@ -2299,12 +2295,19 @@ impl<'a> EnumBuilder<'a> { result: &mut CodegenResult<'b>, ) -> quote::Tokens { match self { - EnumBuilder::Rust { mut tokens, emitted_any_variants } => { - if !emitted_any_variants { - tokens.append(quote! { __bindgen_cannot_repr_c_on_empty_enum = 0 }); - } - tokens.append("}"); - tokens + EnumBuilder::Rust { attrs, ident, tokens, emitted_any_variants } => { + let variants = if !emitted_any_variants { + quote!(__bindgen_cannot_repr_c_on_empty_enum = 0) + } else { + tokens + }; + + quote! ( + #( #attrs )* + pub enum #ident { + #variants + } + ) } EnumBuilder::Bitfield { canonical_name, @@ -2460,18 +2463,18 @@ impl CodeGenerator for Enum { ctx: &BindgenContext, enum_: &Type, // Only to avoid recomputing every time. - enum_canonical_name: "e::Ident, + enum_canonical_name: &proc_macro2::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: &proc_macro2::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() } @@ -2499,7 +2502,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::<_, proc_macro2::Term>::new(); let enum_rust_ty = item.to_rust_ty_or_opaque(ctx, &()); let is_toplevel = item.is_toplevel(ctx); @@ -2598,11 +2601,11 @@ impl CodeGenerator for Enum { let parent_name = parent_canonical_name.as_ref().unwrap(); - quote::Ident::new( - format!( + proc_macro2::Term::intern( + &format!( "{}_{}", parent_name, - variant_name + variant_name.as_str() ) ) }; @@ -2611,14 +2614,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); } } } @@ -2946,10 +2949,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 = proc_macro2::Term::intern(&path.join("::")); + Ok(quote!(#path)) } TypeKind::TemplateInstantiation(ref inst) => { inst.try_to_rust_ty(ctx, item) @@ -3071,7 +3073,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)), proc_macro2::Term::intern("::")); let def_params = match def.self_template_params(ctx) { Some(params) => params, @@ -3245,16 +3247,10 @@ impl CodeGenerator for Function { }; let ident = ctx.rust_ident(canonical_name); - let mut tokens = quote! { extern #abi }; - tokens.append("{\n"); - if !attributes.is_empty() { - tokens.append_separated(attributes, "\n"); - tokens.append("\n"); - } - tokens.append(quote! { + let tokens = quote!( extern #abi { + #(#attributes)* pub fn #ident ( #( #args ),* ) #ret; }); - tokens.append("\n}"); result.push(tokens); } } @@ -3290,7 +3286,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) } @@ -3416,11 +3412,12 @@ mod utils { use ir::item::{Item, ItemCanonicalPath}; use ir::ty::TypeKind; use quote; + use proc_macro2; use std::mem; pub fn prepend_bitfield_unit_type(result: &mut Vec) { - let mut bitfield_unit_type = quote! {}; - bitfield_unit_type.append(include_str!("./bitfield_unit.rs")); + let bitfield_unit_type = proc_macro2::Term::intern(include_str!("./bitfield_unit.rs")); + let bitfield_unit_type = quote!(#bitfield_unit_type); let items = vec![bitfield_unit_type]; let old_items = mem::replace(result, items); @@ -3646,10 +3643,11 @@ mod utils { item: &Item, ctx: &BindgenContext, ) -> error::Result { + use proc_macro2; let path = item.namespace_aware_canonical_path(ctx); - - let mut tokens = quote! {}; - tokens.append_separated(path.into_iter().map(quote::Ident::new), "::"); + let path = proc_macro2::Term::intern(&path.join("::")); + let tokens = quote! {#path}; + //tokens.append_separated(path, "::"); Ok(tokens) } diff --git a/src/codegen/struct_layout.rs b/src/codegen/struct_layout.rs index 32b4896506..92ba49f7db 100644 --- a/src/codegen/struct_layout.rs +++ b/src/codegen/struct_layout.rs @@ -7,6 +7,7 @@ use ir::context::BindgenContext; use ir::layout::Layout; use ir::ty::{Type, TypeKind}; use quote; +use proc_macro2; use std::cmp; use std::mem; @@ -306,7 +307,7 @@ impl<'a> StructLayoutTracker<'a> { self.padding_count += 1; - let padding_field_name = quote::Ident::new(format!("__bindgen_padding_{}", padding_count)); + let padding_field_name = proc_macro2::Term::intern(&format!("__bindgen_padding_{}", padding_count)); self.max_field_align = cmp::max(self.max_field_align, layout.align); diff --git a/src/ir/context.rs b/src/ir/context.rs index 1be14a5fe4..cddbeb2d13 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -24,7 +24,7 @@ use cexpr; use clang::{self, Cursor}; use clang_sys; use parse::ClangItemParser; -use quote; +use proc_macro2; use std::borrow::Cow; use std::cell::Cell; use std::collections::{HashMap, HashSet, hash_map}; @@ -881,7 +881,7 @@ impl BindgenContext { } /// Returns a mangled name as a rust identifier. - pub fn rust_ident(&self, name: S) -> quote::Ident + pub fn rust_ident(&self, name: S) -> proc_macro2::Term where S: AsRef { @@ -889,11 +889,11 @@ impl BindgenContext { } /// Returns a mangled name as a rust identifier. - pub fn rust_ident_raw(&self, name: T) -> quote::Ident + pub fn rust_ident_raw(&self, name: T) -> proc_macro2::Term where - T: Into + T: AsRef { - name.into() + proc_macro2::Term::intern(name.as_ref()) } /// Iterate over all items that have been defined. @@ -2321,7 +2321,7 @@ impl BindgenContext { /// Convenient method for getting the prefix to use for most traits in /// codegen depending on the `use_core` option. - pub fn trait_prefix(&self) -> quote::Ident { + pub fn trait_prefix(&self) -> proc_macro2::Term { if self.options().use_core { self.rust_ident_raw("core") } else { diff --git a/src/ir/function.rs b/src/ir/function.rs index 7b8349a221..b39c92b7c9 100644 --- a/src/ir/function.rs +++ b/src/ir/function.rs @@ -193,7 +193,7 @@ impl Abi { impl quote::ToTokens for Abi { fn to_tokens(&self, tokens: &mut quote::Tokens) { - tokens.append(match *self { + tokens.append_all(match *self { Abi::C => quote! { "C" }, Abi::Stdcall => quote! { "stdcall" }, Abi::Fastcall => quote! { "fastcall" }, diff --git a/src/ir/objc.rs b/src/ir/objc.rs index 0f72c39917..18b5197873 100644 --- a/src/ir/objc.rs +++ b/src/ir/objc.rs @@ -13,6 +13,7 @@ use clang_sys::CXCursor_ObjCInstanceMethodDecl; use clang_sys::CXCursor_ObjCProtocolDecl; use clang_sys::CXCursor_ObjCProtocolRef; use quote; +use proc_macro2; /// Objective C interface as used in TypeKind /// @@ -216,7 +217,7 @@ impl ObjCMethod { let split_name: Vec<_> = self.name .split(':') .filter(|p| !p.is_empty()) - .map(quote::Ident::new) + .map(proc_macro2::Term::intern) .collect(); // No arguments @@ -239,9 +240,10 @@ impl ObjCMethod { // Get arguments without type signatures to pass to `msg_send!` let mut args_without_types = vec![]; for arg in args.iter() { - let name_and_sig: Vec<&str> = arg.as_str().split(' ').collect(); + let arg = arg.to_string(); + let name_and_sig: Vec<&str> = arg.split(' ').collect(); let name = name_and_sig[0]; - args_without_types.push(quote::Ident::new(name)) + args_without_types.push(proc_macro2::Term::intern(name)) }; let args = split_name diff --git a/src/lib.rs b/src/lib.rs index e2dbf8b5a3..d7a1f2be96 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -23,6 +23,7 @@ extern crate lazy_static; extern crate peeking_take_while; #[macro_use] extern crate quote; +extern crate proc_macro2; extern crate regex; extern crate which; @@ -1682,7 +1683,7 @@ impl Bindings { writer.write("\n".as_bytes())?; } - let bindings = self.module.as_str().to_string(); + let bindings = self.module.to_string(); match self.rustfmt_generated_string(&bindings) { Ok(rustfmt_bindings) => { @@ -1690,7 +1691,7 @@ impl Bindings { }, Err(err) => { eprintln!("{:?}", err); - writer.write(bindings.as_str().as_bytes())?; + writer.write(bindings.as_bytes())?; }, } Ok(()) diff --git a/tests/expectations/tests/comment-indent.rs b/tests/expectations/tests/comment-indent.rs index f00b0235f8..a7705d4b65 100644 --- a/tests/expectations/tests/comment-indent.rs +++ b/tests/expectations/tests/comment-indent.rs @@ -1,9 +1,7 @@ /* automatically generated by rust-bindgen */ - #![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)] - #[allow(non_snake_case, non_camel_case_types, non_upper_case_globals)] pub mod root { #[allow(unused_imports)] @@ -111,7 +109,6 @@ pub mod root { concat!("Alignment of ", stringify!(InInlineNS)) ); } - #[repr(C)] #[derive(Debug, Default, Copy, Clone)] pub struct Bazz { diff --git a/tests/expectations/tests/derive-bitfield-method-same-name.rs b/tests/expectations/tests/derive-bitfield-method-same-name.rs index d105c58688..3bce0ff138 100644 --- a/tests/expectations/tests/derive-bitfield-method-same-name.rs +++ b/tests/expectations/tests/derive-bitfield-method-same-name.rs @@ -1,9 +1,7 @@ /* automatically generated by rust-bindgen */ - #![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)] - #[repr(C)] #[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] pub struct __BindgenBitfieldUnit @@ -83,7 +81,6 @@ where } } } - /// Because this struct have array larger than 32 items /// and --with-derive-partialeq --impl-partialeq --impl-debug is provided, /// this struct should manually implement `Debug` and `PartialEq`. diff --git a/tests/expectations/tests/libclang-3.9/constant-evaluate.rs b/tests/expectations/tests/libclang-3.9/constant-evaluate.rs index 096bc1822f..159dba7c52 100644 --- a/tests/expectations/tests/libclang-3.9/constant-evaluate.rs +++ b/tests/expectations/tests/libclang-3.9/constant-evaluate.rs @@ -16,7 +16,7 @@ pub type EasyToOverflow = ::std::os::raw::c_ulonglong; pub const k: EasyToOverflow = 2147483648; pub const k_expr: EasyToOverflow = 0; pub const BAZ: ::std::os::raw::c_longlong = 24; -pub const fuzz: f64 = 51.; +pub const fuzz: f64 = 51.0; pub const BAZZ: ::std::os::raw::c_char = 53; pub const WAT: ::std::os::raw::c_char = 0; pub const bytestring: &'static [u8; 4usize] = b"Foo\0"; diff --git a/tests/expectations/tests/libclang-4/constant-evaluate.rs b/tests/expectations/tests/libclang-4/constant-evaluate.rs index 51365df584..045710f9d7 100644 --- a/tests/expectations/tests/libclang-4/constant-evaluate.rs +++ b/tests/expectations/tests/libclang-4/constant-evaluate.rs @@ -14,7 +14,7 @@ pub type EasyToOverflow = ::std::os::raw::c_ulonglong; pub const k: EasyToOverflow = 2147483648; pub const k_expr: EasyToOverflow = 0; pub const BAZ: ::std::os::raw::c_longlong = 24; -pub const fuzz: f64 = 51.; +pub const fuzz: f64 = 51.0; pub const BAZZ: ::std::os::raw::c_char = 53; pub const WAT: ::std::os::raw::c_char = 0; pub const bytestring: &'static [u8; 4usize] = b"Foo\0"; diff --git a/tests/expectations/tests/objc_class_method.rs b/tests/expectations/tests/objc_class_method.rs index a10a1fca10..2c5a326d80 100644 --- a/tests/expectations/tests/objc_class_method.rs +++ b/tests/expectations/tests/objc_class_method.rs @@ -1,6 +1,5 @@ /* automatically generated by rust-bindgen */ - #![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)] #![cfg(target_os = "macos")] @@ -23,31 +22,31 @@ pub trait Foo { impl Foo for id { unsafe fn method() { msg_send!( - objc::runtime::Class::get("Foo").expect("Couldn't find Foo"), + objc::runtime::Class::get("Foo").expect("Couldn\'t find Foo"), method ) } unsafe fn methodWithInt_(foo: ::std::os::raw::c_int) { msg_send!( - objc::runtime::Class::get("Foo").expect("Couldn't find Foo"), + objc::runtime::Class::get("Foo").expect("Couldn\'t find Foo"), methodWithInt: foo ) } unsafe fn methodWithFoo_(foo: id) { msg_send!( - objc::runtime::Class::get("Foo").expect("Couldn't find Foo"), + objc::runtime::Class::get("Foo").expect("Couldn\'t find Foo"), methodWithFoo: foo ) } unsafe fn methodReturningInt() -> ::std::os::raw::c_int { msg_send!( - objc::runtime::Class::get("Foo").expect("Couldn't find Foo"), + objc::runtime::Class::get("Foo").expect("Couldn\'t find Foo"), methodReturningInt ) } unsafe fn methodReturningFoo() -> *mut id { msg_send!( - objc::runtime::Class::get("Foo").expect("Couldn't find Foo"), + objc::runtime::Class::get("Foo").expect("Couldn\'t find Foo"), methodReturningFoo ) } @@ -56,6 +55,6 @@ impl Foo for id { ptr: *mut ::std::os::raw::c_char, floatvalue: f32, ) { - msg_send ! ( objc :: runtime :: Class :: get ( "Foo" ) . expect ( "Couldn't find Foo" ) , methodWithArg1 : intvalue andArg2 : ptr andArg3 : floatvalue ) + msg_send ! ( objc :: runtime :: Class :: get ( "Foo" ) . expect ( "Couldn\'t find Foo" ) , methodWithArg1 : intvalue andArg2 : ptr andArg3 : floatvalue ) } } diff --git a/tests/expectations/tests/objc_method_clash.rs b/tests/expectations/tests/objc_method_clash.rs index f57951b47e..158a044391 100644 --- a/tests/expectations/tests/objc_method_clash.rs +++ b/tests/expectations/tests/objc_method_clash.rs @@ -1,6 +1,5 @@ /* automatically generated by rust-bindgen */ - #![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)] #![cfg(target_os = "macos")] @@ -18,7 +17,7 @@ impl Foo for id { } unsafe fn class_foo() { msg_send!( - objc::runtime::Class::get("Foo").expect("Couldn't find Foo"), + objc::runtime::Class::get("Foo").expect("Couldn\'t find Foo"), foo ) } diff --git a/tests/expectations/tests/objc_whitelist.rs b/tests/expectations/tests/objc_whitelist.rs index 38881ad0fe..7a6e20fc20 100644 --- a/tests/expectations/tests/objc_whitelist.rs +++ b/tests/expectations/tests/objc_whitelist.rs @@ -1,6 +1,5 @@ /* automatically generated by rust-bindgen */ - #![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)] #![cfg(target_os = "macos")] @@ -18,7 +17,7 @@ impl protocol_SomeProtocol for id { } unsafe fn protocolClassMethod() { msg_send!( - objc::runtime::Class::get("SomeProtocol").expect("Couldn't find SomeProtocol"), + objc::runtime::Class::get("SomeProtocol").expect("Couldn\'t find SomeProtocol"), protocolClassMethod ) } @@ -33,7 +32,7 @@ impl WhitelistMe for id { } unsafe fn classMethod() { msg_send!( - objc::runtime::Class::get("WhitelistMe").expect("Couldn't find WhitelistMe"), + objc::runtime::Class::get("WhitelistMe").expect("Couldn\'t find WhitelistMe"), classMethod ) }