diff --git a/.travis.yml b/.travis.yml index 71d2239d..c06ec383 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,7 +10,7 @@ matrix: - rust: 1.15.0 env: JOB=build CARGO_FEATURES="skeptic_tests struct_default private_fields" - rust: nightly - env: JOB=build CARGO_FEATURES="skeptic_tests nightlytests logging" + env: JOB=build CARGO_FEATURES="skeptic_tests nightlytests" - rust: nightly env: JOB=style_check allow_failures: @@ -53,17 +53,21 @@ script: | # `derive_builder` crate will implicitly build/doc the # `derive_builder_core` crate too. commands=( - "cd derive_builder && travis-cargo build -- --features \"$CARGO_FEATURES\"" - "cd derive_builder && travis-cargo test -- --all --no-fail-fast --features \"$CARGO_FEATURES\"" + "cd testsuite && travis-cargo build -- --features \"$CARGO_FEATURES\"" + "cd testsuite && travis-cargo test -- --all --no-fail-fast --features \"$CARGO_FEATURES\"" "cd derive_builder && travis-cargo doc" ) ;; style_check) commands=( - "cd derive_builder_core && cargo clippy -- -Dclippy" - "cd derive_builder && cargo clippy -- -Dclippy" - "cd derive_builder_core && cargo fmt -- --write-mode diff" - "cd derive_builder && cargo fmt -- --write-mode diff" + "cd derive_builder_core && cargo clippy -- -Dclippy" + "cd derive_builder_macro && cargo clippy -- -Dclippy" + "cd derive_builder && cargo clippy -- -Dclippy" + "cd testsuite && cargo clippy -- -Dclippy" + "cd derive_builder_core && cargo fmt -- --write-mode diff" + "cd derive_builder_macro && cargo fmt -- --write-mode diff" + "cd derive_builder && cargo fmt -- --write-mode diff" + "cd testsuite && cargo fmt -- --write-mode diff" ) ;; *) diff --git a/Cargo.toml b/Cargo.toml index 2a676ea1..13123359 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,2 +1,3 @@ [workspace] -members = ["derive_builder", "derive_builder_core"] +members = ["derive_builder", "derive_builder_core", "derive_builder_macro", + "testsuite"] diff --git a/derive_builder/Cargo.toml b/derive_builder/Cargo.toml index ad9ee181..a2a27499 100644 --- a/derive_builder/Cargo.toml +++ b/derive_builder/Cargo.toml @@ -5,7 +5,6 @@ authors = ["Colin Kiegel ", "Pascal Hertleif ", "Jan-Erik Rediger ", "Ted Driggs "] - description = "Rust macro to automatically implement the builder pattern for arbitrary structs." repository = "https://github.com/colin-kiegel/rust-derive-builder" documentation = "https://docs.rs/derive_builder" @@ -14,34 +13,19 @@ license = "MIT/Apache-2.0" categories = ["development-tools", "rust-patterns"] keywords = ["derive", "macro", "builder", "setter", "struct"] readme = "README.md" -build = "build/mod.rs" [badges] travis-ci = { repository = "colin-kiegel/rust-derive-builder" } [lib] -proc-macro = true +path = "src/lib.rs" [features] -logging = [ "log", "env_logger", "derive_builder_core/logging" ] -struct_default = [] -private_fields = [] -skeptic_tests = ["skeptic"] -nightlytests = ["compiletest_rs"] +default = ["derive_builder_macro"] +logging = ["derive_builder_macro/logging"] +struct_default = ["derive_builder_macro/struct_default"] +private_fields = ["derive_builder_macro/private_fields"] +no_std = [] [dependencies] -syn = "0.11" -quote = "0.3" -log = { version = "0.3", optional = true } -env_logger = { version = "0.4", optional = true } -derive_builder_core = { version = "0.1", path = "../derive_builder_core" } -skeptic = { version = "0.9", optional = true } -compiletest_rs = { version = "0.2", optional = true } - -[build-dependencies] -skeptic = { version = "0.9", optional = true } -log = { version = "0.3", optional = true } -env_logger = { version = "0.4", optional = true } - -[dev-dependencies] -pretty_assertions = "0.1" +derive_builder_macro = { path = "../derive_builder_macro/", optional = true } diff --git a/derive_builder/src/lib.rs b/derive_builder/src/lib.rs index 1f7a1bc0..7caae456 100644 --- a/derive_builder/src/lib.rs +++ b/derive_builder/src/lib.rs @@ -519,77 +519,21 @@ //! [builder pattern]: https://aturon.github.io/ownership/builders.html //! [`derive_builder_core`]: https://crates.io/crates/derive_builder_core -#![crate_type = "proc-macro"] -#![deny(warnings)] +extern crate core; -extern crate proc_macro; -extern crate syn; +#[allow(unused_imports)] #[macro_use] -extern crate quote; -#[cfg(feature = "logging")] -#[macro_use] -extern crate log; -#[cfg(feature = "logging")] -extern crate env_logger; -extern crate derive_builder_core; - -#[cfg(not(feature = "logging"))] -#[macro_use] -mod log_disabled; -mod options; - -use proc_macro::TokenStream; -#[cfg(feature = "logging")] -use std::sync::{Once, ONCE_INIT}; -use options::{struct_options_from, field_options_from}; - -#[cfg(feature = "logging")] -static INIT_LOGGER: Once = ONCE_INIT; +extern crate derive_builder_macro; #[doc(hidden)] -#[proc_macro_derive(Builder, attributes(builder))] -pub fn derive(input: TokenStream) -> TokenStream { - #[cfg(feature = "logging")] - INIT_LOGGER.call_once(|| { - env_logger::init().unwrap(); - }); - - let input = input.to_string(); - - let ast = syn::parse_macro_input(&input).expect("Couldn't parse item"); - - let result = builder_for_struct(ast).to_string(); - debug!("generated tokens: {}", result); - - result.parse().expect(&format!("Couldn't parse `{}` to tokens", result)) -} - -fn builder_for_struct(ast: syn::MacroInput) -> quote::Tokens { - debug!("Deriving Builder for `{}`.", ast.ident); - let (opts, field_defaults) = struct_options_from(&ast); - - let fields = match ast.body { - syn::Body::Struct(syn::VariantData::Struct(fields)) => fields, - _ => panic!("`#[derive(Builder)]` can only be used with braced structs"), - }; - - let mut builder = opts.as_builder(); - let mut build_fn = opts.as_build_method(); - - builder.doc_comment(format!(include_str!("doc_tpl/builder_struct.md"), - struct_name = ast.ident.as_ref())); - build_fn.doc_comment(format!(include_str!("doc_tpl/builder_method.md"), - struct_name = ast.ident.as_ref())); +pub use derive_builder_macro::*; - for f in fields { - let f_opts = field_options_from(f, &field_defaults); - - builder.push_field(f_opts.as_builder_field()); - builder.push_setter_fn(f_opts.as_setter()); - build_fn.push_initializer(f_opts.as_initializer()); - } - - builder.push_build_fn(build_fn); - - quote!(#builder) +#[doc(hidden)] +pub mod export { + pub use ::core::clone::Clone; + pub use ::core::convert::Into; + pub use ::core::default::Default; + pub use ::core::marker::PhantomData; + pub use ::core::option::Option::{self, Some, None}; + pub use ::core::result::Result::{self, Ok, Err}; } diff --git a/derive_builder_core/src/bindings.rs b/derive_builder_core/src/bindings.rs index 78527dc1..52cc8afd 100644 --- a/derive_builder_core/src/bindings.rs +++ b/derive_builder_core/src/bindings.rs @@ -1,125 +1,52 @@ use RawTokens; /// Bindings to be used by the generated code. -#[derive(Debug, Clone, Copy, Default)] -pub struct Bindings { - /// Whether the generated code should comply with `#![no_std]`. - pub no_std: bool, +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Bindings { + /// Use the standard library. + Std, + /// Don't use the standard library. + NoStd, +} + +impl Default for Bindings { + fn default() -> Self { + Bindings::Std + } } impl Bindings { /// String type. pub fn string_ty(&self) -> RawTokens<&'static str> { - RawTokens(if self.no_std { - ":: collections :: string :: String" - } else { - ":: std :: string :: String" - }) - } - - /// Result type. - pub fn result_ty(&self) -> RawTokens<&'static str> { - RawTokens(if self.no_std { - ":: core :: result :: Result" - } else { - ":: std :: result :: Result" - }) - } - - /// Option type. - pub fn option_ty(&self) -> RawTokens<&'static str> { - RawTokens(if self.no_std { - ":: core :: option :: Option" - } else { - ":: std :: option :: Option" - }) + RawTokens(match *self { + Bindings::Std => ":: std :: string :: String", + Bindings::NoStd => ":: collections :: string :: String", + }) } - /// PhantomData type. - pub fn phantom_data_ty(&self) -> RawTokens<&'static str> { - RawTokens(if self.no_std { - ":: core :: marker :: PhantomData" - } else { - ":: std :: marker :: PhantomData" - }) - } - - /// Default trait. - pub fn default_trait(&self) -> RawTokens<&'static str> { - RawTokens(if self.no_std { - ":: core :: default :: Default" - } else { - ":: std :: default :: Default" - }) - } - - /// Clone trait. - pub fn clone_trait(&self) -> RawTokens<&'static str> { - RawTokens(if self.no_std { - ":: core :: clone :: Clone" - } else { - ":: std :: clone :: Clone" - }) - } - - /// Into trait. - pub fn into_trait(&self) -> RawTokens<&'static str> { - RawTokens(if self.no_std { - ":: core :: convert :: Into" - } else { - ":: std :: convert :: Into" - }) - } - - /// TryInto trait. + /// TryInto trait. Once `TryFrom` stabilizes, this should be removed and + /// `derive_builder::export` should export `core::convert::TryInto` directly. pub fn try_into_trait(&self) -> RawTokens<&'static str> { - RawTokens(if self.no_std { - ":: core :: convert :: TryInto" - } else { - ":: std :: convert :: TryInto" - }) + RawTokens(match *self { + Bindings::Std => ":: std :: convert :: TryInto", + Bindings::NoStd => ":: core :: convert :: TryInto", + }) } } #[test] fn std() { - let b = Bindings { no_std: false }; + let b = Bindings::Std; assert_eq!(b.string_ty().to_tokens(), quote!(::std::string::String)); - - assert_eq!(b.result_ty().to_tokens(), quote!(::std::result::Result)); - - assert_eq!(b.option_ty().to_tokens(), quote!(::std::option::Option)); - - assert_eq!(b.phantom_data_ty().to_tokens(), - quote!(::std::marker::PhantomData)); - - assert_eq!(b.default_trait().to_tokens(), - quote!(::std::default::Default)); - - assert_eq!(b.clone_trait().to_tokens(), quote!(::std::clone::Clone)); - - assert_eq!(b.into_trait().to_tokens(), quote!(::std::convert::Into)); + assert_eq!(b.try_into_trait().to_tokens(), quote!(::std::convert::TryInto)); } #[test] fn no_std() { - let b = Bindings { no_std: true }; + let b = Bindings::NoStd; assert_eq!(b.string_ty().to_tokens(), quote!(::collections::string::String)); - - assert_eq!(b.result_ty().to_tokens(), quote!(::core::result::Result)); - - assert_eq!(b.option_ty().to_tokens(), quote!(::core::option::Option)); - - assert_eq!(b.phantom_data_ty().to_tokens(), - quote!(::core::marker::PhantomData)); - - assert_eq!(b.default_trait().to_tokens(), - quote!(::core::default::Default)); - - assert_eq!(b.clone_trait().to_tokens(), quote!(::core::clone::Clone)); - - assert_eq!(b.into_trait().to_tokens(), quote!(::core::convert::Into)); + assert_eq!(b.try_into_trait().to_tokens(), quote!(::core::convert::TryInto)); } diff --git a/derive_builder_core/src/build_method.rs b/derive_builder_core/src/build_method.rs index b6448759..8fc7ffcb 100644 --- a/derive_builder_core/src/build_method.rs +++ b/derive_builder_core/src/build_method.rs @@ -25,8 +25,8 @@ use DEFAULT_STRUCT_NAME; /// # let build_method = default_build_method!(); /// # /// # assert_eq!(quote!(#build_method), quote!( -/// pub fn build(&self) -> ::std::result::Result { -/// Ok(Foo { +/// pub fn build(&self) -> ::derive_builder::export::Result { +/// ::derive_builder::export::Ok(Foo { /// foo: self.foo, /// }) /// } @@ -86,7 +86,6 @@ impl<'a> ToTokens for BuildMethod<'a> { let validate_fn = self.validate_fn .as_ref() .map(|vfn| quote!(#vfn(&self)?;)); - let result = self.bindings.result_ty(); let string = self.bindings.string_ty(); if self.enabled { @@ -94,11 +93,11 @@ impl<'a> ToTokens for BuildMethod<'a> { tokens.append(quote!( #doc_comment #vis fn #ident(#self_param) - -> #result<#target_ty #target_ty_generics, #string> + -> ::derive_builder::export::Result<#target_ty #target_ty_generics, #string> { #validate_fn #default_struct - Ok(#target_ty { + ::derive_builder::export::Ok(#target_ty { #(#initializers)* }) } @@ -159,8 +158,8 @@ mod tests { let build_method = default_build_method!(); assert_eq!(quote!(#build_method), quote!( - pub fn build(&self) -> ::std::result::Result { - Ok(Foo { + pub fn build(&self) -> ::derive_builder::export::Result { + ::derive_builder::export::Ok(Foo { foo: self.foo, }) } @@ -170,11 +169,11 @@ mod tests { #[test] fn no_std() { let mut build_method = default_build_method!(); - build_method.bindings.no_std = true; + build_method.bindings = Bindings::NoStd; assert_eq!(quote!(#build_method), quote!( - pub fn build(&self) -> ::core::result::Result { - Ok(Foo { + pub fn build(&self) -> ::derive_builder::export::Result { + ::derive_builder::export::Ok(Foo { foo: self.foo, }) } @@ -187,9 +186,9 @@ mod tests { build_method.default_struct = Some("Default::default()".parse().unwrap()); assert_eq!(quote!(#build_method), quote!( - pub fn build(&self) -> ::std::result::Result { + pub fn build(&self) -> ::derive_builder::export::Result { let __default: Foo = {Default::default()}; - Ok(Foo { + ::derive_builder::export::Ok(Foo { foo: self.foo, }) } @@ -212,8 +211,8 @@ mod tests { build_method.ident = &ident; assert_eq!(quote!(#build_method), quote!( - pub fn finish(&self) -> ::std::result::Result { - Ok(Foo { + pub fn finish(&self) -> ::derive_builder::export::Result { + ::derive_builder::export::Ok(Foo { foo: self.foo, }) } @@ -229,10 +228,10 @@ mod tests { build_method.validate_fn = Some(&validate_path); assert_eq!(quote!(#build_method), quote!( - pub fn build(&self) -> ::std::result::Result { + pub fn build(&self) -> ::derive_builder::export::Result { IpsumBuilder::validate(&self)?; - Ok(Foo { + ::derive_builder::export::Ok(Foo { foo: self.foo, }) } diff --git a/derive_builder_core/src/builder.rs b/derive_builder_core/src/builder.rs index 7506d4b8..1affd897 100644 --- a/derive_builder_core/src/builder.rs +++ b/derive_builder_core/src/builder.rs @@ -149,7 +149,7 @@ impl<'a> Builder<'a> { let clone_bound = syn::TyParamBound::Trait( syn::PolyTraitRef { - trait_ref: syn::parse_path(self.bindings.clone_trait().as_str()).unwrap(), + trait_ref: syn::parse_path("::derive_builder::export::Clone").unwrap(), bound_lifetimes: vec![], }, syn::TraitBoundModifier::None @@ -228,7 +228,7 @@ mod tests { } #[allow(dead_code)] - impl<'a, T: Debug + ::std::clone::Clone> FooBuilder<'a, T> where T: PartialEq { + impl<'a, T: Debug + ::derive_builder::export::Clone> FooBuilder<'a, T> where T: PartialEq { fn bar() -> { unimplemented!() } @@ -253,7 +253,7 @@ mod tests { } #[allow(dead_code)] - impl<'a, T: 'a + Default + ::std::clone::Clone> FooBuilder<'a, T> where T: PartialEq { + impl<'a, T: 'a + Default + ::derive_builder::export::Clone> FooBuilder<'a, T> where T: PartialEq { fn bar() -> { unimplemented!() } diff --git a/derive_builder_core/src/builder_field.rs b/derive_builder_core/src/builder_field.rs index 05484eb3..5d0ae854 100644 --- a/derive_builder_core/src/builder_field.rs +++ b/derive_builder_core/src/builder_field.rs @@ -21,7 +21,7 @@ use Bindings; /// # field.attrs = attrs.as_slice(); /// # /// # assert_eq!(quote!(#field), quote!( -/// #[some_attr] pub foo: ::std::option::Option, +/// #[some_attr] pub foo: ::derive_builder::export::Option, /// # )); /// # } /// ``` @@ -55,10 +55,9 @@ impl<'a> ToTokens for BuilderField<'a> { let ident = self.field_ident; let ty = self.field_type; let attrs = self.attrs; - let option = self.bindings.option_ty(); tokens.append(quote!( - #(#attrs)* #vis #ident: #option<#ty>, + #(#attrs)* #vis #ident: ::derive_builder::export::Option<#ty>, )); } else { trace!("Skipping builder field for `{}`, fallback to PhantomData.", @@ -66,10 +65,9 @@ impl<'a> ToTokens for BuilderField<'a> { let ident = self.field_ident; let ty = self.field_type; let attrs = self.attrs; - let phantom_data = self.bindings.phantom_data_ty(); tokens.append(quote!( - #(#attrs)* #ident: #phantom_data<#ty>, + #(#attrs)* #ident: ::derive_builder::export::PhantomData<#ty>, )); } } @@ -102,7 +100,7 @@ mod tests { let field = default_builder_field!(); assert_eq!(quote!(#field), quote!( - #[some_attr] pub foo: ::std::option::Option, + #[some_attr] pub foo: ::derive_builder::export::Option, )); } @@ -112,28 +110,28 @@ mod tests { field.setter_enabled = false; assert_eq!(quote!(#field), quote!( - #[some_attr] foo: ::std::marker::PhantomData, + #[some_attr] foo: ::derive_builder::export::PhantomData, )); } #[test] fn no_std_setter_enabled() { let mut field = default_builder_field!(); - field.bindings.no_std = true; + field.bindings = Bindings::NoStd; assert_eq!(quote!(#field), quote!( - #[some_attr] pub foo: ::core::option::Option, + #[some_attr] pub foo: ::derive_builder::export::Option, )); } #[test] fn no_std_setter_disabled() { let mut field = default_builder_field!(); - field.bindings.no_std = true; + field.bindings = Bindings::NoStd; field.setter_enabled = false; assert_eq!(quote!(#field), quote!( - #[some_attr] foo: ::core::marker::PhantomData, + #[some_attr] foo: ::derive_builder::export::PhantomData, )); } @@ -144,7 +142,7 @@ mod tests { field.field_visibility = &private; assert_eq!(quote!(#field), quote!( - #[some_attr] foo: ::std::option::Option, + #[some_attr] foo: ::derive_builder::export::Option, )); } } diff --git a/derive_builder_core/src/initializer.rs b/derive_builder_core/src/initializer.rs index bbaf980d..fd6257e9 100644 --- a/derive_builder_core/src/initializer.rs +++ b/derive_builder_core/src/initializer.rs @@ -83,10 +83,9 @@ impl<'a> Initializer<'a> { BuilderPattern::Owned => MatchSome::Move, BuilderPattern::Mutable | BuilderPattern::Immutable => { - if self.bindings.no_std { - MatchSome::CloneNoStd - } else { - MatchSome::Clone + match self.bindings { + Bindings::Std => MatchSome::Clone, + Bindings::NoStd => MatchSome::CloneNoStd, } }, } @@ -99,11 +98,12 @@ impl<'a> Initializer<'a> { None => { if self.use_default_struct { MatchNone::UseDefaultStructField(self.field_ident) - } else if self.bindings.no_std { - MatchNone::ReturnErrorNoStd(format!("`{}` must be initialized", - self.field_ident)) } else { - MatchNone::ReturnError(format!("`{}` must be initialized", self.field_ident)) + let err_msg = format!("`{}` must be initialized", self.field_ident); + match self.bindings { + Bindings::Std => MatchNone::ReturnError(err_msg), + Bindings::NoStd => MatchNone::ReturnErrorNoStd(err_msg), + } } }, } @@ -118,8 +118,7 @@ impl<'a> Initializer<'a> { quote!(#struct_ident.#field_ident) }, None => { - let default = self.bindings.default_trait(); - quote!(#default::default()) + quote!(::derive_builder::export::Default::default()) }, } } @@ -152,10 +151,10 @@ impl<'a> ToTokens for MatchNone<'a> { )) }, MatchNone::ReturnError(ref err) => tokens.append(quote!( - None => return ::std::result::Result::Err(::std::string::String::from(#err)) + None => return ::derive_builder::export::Err(::std::string::String::from(#err)) )), MatchNone::ReturnErrorNoStd(ref err) => tokens.append(quote!( - None => return ::core::result::Result::Err( + None => return ::derive_builder::export::Err( ::collections::string::String::from(#err)) )), } @@ -176,10 +175,10 @@ impl<'a> ToTokens for MatchSome { Some(value) => value )), MatchSome::Clone => tokens.append(quote!( - Some(ref value) => ::std::clone::Clone::clone(value) + Some(ref value) => ::derive_builder::export::Clone::clone(value) )), MatchSome::CloneNoStd => tokens.append(quote!( - Some(ref value) => ::core::clone::Clone::clone(value) + Some(ref value) => ::derive_builder::export::Clone::clone(value) )), } } @@ -214,8 +213,8 @@ mod tests { assert_eq!(quote!(#initializer), quote!( foo: match self.foo { - Some(ref value) => ::std::clone::Clone::clone(value), - None => return ::std::result::Result::Err(::std::string::String::from( + Some(ref value) => ::derive_builder::export::Clone::clone(value), + None => return ::derive_builder::export::Err(::std::string::String::from( "`foo` must be initialized" )), }, @@ -229,8 +228,8 @@ mod tests { assert_eq!(quote!(#initializer), quote!( foo: match self.foo { - Some(ref value) => ::std::clone::Clone::clone(value), - None => return ::std::result::Result::Err(::std::string::String::from( + Some(ref value) => ::derive_builder::export::Clone::clone(value), + None => return ::derive_builder::export::Err(::std::string::String::from( "`foo` must be initialized" )), }, @@ -245,7 +244,7 @@ mod tests { assert_eq!(quote!(#initializer), quote!( foo: match self.foo { Some(value) => value, - None => return ::std::result::Result::Err(::std::string::String::from( + None => return ::derive_builder::export::Err(::std::string::String::from( "`foo` must be initialized" )), }, @@ -259,7 +258,7 @@ mod tests { assert_eq!(quote!(#initializer), quote!( foo: match self.foo { - Some(ref value) => ::std::clone::Clone::clone(value), + Some(ref value) => ::derive_builder::export::Clone::clone(value), None => { 42 }, }, )); @@ -272,7 +271,7 @@ mod tests { assert_eq!(quote!(#initializer), quote!( foo: match self.foo { - Some(ref value) => ::std::clone::Clone::clone(value), + Some(ref value) => ::derive_builder::export::Clone::clone(value), None => __default.foo, }, )); @@ -284,19 +283,19 @@ mod tests { initializer.setter_enabled = false; assert_eq!(quote!(#initializer), quote!( - foo: ::std::default::Default::default(), + foo: ::derive_builder::export::Default::default(), )); } #[test] fn no_std() { let mut initializer = default_initializer!(); - initializer.bindings.no_std = true; + initializer.bindings = Bindings::NoStd; assert_eq!(quote!(#initializer), quote!( foo: match self.foo { - Some(ref value) => ::core::clone::Clone::clone(value), - None => return ::core::result::Result::Err(::collections::string::String::from( + Some(ref value) => ::derive_builder::export::Clone::clone(value), + None => return ::derive_builder::export::Err(::collections::string::String::from( "`foo` must be initialized" )), }, @@ -306,11 +305,11 @@ mod tests { #[test] fn no_std_setter_disabled() { let mut initializer = default_initializer!(); - initializer.bindings.no_std = true; + initializer.bindings = Bindings::NoStd; initializer.setter_enabled = false; assert_eq!(quote!(#initializer), quote!( - foo: ::core::default::Default::default(), + foo: ::derive_builder::export::Default::default(), )); } } diff --git a/derive_builder_core/src/setter.rs b/derive_builder_core/src/setter.rs index 75f0a717..839bbcb6 100644 --- a/derive_builder_core/src/setter.rs +++ b/derive_builder_core/src/setter.rs @@ -25,7 +25,7 @@ use Bindings; /// # assert_eq!(quote!(#setter), quote!( /// pub fn foo(&mut self, value: Foo) -> &mut Self { /// let mut new = self; -/// new.foo = ::std::option::Option::Some(value); +/// new.foo = ::derive_builder::export::Some(value); /// new /// } /// # )); @@ -70,9 +70,6 @@ impl<'a> ToTokens for Setter<'a> { let ident = self.ident; let attrs = self.attrs; let deprecation_notes = self.deprecation_notes; - let clone = self.bindings.clone_trait(); - let option = self.bindings.option_ty(); - let into = self.bindings.into_trait(); let self_param: Tokens; let return_ty: Tokens; @@ -92,7 +89,7 @@ impl<'a> ToTokens for Setter<'a> { BuilderPattern::Immutable => { self_param = quote!(&self); return_ty = quote!(Self); - self_into_return_ty = quote!(#clone::clone(self)); + self_into_return_ty = quote!(::derive_builder::export::Clone::clone(self)); }, }; @@ -101,7 +98,7 @@ impl<'a> ToTokens for Setter<'a> { let into_value: Tokens; if self.generic_into { - ty_params = quote!(>); + ty_params = quote!(>); param_ty = quote!(VALUE); into_value = quote!(value.into()); } else { @@ -117,25 +114,24 @@ impl<'a> ToTokens for Setter<'a> { { #deprecation_notes let mut new = #self_into_return_ty; - new.#field_ident = #option::Some(#into_value); + new.#field_ident = ::derive_builder::export::Some(#into_value); new })); if self.try_setter { - let try_into = self.bindings.try_into_trait(); - let try_ty_params = quote!(>); + let try_into_trait = self.bindings.try_into_trait(); + let try_ty_params = quote!(>); let try_ident = syn::Ident::new(format!("try_{}", ident)); - let result = self.bindings.result_ty(); tokens.append(quote!( #(#attrs)* #vis fn #try_ident #try_ty_params (#self_param, value: VALUE) - -> #result<#return_ty, VALUE::Error> + -> ::derive_builder::export::Result<#return_ty, VALUE::Error> { let converted : #ty = value.try_into()?; let mut new = #self_into_return_ty; - new.#field_ident = #option::Some(converted); - Ok(new) + new.#field_ident = ::derive_builder::export::Some(converted); + ::derive_builder::export::Ok(new) })); } else { trace!("Skipping try_setter for `{}`.", self.field_ident); @@ -180,8 +176,8 @@ mod tests { assert_eq!(quote!(#setter), quote!( pub fn foo(&self, value: Foo) -> Self { - let mut new = ::std::clone::Clone::clone(self); - new.foo = ::std::option::Option::Some(value); + let mut new = ::derive_builder::export::Clone::clone(self); + new.foo = ::derive_builder::export::Some(value); new } )); @@ -195,7 +191,7 @@ mod tests { assert_eq!(quote!(#setter), quote!( pub fn foo(&mut self, value: Foo) -> &mut Self { let mut new = self; - new.foo = ::std::option::Option::Some(value); + new.foo = ::derive_builder::export::Some(value); new } )); @@ -209,7 +205,7 @@ mod tests { assert_eq!(quote!(#setter), quote!( pub fn foo(self, value: Foo) -> Self { let mut new = self; - new.foo = ::std::option::Option::Some(value); + new.foo = ::derive_builder::export::Some(value); new } )); @@ -225,7 +221,7 @@ mod tests { assert_eq!(quote!(#setter), quote!( fn foo(&mut self, value: Foo) -> &mut Self { let mut new = self; - new.foo = ::std::option::Option::Some(value); + new.foo = ::derive_builder::export::Some(value); new } )); @@ -237,9 +233,9 @@ mod tests { setter.generic_into = true; assert_eq!(quote!(#setter), quote!( - pub fn foo >(&mut self, value: VALUE) -> &mut Self { + pub fn foo >(&mut self, value: VALUE) -> &mut Self { let mut new = self; - new.foo = ::std::option::Option::Some(value.into()); + new.foo = ::derive_builder::export::Some(value.into()); new } )); @@ -261,20 +257,20 @@ mod tests { assert_eq!(quote!(#setter), quote!( #[some_attr] - pub fn foo >(&mut self, value: VALUE) -> &mut Self { + pub fn foo >(&mut self, value: VALUE) -> &mut Self { #deprecated let mut new = self; - new.foo = ::std::option::Option::Some(value.into()); + new.foo = ::derive_builder::export::Some(value.into()); new } #[some_attr] pub fn try_foo>(&mut self, value: VALUE) - -> ::std::result::Result<&mut Self, VALUE::Error> { + -> ::derive_builder::export::Result<&mut Self, VALUE::Error> { let converted : Foo = value.try_into()?; let mut new = self; - new.foo = ::std::option::Option::Some(converted); - Ok(new) + new.foo = ::derive_builder::export::Some(converted); + ::derive_builder::export::Ok(new) } )); } @@ -282,13 +278,13 @@ mod tests { #[test] fn no_std() { let mut setter = default_setter!(); - setter.bindings.no_std = true; + setter.bindings = Bindings::NoStd; setter.pattern = BuilderPattern::Immutable; assert_eq!(quote!(#setter), quote!( pub fn foo(&self, value: Foo) -> Self { - let mut new = ::core::clone::Clone::clone(self); - new.foo = ::core::option::Option::Some(value); + let mut new = ::derive_builder::export::Clone::clone(self); + new.foo = ::derive_builder::export::Some(value); new } )); @@ -297,13 +293,13 @@ mod tests { #[test] fn no_std_generic() { let mut setter = default_setter!(); - setter.bindings.no_std = true; + setter.bindings = Bindings::NoStd; setter.generic_into = true; assert_eq!(quote!(#setter), quote!( - pub fn foo >(&mut self, value: VALUE) -> &mut Self { + pub fn foo >(&mut self, value: VALUE) -> &mut Self { let mut new = self; - new.foo = ::core::option::Option::Some(value.into()); + new.foo = ::derive_builder::export::Some(value.into()); new } )); @@ -326,16 +322,16 @@ mod tests { assert_eq!(quote!(#setter), quote!( pub fn foo(&mut self, value: Foo) -> &mut Self { let mut new = self; - new.foo = ::std::option::Option::Some(value); + new.foo = ::derive_builder::export::Some(value); new } pub fn try_foo>(&mut self, value: VALUE) - -> ::std::result::Result<&mut Self, VALUE::Error> { + -> ::derive_builder::export::Result<&mut Self, VALUE::Error> { let converted : Foo = value.try_into()?; let mut new = self; - new.foo = ::std::option::Option::Some(converted); - Ok(new) + new.foo = ::derive_builder::export::Some(converted); + ::derive_builder::export::Ok(new) } )); } diff --git a/derive_builder_macro/Cargo.toml b/derive_builder_macro/Cargo.toml new file mode 100644 index 00000000..92367025 --- /dev/null +++ b/derive_builder_macro/Cargo.toml @@ -0,0 +1,44 @@ +[package] +name = "derive_builder_macro" +version = "0.4.6" +authors = ["Colin Kiegel ", + "Pascal Hertleif ", + "Jan-Erik Rediger ", + "Ted Driggs "] + +description = "Internal helper library for the derive_builder crate." +repository = "https://github.com/colin-kiegel/rust-derive-builder" +documentation = "https://docs.rs/derive_builder_macro" + +license = "MIT/Apache-2.0" +readme = "README.md" + +[badges] +travis-ci = { repository = "colin-kiegel/rust-derive-builder" } + +[lib] +proc-macro = true + +[features] +logging = [ "log", "env_logger", "derive_builder_core/logging" ] +struct_default = [] +private_fields = [] +skeptic_tests = ["skeptic"] +nightlytests = ["compiletest_rs"] + +[dependencies] +syn = "0.11" +quote = "0.3" +log = { version = "0.3", optional = true } +env_logger = { version = "0.4", optional = true } +derive_builder_core = { version = "0.1", path = "../derive_builder_core" } +skeptic = { version = "0.9", optional = true } +compiletest_rs = { version = "0.2", optional = true } + +[build-dependencies] +skeptic = { version = "0.9", optional = true } +log = { version = "0.3", optional = true } +env_logger = { version = "0.4", optional = true } + +[dev-dependencies] +pretty_assertions = "0.1" diff --git a/derive_builder_macro/LICENSE-APACHE b/derive_builder_macro/LICENSE-APACHE new file mode 120000 index 00000000..965b606f --- /dev/null +++ b/derive_builder_macro/LICENSE-APACHE @@ -0,0 +1 @@ +../LICENSE-APACHE \ No newline at end of file diff --git a/derive_builder_macro/LICENSE-MIT b/derive_builder_macro/LICENSE-MIT new file mode 120000 index 00000000..76219eb7 --- /dev/null +++ b/derive_builder_macro/LICENSE-MIT @@ -0,0 +1 @@ +../LICENSE-MIT \ No newline at end of file diff --git a/derive_builder_macro/README.md b/derive_builder_macro/README.md new file mode 100644 index 00000000..ecd4d41c --- /dev/null +++ b/derive_builder_macro/README.md @@ -0,0 +1,39 @@ +[![Build status](https://travis-ci.org/colin-kiegel/rust-derive-builder.svg?branch=master)](https://travis-ci.org/colin-kiegel/rust-derive-builder) +[![Documentation](https://docs.rs/derive_builder_macro/badge.svg)](https://docs.rs/derive_builder_macro) +[![Latest version](https://img.shields.io/crates/v/derive_builder_macro.svg)](https://crates.io/crates/derive_builder_macro) +[![All downloads](https://img.shields.io/crates/d/derive_builder_macro.svg)](https://crates.io/crates/derive_builder_macro) +[![Downloads of latest version](https://img.shields.io/crates/dv/derive_builder_macro.svg)](https://crates.io/crates/derive_builder_macro) + +# Crate [`derive_builder_macro`] + +**Important Note**: + +* You are probably looking for the [`derive_builder`] crate, + which re-exports the builder derive defined in this crate. +* Some features of the builder derive require items defined in + [`derive_builder`]. + +## Purpose + +Proc macro crates (like this one) can define custom derives, but cannot export +any other items. However _another_ crate like [`derive_builder`] can both +re-export the custom derive and export additional items. That's what we do. + +[`derive_builder`]: https://crates.io/crates/derive_builder +[`derive_builder_macro`]: https://crates.io/crates/derive_builder_macro + +## License + +Licensed under either of + +- Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or ) +- MIT license ([LICENSE-MIT](LICENSE-MIT) or ) + +at your option. + +### Contribution + +Unless you explicitly state otherwise, any contribution intentionally +submitted for inclusion in the work by you, as defined in the Apache-2.0 +license, shall be dual licensed as above, without any additional terms or +conditions. diff --git a/derive_builder/src/doc_tpl/builder_method.md b/derive_builder_macro/src/doc_tpl/builder_method.md similarity index 100% rename from derive_builder/src/doc_tpl/builder_method.md rename to derive_builder_macro/src/doc_tpl/builder_method.md diff --git a/derive_builder/src/doc_tpl/builder_struct.md b/derive_builder_macro/src/doc_tpl/builder_struct.md similarity index 100% rename from derive_builder/src/doc_tpl/builder_struct.md rename to derive_builder_macro/src/doc_tpl/builder_struct.md diff --git a/derive_builder/src/doc_tpl/mod.rs b/derive_builder_macro/src/doc_tpl/mod.rs similarity index 100% rename from derive_builder/src/doc_tpl/mod.rs rename to derive_builder_macro/src/doc_tpl/mod.rs diff --git a/derive_builder_macro/src/lib.rs b/derive_builder_macro/src/lib.rs new file mode 100644 index 00000000..6b23c06a --- /dev/null +++ b/derive_builder_macro/src/lib.rs @@ -0,0 +1,76 @@ + + +#![crate_type = "proc-macro"] +#![deny(warnings)] + +extern crate proc_macro; +extern crate syn; +#[macro_use] +extern crate quote; +#[cfg(feature = "logging")] +#[macro_use] +extern crate log; +#[cfg(feature = "logging")] +extern crate env_logger; +extern crate derive_builder_core; + +#[cfg(not(feature = "logging"))] +#[macro_use] +mod log_disabled; +mod options; + +use proc_macro::TokenStream; +#[cfg(feature = "logging")] +use std::sync::{Once, ONCE_INIT}; +use options::{struct_options_from, field_options_from}; + +#[cfg(feature = "logging")] +static INIT_LOGGER: Once = ONCE_INIT; + +#[doc(hidden)] +#[proc_macro_derive(Builder, attributes(builder))] +pub fn derive(input: TokenStream) -> TokenStream { + #[cfg(feature = "logging")] + INIT_LOGGER.call_once(|| { + env_logger::init().unwrap(); + }); + + let input = input.to_string(); + + let ast = syn::parse_macro_input(&input).expect("Couldn't parse item"); + + let result = builder_for_struct(ast).to_string(); + debug!("generated tokens: {}", result); + + result.parse().expect(&format!("Couldn't parse `{}` to tokens", result)) +} + +fn builder_for_struct(ast: syn::MacroInput) -> quote::Tokens { + debug!("Deriving Builder for `{}`.", ast.ident); + let (opts, field_defaults) = struct_options_from(&ast); + + let fields = match ast.body { + syn::Body::Struct(syn::VariantData::Struct(fields)) => fields, + _ => panic!("`#[derive(Builder)]` can only be used with braced structs"), + }; + + let mut builder = opts.as_builder(); + let mut build_fn = opts.as_build_method(); + + builder.doc_comment(format!(include_str!("doc_tpl/builder_struct.md"), + struct_name = ast.ident.as_ref())); + build_fn.doc_comment(format!(include_str!("doc_tpl/builder_method.md"), + struct_name = ast.ident.as_ref())); + + for f in fields { + let f_opts = field_options_from(f, &field_defaults); + + builder.push_field(f_opts.as_builder_field()); + builder.push_setter_fn(f_opts.as_setter()); + build_fn.push_initializer(f_opts.as_initializer()); + } + + builder.push_build_fn(build_fn); + + quote!(#builder) +} diff --git a/derive_builder/src/log_disabled.rs b/derive_builder_macro/src/log_disabled.rs similarity index 100% rename from derive_builder/src/log_disabled.rs rename to derive_builder_macro/src/log_disabled.rs diff --git a/derive_builder/src/options/field_mode.rs b/derive_builder_macro/src/options/field_mode.rs similarity index 90% rename from derive_builder/src/options/field_mode.rs rename to derive_builder_macro/src/options/field_mode.rs index 8b6eeda0..c05d5269 100644 --- a/derive_builder/src/options/field_mode.rs +++ b/derive_builder_macro/src/options/field_mode.rs @@ -1,6 +1,6 @@ use syn; use options::{OptionsBuilder, OptionsBuilderMode, FieldOptions}; -use derive_builder_core::{DeprecationNotes, Bindings}; +use derive_builder_core::DeprecationNotes; #[derive(Clone, Debug)] pub struct FieldMode { @@ -58,7 +58,8 @@ impl OptionsBuilder { let mut deprecation_notes = self.mode.deprecation_notes; deprecation_notes.extend(&defaults.mode.deprecation_notes); - // move a nested field out of `self`, if it is `Some(_)` or else clone it from `defaults` + // move a nested field out of `self`, if it is `Some(_)` or else clone it from + // `defaults` macro_rules! f { ($($field:ident).*) => { self.$($field).*.or_else(|| defaults.$($field).*.clone()) @@ -83,7 +84,7 @@ impl OptionsBuilder { default_expression: f!(default_expression), setter_into: f!(setter_into), try_setter: f!(try_setter), - no_std: f!(no_std), + bindings: f!(bindings), mode: mode, } } @@ -95,7 +96,7 @@ impl OptionsBuilderMode for FieldMode { panic!("Builder name can only be set on the struct level (but found {}).", self.where_diagnostics()) } - + fn parse_derive(&mut self, _nested: &[syn::NestedMetaItem]) { panic!("Derive declarations can only be added on the struct level (but found {}).", self.where_diagnostics()) @@ -114,9 +115,9 @@ impl OptionsBuilderMode for FieldMode { fn struct_mode(&self) -> bool { false } - + fn parse_build_fn_options(&mut self, _: &[syn::NestedMetaItem]) { - panic!("Build function options can only be set on the struct level (but found {}).", + panic!("Build function options can only be set on the struct level (but found {}).", self.where_diagnostics()) } } @@ -136,7 +137,7 @@ impl From> for FieldOptions { }, _ => syn::Ident::new(field_ident.clone()), }}); - + let setter_vis = b.setter_vis.unwrap_or(syn::Visibility::Public); let field_vis = b.field_vis.unwrap_or_else(|| if cfg!(feature = "private_fields") { @@ -158,9 +159,7 @@ impl From> for FieldOptions { deprecation_notes: b.mode.deprecation_notes, default_expression: b.default_expression, use_default_struct: b.mode.use_default_struct, - bindings: Bindings { - no_std: b.no_std.unwrap_or(false), - }, + bindings: b.bindings.unwrap_or_default(), attrs: b.mode.setter_attrs.unwrap_or_default(), } } @@ -173,16 +172,18 @@ fn filter_attr(attr: &&syn::Attribute) -> bool { if attr.is_sugared_doc == true { if let syn::MetaItem::NameValue(ref ident, _) = attr.value { - // example: - // Attribute { style: Outer, value: NameValue(Ident("doc"), Str("/// This is a doc comment for a field", Cooked)), is_sugared_doc: true } + // example: + // Attribute { style: Outer, value: NameValue(Ident("doc"), Str("/// This is a + // doc comment for a field", Cooked)), is_sugared_doc: true } if ident == "doc" { return true } } } else { if let syn::MetaItem::List(ref ident, _) = attr.value { - // example: - // Attribute { style: Outer, value: List(Ident("allow"), [MetaItem(Word(Ident("non_snake_case")))]), is_sugared_doc: false } + // example: + // Attribute { style: Outer, value: List(Ident("allow"), + // [MetaItem(Word(Ident("non_snake_case")))]), is_sugared_doc: false } return match ident.as_ref() { "cfg" => true, "allow" => true, diff --git a/derive_builder/src/options/field_options.rs b/derive_builder_macro/src/options/field_options.rs similarity index 92% rename from derive_builder/src/options/field_options.rs rename to derive_builder_macro/src/options/field_options.rs index ad38e63a..bb7861c8 100644 --- a/derive_builder/src/options/field_options.rs +++ b/derive_builder_macro/src/options/field_options.rs @@ -38,7 +38,7 @@ pub struct FieldOptions { } impl DefaultExpression { - pub fn parse_block(&self, no_std: bool) -> Block { + pub fn parse_block(&self) -> Block { let expr = match *self { DefaultExpression::Explicit(ref s) => { if s.is_empty() { @@ -46,11 +46,7 @@ impl DefaultExpression { } s }, - DefaultExpression::Trait => if no_std { - "::core::default::Default::default()" - } else { - "::std::default::Default::default()" - }, + DefaultExpression::Trait => "::derive_builder::export::Default::default()", }; expr.parse().expect(&format!("Couldn't parse default expression `{:?}`", self)) @@ -87,7 +83,7 @@ impl FieldOptions { builder_pattern: self.builder_pattern, default_value: self.default_expression .as_ref() - .map(|x| { x.parse_block(self.bindings.no_std) }), + .map(DefaultExpression::parse_block), use_default_struct: self.use_default_struct, bindings: self.bindings, } diff --git a/derive_builder/src/options/macros.rs b/derive_builder_macro/src/options/macros.rs similarity index 100% rename from derive_builder/src/options/macros.rs rename to derive_builder_macro/src/options/macros.rs diff --git a/derive_builder/src/options/mod.rs b/derive_builder_macro/src/options/mod.rs similarity index 98% rename from derive_builder/src/options/mod.rs rename to derive_builder_macro/src/options/mod.rs index 874d4b2e..df9471f9 100644 --- a/derive_builder/src/options/mod.rs +++ b/derive_builder_macro/src/options/mod.rs @@ -12,7 +12,7 @@ //! `FieldOptions` instances. use syn; -use derive_builder_core::BuilderPattern; +use derive_builder_core::{Bindings, BuilderPattern}; #[macro_use] mod macros; @@ -58,7 +58,7 @@ pub struct OptionsBuilder { default_expression: Option, setter_into: Option, try_setter: Option, - no_std: Option, + bindings: Option, mode: Mode, } @@ -86,7 +86,7 @@ impl From for OptionsBuilder { field_vis: None, default_expression: None, setter_into: None, - no_std: None, + bindings: None, mode: mode, } } @@ -138,9 +138,9 @@ impl OptionsBuilder } impl_setter!{ - ident: no_std, - desc: "no_std support", - map: |x: bool| { x }, + ident: bindings, + desc: "bindings library", + map: |x: Bindings| { x }, } impl_setter!{ @@ -259,7 +259,7 @@ impl OptionsBuilder }, "no_std" => { if self.mode.struct_mode() { - self.no_std(true) + self.bindings(Bindings::NoStd) } else { panic!("Support for `#![no_std]` can only be set on the struct level \ (but found {}).", self.where_diagnostics()) diff --git a/derive_builder/src/options/struct_mode.rs b/derive_builder_macro/src/options/struct_mode.rs similarity index 98% rename from derive_builder/src/options/struct_mode.rs rename to derive_builder_macro/src/options/struct_mode.rs index 8ea4d922..fb0cad0f 100644 --- a/derive_builder/src/options/struct_mode.rs +++ b/derive_builder_macro/src/options/struct_mode.rs @@ -1,7 +1,7 @@ use syn; use options::{OptionsBuilder, OptionsBuilderMode, parse_lit_as_string, parse_lit_as_bool, parse_lit_as_path, FieldMode, StructOptions}; -use derive_builder_core::{DeprecationNotes, Bindings}; +use derive_builder_core::DeprecationNotes; #[derive(Debug, Clone)] pub struct StructMode { @@ -246,7 +246,7 @@ impl From> for (StructOptions, OptionsBuilder> for (StructOptions, OptionsBuilder", + "Pascal Hertleif ", + "Jan-Erik Rediger ", + "Ted Driggs "] +license = "MIT/Apache-2.0" + +publish = false +build = "build/mod.rs" + +[features] + +default = ["derive_builder/logging"] +struct_default = ["derive_builder/struct_default"] +private_fields = ["derive_builder/private_fields"] +skeptic_tests = ["skeptic"] +nightlytests = ["derive_builder_testsuite_no_std/nightlytests", + "compiletest_rs"] + +[dependencies] +derive_builder = { version = "0.4", path = "../derive_builder" } +derive_builder_testsuite_no_std = { version = "0.1", path = "no_std", optional = true } +skeptic = { version = "0.9", optional = true } +compiletest_rs = { version = "0.2", optional = true } + +[build-dependencies] +skeptic = { version = "0.9", optional = true } + +[dev-dependencies] +pretty_assertions = "0.1" diff --git a/testsuite/build/log_disabled.rs b/testsuite/build/log_disabled.rs new file mode 120000 index 00000000..06965f03 --- /dev/null +++ b/testsuite/build/log_disabled.rs @@ -0,0 +1 @@ +../../derive_builder_core/src/log_disabled.rs \ No newline at end of file diff --git a/derive_builder/build/mod.rs b/testsuite/build/mod.rs similarity index 100% rename from derive_builder/build/mod.rs rename to testsuite/build/mod.rs diff --git a/derive_builder/build/skeptic.rs b/testsuite/build/skeptic.rs similarity index 95% rename from derive_builder/build/skeptic.rs rename to testsuite/build/skeptic.rs index d7038ae9..76551712 100644 --- a/derive_builder/build/skeptic.rs +++ b/testsuite/build/skeptic.rs @@ -8,7 +8,7 @@ extern crate skeptic; #[cfg(not(feature = "logging"))] #[macro_use] mod log_disabled { - include!("../src/log_disabled.rs"); + include!("log_disabled.rs"); } fn main() { @@ -17,7 +17,7 @@ fn main() { env_logger::init().unwrap(); let mut files = generate_doc_tpl_tests().unwrap(); - files.push("README.md".to_string()); + files.push("../derive_builder/README.md".to_string()); let files_ref: Vec<&str> = files.iter().map(|x| x.as_str()).collect(); @@ -59,7 +59,7 @@ use std::fs::{File, DirBuilder}; use std::ffi::OsStr; use std::io::{Write, Read}; -const DOC_TPL_DIR: &'static str = "src/doc_tpl/"; +const DOC_TPL_DIR: &'static str = "../derive_builder_macro/src/doc_tpl/"; const DOC_TPL_OUT_DIR: &'static str = "doc_tpl/"; fn generate_doc_tpl_tests() -> Result, Box> { diff --git a/derive_builder/tests/dummy-crate/Cargo.toml b/testsuite/dummy-crate/Cargo.toml similarity index 86% rename from derive_builder/tests/dummy-crate/Cargo.toml rename to testsuite/dummy-crate/Cargo.toml index e1baf731..2170020f 100644 --- a/derive_builder/tests/dummy-crate/Cargo.toml +++ b/testsuite/dummy-crate/Cargo.toml @@ -10,4 +10,4 @@ publish = false path = "src/lib.rs" [dependencies] -derive_builder = { path = "../../" } +derive_builder = { path = "../../derive_builder/" } diff --git a/derive_builder/tests/dummy-crate/src/lib.rs b/testsuite/dummy-crate/src/lib.rs similarity index 100% rename from derive_builder/tests/dummy-crate/src/lib.rs rename to testsuite/dummy-crate/src/lib.rs diff --git a/derive_builder/examples/channel.rs b/testsuite/examples/channel.rs similarity index 100% rename from derive_builder/examples/channel.rs rename to testsuite/examples/channel.rs diff --git a/derive_builder/examples/custom_defaults.rs b/testsuite/examples/custom_defaults.rs similarity index 100% rename from derive_builder/examples/custom_defaults.rs rename to testsuite/examples/custom_defaults.rs diff --git a/derive_builder/examples/deny_missing_docs.rs b/testsuite/examples/deny_missing_docs.rs similarity index 100% rename from derive_builder/examples/deny_missing_docs.rs rename to testsuite/examples/deny_missing_docs.rs diff --git a/derive_builder/examples/doc_example.rs b/testsuite/examples/doc_example.rs similarity index 100% rename from derive_builder/examples/doc_example.rs rename to testsuite/examples/doc_example.rs diff --git a/derive_builder/examples/readme_example.rs b/testsuite/examples/readme_example.rs similarity index 100% rename from derive_builder/examples/readme_example.rs rename to testsuite/examples/readme_example.rs diff --git a/derive_builder/examples/validation.rs b/testsuite/examples/validation.rs similarity index 100% rename from derive_builder/examples/validation.rs rename to testsuite/examples/validation.rs diff --git a/testsuite/no_std/Cargo.toml b/testsuite/no_std/Cargo.toml new file mode 100644 index 00000000..86d6780f --- /dev/null +++ b/testsuite/no_std/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "derive_builder_testsuite_no_std" +version = "0.1.0" +authors = ["Colin Kiegel "] +license = "MIT/Apache-2.0" +publish = false + +[features] +nightlytests = ["derive_builder/no_std"] + +[dependencies] +derive_builder = { path = "../../derive_builder/", optional = true } + +[profile] +panic = "abort" diff --git a/derive_builder/tests/run-pass/no_std.rs b/testsuite/no_std/tests/no_std.rs similarity index 98% rename from derive_builder/tests/run-pass/no_std.rs rename to testsuite/no_std/tests/no_std.rs index c7ab0855..6beeb6e9 100644 --- a/derive_builder/tests/run-pass/no_std.rs +++ b/testsuite/no_std/tests/no_std.rs @@ -1,6 +1,7 @@ // requires nightly toolchain! // // compile-flags:-C panic=abort +#![cfg(feature = "nightlytests")] #![no_std] #![feature(collections, lang_items, start, core_intrinsics)] #![allow(dead_code)] diff --git a/derive_builder/tests/bounds_generation.rs b/testsuite/tests/bounds_generation.rs similarity index 100% rename from derive_builder/tests/bounds_generation.rs rename to testsuite/tests/bounds_generation.rs diff --git a/derive_builder/tests/build_fn.rs b/testsuite/tests/build_fn.rs similarity index 100% rename from derive_builder/tests/build_fn.rs rename to testsuite/tests/build_fn.rs diff --git a/derive_builder/tests/builder_name.rs b/testsuite/tests/builder_name.rs similarity index 100% rename from derive_builder/tests/builder_name.rs rename to testsuite/tests/builder_name.rs diff --git a/derive_builder/tests/compile-fail/deny_empty_default.rs b/testsuite/tests/compile-fail/deny_empty_default.rs similarity index 100% rename from derive_builder/tests/compile-fail/deny_empty_default.rs rename to testsuite/tests/compile-fail/deny_empty_default.rs diff --git a/derive_builder/tests/compile-fail/private_fields.rs b/testsuite/tests/compile-fail/private_fields.rs similarity index 100% rename from derive_builder/tests/compile-fail/private_fields.rs rename to testsuite/tests/compile-fail/private_fields.rs diff --git a/derive_builder/tests/compile-fail/rename_setter_struct_level.rs b/testsuite/tests/compile-fail/rename_setter_struct_level.rs similarity index 100% rename from derive_builder/tests/compile-fail/rename_setter_struct_level.rs rename to testsuite/tests/compile-fail/rename_setter_struct_level.rs diff --git a/derive_builder/tests/compiletests.rs b/testsuite/tests/compiletests.rs similarity index 100% rename from derive_builder/tests/compiletests.rs rename to testsuite/tests/compiletests.rs diff --git a/derive_builder/tests/custom_default.rs b/testsuite/tests/custom_default.rs similarity index 100% rename from derive_builder/tests/custom_default.rs rename to testsuite/tests/custom_default.rs diff --git a/derive_builder/tests/derive_trait.rs b/testsuite/tests/derive_trait.rs similarity index 100% rename from derive_builder/tests/derive_trait.rs rename to testsuite/tests/derive_trait.rs diff --git a/derive_builder/tests/generic_structs.rs b/testsuite/tests/generic_structs.rs similarity index 100% rename from derive_builder/tests/generic_structs.rs rename to testsuite/tests/generic_structs.rs diff --git a/derive_builder/tests/lifetime.rs b/testsuite/tests/lifetime.rs similarity index 100% rename from derive_builder/tests/lifetime.rs rename to testsuite/tests/lifetime.rs diff --git a/derive_builder/tests/run-pass/attributes.rs b/testsuite/tests/run-pass/attributes.rs similarity index 100% rename from derive_builder/tests/run-pass/attributes.rs rename to testsuite/tests/run-pass/attributes.rs diff --git a/derive_builder/tests/run-pass/custom_types.rs b/testsuite/tests/run-pass/custom_types.rs similarity index 100% rename from derive_builder/tests/run-pass/custom_types.rs rename to testsuite/tests/run-pass/custom_types.rs diff --git a/derive_builder/tests/run-pass/deprecate_setter_prefix_syntax.rs b/testsuite/tests/run-pass/deprecate_setter_prefix_syntax.rs similarity index 100% rename from derive_builder/tests/run-pass/deprecate_setter_prefix_syntax.rs rename to testsuite/tests/run-pass/deprecate_setter_prefix_syntax.rs diff --git a/derive_builder/tests/run-pass/deprecate_struct-level_default.rs b/testsuite/tests/run-pass/deprecate_struct-level_default.rs similarity index 100% rename from derive_builder/tests/run-pass/deprecate_struct-level_default.rs rename to testsuite/tests/run-pass/deprecate_struct-level_default.rs diff --git a/derive_builder/tests/run-pass/empty_struct.rs b/testsuite/tests/run-pass/empty_struct.rs similarity index 100% rename from derive_builder/tests/run-pass/empty_struct.rs rename to testsuite/tests/run-pass/empty_struct.rs diff --git a/derive_builder/tests/run-pass/multiple_derives.rs b/testsuite/tests/run-pass/multiple_derives.rs similarity index 100% rename from derive_builder/tests/run-pass/multiple_derives.rs rename to testsuite/tests/run-pass/multiple_derives.rs diff --git a/derive_builder/tests/setter_into.rs b/testsuite/tests/setter_into.rs similarity index 100% rename from derive_builder/tests/setter_into.rs rename to testsuite/tests/setter_into.rs diff --git a/derive_builder/tests/setter_name.rs b/testsuite/tests/setter_name.rs similarity index 100% rename from derive_builder/tests/setter_name.rs rename to testsuite/tests/setter_name.rs diff --git a/derive_builder/tests/setter_pattern.rs b/testsuite/tests/setter_pattern.rs similarity index 100% rename from derive_builder/tests/setter_pattern.rs rename to testsuite/tests/setter_pattern.rs diff --git a/derive_builder/tests/setter_prefix.rs b/testsuite/tests/setter_prefix.rs similarity index 100% rename from derive_builder/tests/setter_prefix.rs rename to testsuite/tests/setter_prefix.rs diff --git a/derive_builder/tests/setter_visibility.rs b/testsuite/tests/setter_visibility.rs similarity index 100% rename from derive_builder/tests/setter_visibility.rs rename to testsuite/tests/setter_visibility.rs diff --git a/derive_builder/tests/skeptic.rs b/testsuite/tests/skeptic.rs similarity index 100% rename from derive_builder/tests/skeptic.rs rename to testsuite/tests/skeptic.rs diff --git a/derive_builder/tests/skip-setter.rs b/testsuite/tests/skip-setter.rs similarity index 100% rename from derive_builder/tests/skip-setter.rs rename to testsuite/tests/skip-setter.rs diff --git a/derive_builder/tests/try_setter.rs b/testsuite/tests/try_setter.rs similarity index 100% rename from derive_builder/tests/try_setter.rs rename to testsuite/tests/try_setter.rs diff --git a/derive_builder/tests/validation.rs b/testsuite/tests/validation.rs similarity index 100% rename from derive_builder/tests/validation.rs rename to testsuite/tests/validation.rs