Processed some of the feedback

This commit is contained in:
Victor Koenders 2021-10-18 10:18:47 +02:00
parent 83970d29cf
commit 4b25114c59
5 changed files with 59 additions and 31 deletions

View File

@ -33,7 +33,7 @@ derive = ["bincode_derive"]
bincode_derive = { path = "derive", version = "2.0.0-dev", optional = true } bincode_derive = { path = "derive", version = "2.0.0-dev", optional = true }
serde = { version = "1.0.130", optional = true } serde = { version = "1.0.130", optional = true }
# Used for derive tests # Used for tests
[dev-dependencies] [dev-dependencies]
serde_derive = "1.0.130" serde_derive = "1.0.130"
serde_json = "1.0.68" serde_json = "1.0.68"

View File

@ -1,4 +1,4 @@
use crate::prelude::*; use crate::{generate::StreamBuilder, prelude::*};
use std::fmt; use std::fmt;
#[derive(Debug)] #[derive(Debug)]
@ -44,27 +44,13 @@ impl Error {
pub fn throw_with_span(self, span: Span) -> TokenStream { pub fn throw_with_span(self, span: Span) -> TokenStream {
// compile_error!($message) // compile_error!($message)
vec![ let mut builder = StreamBuilder::new();
TokenTree::Ident(Ident::new("compile_error", span)), builder.ident_str("compile_error");
TokenTree::Punct({ builder.punct('!');
let mut punct = Punct::new('!', Spacing::Alone); builder.group(Delimiter::Brace, |b| {
punct.set_span(span); b.lit_str(self.to_string());
punct });
}), builder.set_span_on_all_tokens(span);
TokenTree::Group({ builder.stream
let mut group = Group::new(Delimiter::Brace, {
TokenTree::Literal({
let mut string = Literal::string(&self.to_string());
string.set_span(span);
string
})
.into()
});
group.set_span(span);
group
}),
]
.into_iter()
.collect()
} }
} }

View File

@ -1,7 +1,9 @@
use super::{ImplFor, StreamBuilder}; use super::{ImplFor, StreamBuilder};
use crate::prelude::Delimiter; use crate::prelude::Delimiter;
/// A builder for functions.
pub struct FnBuilder<'a, 'b> { pub struct FnBuilder<'a, 'b> {
generate: &'b mut ImplFor<'a>, generate: Option<&'b mut ImplFor<'a>>,
name: String, name: String,
lifetime_and_generics: Vec<(String, Vec<String>)>, lifetime_and_generics: Vec<(String, Vec<String>)>,
@ -13,7 +15,7 @@ pub struct FnBuilder<'a, 'b> {
impl<'a, 'b> FnBuilder<'a, 'b> { impl<'a, 'b> FnBuilder<'a, 'b> {
pub(super) fn new(generate: &'b mut ImplFor<'a>, name: impl Into<String>) -> Self { pub(super) fn new(generate: &'b mut ImplFor<'a>, name: impl Into<String>) -> Self {
Self { Self {
generate, generate: Some(generate),
name: name.into(), name: name.into(),
lifetime_and_generics: Vec::new(), lifetime_and_generics: Vec::new(),
self_arg: FnSelfArg::None, self_arg: FnSelfArg::None,
@ -22,6 +24,30 @@ impl<'a, 'b> FnBuilder<'a, 'b> {
} }
} }
#[cfg(test)]
#[doc(hidden)]
#[allow(unused)]
pub fn for_test() -> Self {
Self {
generate: None,
name: String::new(),
lifetime_and_generics: Vec::new(),
self_arg: FnSelfArg::None,
args: Vec::new(),
return_type: None,
}
}
/// Add a generic parameter. Keep in mind that this is *not* a valid lifetime.
///
/// `dependencies` are the optional dependencies of the parameter.
///
/// ```ignore
/// let mut builder: FnBuilder = ...;
/// builder
/// .with_generic("D", None) // fn Foo<D>()
/// .with_generic("E", &["Encodable"]); // fn foo<D, E: Encodable>();
/// ```
pub fn with_generic<T, U, V>(mut self, name: T, dependencies: U) -> Self pub fn with_generic<T, U, V>(mut self, name: T, dependencies: U) -> Self
where where
T: Into<String>, T: Into<String>,
@ -52,7 +78,7 @@ impl<'a, 'b> FnBuilder<'a, 'b> {
pub fn body(self, body_builder: impl FnOnce(&mut StreamBuilder)) { pub fn body(self, body_builder: impl FnOnce(&mut StreamBuilder)) {
let FnBuilder { let FnBuilder {
generate, mut generate,
name, name,
lifetime_and_generics, lifetime_and_generics,
self_arg, self_arg,
@ -108,9 +134,10 @@ impl<'a, 'b> FnBuilder<'a, 'b> {
builder.push_parsed(&return_type); builder.push_parsed(&return_type);
} }
generate.group.append(builder); let generator = generate.take().unwrap();
generate.group.group(Delimiter::Brace, body_builder); generator.group.append(builder);
generator.group.group(Delimiter::Brace, body_builder);
} }
} }

View File

@ -6,7 +6,7 @@ use std::str::FromStr;
#[must_use] #[must_use]
#[derive(Default)] #[derive(Default)]
pub struct StreamBuilder { pub struct StreamBuilder {
pub(super) stream: TokenStream, pub(crate) stream: TokenStream,
} }
impl StreamBuilder { impl StreamBuilder {
@ -83,6 +83,11 @@ impl StreamBuilder {
]); ]);
} }
pub fn lit_str(&mut self, str: impl AsRef<str>) {
self.stream
.extend([TokenTree::Literal(Literal::string(str.as_ref()))]);
}
pub fn lit_u32(&mut self, val: u32) { pub fn lit_u32(&mut self, val: u32) {
self.stream self.stream
.extend([TokenTree::Literal(Literal::u32_unsuffixed(val))]); .extend([TokenTree::Literal(Literal::u32_unsuffixed(val))]);
@ -92,4 +97,14 @@ impl StreamBuilder {
self.stream self.stream
.extend([TokenTree::Literal(Literal::usize_unsuffixed(val))]); .extend([TokenTree::Literal(Literal::usize_unsuffixed(val))]);
} }
pub fn set_span_on_all_tokens(&mut self, span: Span) {
self.stream = std::mem::take(&mut self.stream)
.into_iter()
.map(|mut token| {
token.set_span(span);
token
})
.collect();
}
} }

View File

@ -47,7 +47,7 @@ pub struct Configuration<E = LittleEndian, I = Varint, A = SkipFixedArrayLength>
} }
impl Configuration { impl Configuration {
/// The default config. By default this will be: /// The default config for bincode 2.0. By default this will be:
/// - Little endian /// - Little endian
/// - Variable int encoding /// - Variable int encoding
/// - Skip fixed array length /// - Skip fixed array length