Skip to content

Commit f57dbf1

Browse files
committed
derive: Refactor to use syn::Error::to_compile_error
1 parent 95414b5 commit f57dbf1

File tree

4 files changed

+32
-32
lines changed

4 files changed

+32
-32
lines changed

oauth1-request-derive/src/ctxt.rs

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,41 @@
1+
use core::fmt::Display;
12
use std::mem;
23

3-
use proc_macro2::{Span, TokenStream};
4-
use quote::ToTokens;
5-
6-
use crate::util::error;
4+
use proc_macro2::Span;
5+
use syn::Error;
76

87
pub struct Ctxt {
9-
errors: Option<TokenStream>,
8+
error: Option<Error>,
109
}
1110

1211
impl Ctxt {
1312
pub fn new() -> Self {
14-
Self {
15-
errors: Some(TokenStream::new()),
13+
Self { error: None }
14+
}
15+
16+
pub fn add_error(&mut self, error: Error) {
17+
if let Some(ref mut e) = self.error {
18+
e.combine(error);
19+
} else {
20+
self.error = Some(error);
1621
}
1722
}
1823

19-
pub fn error(&mut self, msg: &str, span: Span) {
20-
error(msg, span).to_tokens(self.errors.as_mut().unwrap());
24+
pub fn add_error_message<T: Display>(&mut self, span: Span, msg: T) {
25+
self.add_error(Error::new(span, msg));
2126
}
2227

23-
pub fn emit_errors(mut self) -> Option<TokenStream> {
24-
let errors = self.errors.take().unwrap();
28+
pub fn take_error(mut self) -> Option<Error> {
29+
let error = self.error.take();
2530
mem::forget(self);
26-
if errors.is_empty() {
27-
None
28-
} else {
29-
Some(errors)
30-
}
31+
error
3132
}
3233
}
3334

3435
impl Drop for Ctxt {
3536
fn drop(&mut self) {
3637
if !std::thread::panicking() {
37-
panic!("must call `Ctxt::emit_errors`");
38+
panic!("must call `Ctxt::take_error`");
3839
}
3940
}
4041
}

oauth1-request-derive/src/lib.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ mod util;
2828
use proc_macro2::{Span, TokenStream};
2929
use proc_macro_crate::FoundCrate;
3030
use quote::{quote, quote_spanned};
31-
use syn::spanned::Spanned;
3231
use syn::{
3332
parse_macro_input, parse_quote, Data, DataStruct, DeriveInput, Fields, GenericParam, Generics,
3433
Ident,
@@ -38,7 +37,6 @@ use self::container::ContainerMeta;
3837
use self::ctxt::Ctxt;
3938
use self::field::Field;
4039
use self::method_body::MethodBody;
41-
use self::util::error;
4240

4341
/// A derive macro for [`oauth1_request::Request`][Request] trait.
4442
///
@@ -59,7 +57,10 @@ fn expand_derive_oauth1_authorize(input: DeriveInput) -> TokenStream {
5957
fields: Fields::Named(fields),
6058
..
6159
}) => fields,
62-
_ => return error("expected a struct with named fields", input.span()),
60+
_ => {
61+
return syn::Error::new_spanned(input, "expected a struct with named fields")
62+
.into_compile_error()
63+
}
6364
};
6465

6566
let mut cx = Ctxt::new();
@@ -81,7 +82,7 @@ fn expand_derive_oauth1_authorize(input: DeriveInput) -> TokenStream {
8182
let name = f.name();
8283
let (name, span) = (name.string_value(), name.span());
8384
if name == prev_name {
84-
cx.error(&format!("duplicate parameter \"{}\"", name), span);
85+
cx.add_error_message(span, format!("duplicate parameter \"{}\"", name));
8586
}
8687
name
8788
});
@@ -105,7 +106,10 @@ fn expand_derive_oauth1_authorize(input: DeriveInput) -> TokenStream {
105106
&*krate
106107
}
107108
Err(proc_macro_crate::Error::CargoManifestDirNotSet) => "oauth1_request",
108-
Err(e) => panic!("{:?}", e),
109+
Err(e) => {
110+
cx.add_error_message(Span::call_site(), e);
111+
"oauth1_request"
112+
}
109113
};
110114
let krate = Ident::new(krate, Span::call_site());
111115
quote! {
@@ -116,7 +120,8 @@ fn expand_derive_oauth1_authorize(input: DeriveInput) -> TokenStream {
116120
add_trait_bounds(&mut generics);
117121
let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
118122

119-
if let Some(mut tokens) = cx.emit_errors() {
123+
if let Some(e) = cx.take_error() {
124+
let mut tokens = e.into_compile_error();
120125
tokens.extend(quote! {
121126
const _: () = {
122127
#use_oauth1_request

oauth1-request-derive/src/meta.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,14 @@ macro_rules! def_meta {
3131
let meta_list = match attr.parse_args_with(parser) {
3232
Ok(list) => list,
3333
Err(e) => {
34-
cx.error(&e.to_string(), e.span());
34+
cx.add_error(e);
3535
continue;
3636
}
3737
};
3838

3939
for meta in meta_list {
4040
if let Err(e) = ret.add_meta(meta) {
41-
cx.error(&e.to_string(), e.span());
41+
cx.add_error(e);
4242
}
4343
}
4444
}

oauth1-request-derive/src/util.rs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ mod oauth_parameter;
33
pub use oauth_parameter::OAuthParameter;
44

55
use proc_macro2::{Ident, Span, TokenStream, TokenTree};
6-
use quote::{quote_spanned, ToTokens};
6+
use quote::ToTokens;
77

88
impl OAuthParameter {
99
fn serialize_method_name(self) -> Option<&'static str> {
@@ -30,9 +30,3 @@ impl ToTokens for OAuthParameter {
3030
tokens.extend(::core::iter::once(TokenTree::Ident(ident)));
3131
}
3232
}
33-
34-
pub fn error(msg: &str, span: Span) -> TokenStream {
35-
quote_spanned!(span=>
36-
compile_error!(#msg);
37-
)
38-
}

0 commit comments

Comments
 (0)