Skip to content

Commit

Permalink
derive: Refactor to use syn::Error::to_compile_error
Browse files Browse the repository at this point in the history
  • Loading branch information
tesaguri committed Sep 8, 2024
1 parent 95414b5 commit f57dbf1
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 32 deletions.
35 changes: 18 additions & 17 deletions oauth1-request-derive/src/ctxt.rs
Original file line number Diff line number Diff line change
@@ -1,40 +1,41 @@
use core::fmt::Display;
use std::mem;

use proc_macro2::{Span, TokenStream};
use quote::ToTokens;

use crate::util::error;
use proc_macro2::Span;
use syn::Error;

pub struct Ctxt {
errors: Option<TokenStream>,
error: Option<Error>,
}

impl Ctxt {
pub fn new() -> Self {
Self {
errors: Some(TokenStream::new()),
Self { error: None }
}

pub fn add_error(&mut self, error: Error) {
if let Some(ref mut e) = self.error {
e.combine(error);
} else {
self.error = Some(error);
}
}

pub fn error(&mut self, msg: &str, span: Span) {
error(msg, span).to_tokens(self.errors.as_mut().unwrap());
pub fn add_error_message<T: Display>(&mut self, span: Span, msg: T) {
self.add_error(Error::new(span, msg));
}

pub fn emit_errors(mut self) -> Option<TokenStream> {
let errors = self.errors.take().unwrap();
pub fn take_error(mut self) -> Option<Error> {
let error = self.error.take();
mem::forget(self);
if errors.is_empty() {
None
} else {
Some(errors)
}
error
}
}

impl Drop for Ctxt {
fn drop(&mut self) {
if !std::thread::panicking() {
panic!("must call `Ctxt::emit_errors`");
panic!("must call `Ctxt::take_error`");
}
}
}
17 changes: 11 additions & 6 deletions oauth1-request-derive/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ mod util;
use proc_macro2::{Span, TokenStream};
use proc_macro_crate::FoundCrate;
use quote::{quote, quote_spanned};
use syn::spanned::Spanned;
use syn::{
parse_macro_input, parse_quote, Data, DataStruct, DeriveInput, Fields, GenericParam, Generics,
Ident,
Expand All @@ -38,7 +37,6 @@ use self::container::ContainerMeta;
use self::ctxt::Ctxt;
use self::field::Field;
use self::method_body::MethodBody;
use self::util::error;

/// A derive macro for [`oauth1_request::Request`][Request] trait.
///
Expand All @@ -59,7 +57,10 @@ fn expand_derive_oauth1_authorize(input: DeriveInput) -> TokenStream {
fields: Fields::Named(fields),
..
}) => fields,
_ => return error("expected a struct with named fields", input.span()),
_ => {
return syn::Error::new_spanned(input, "expected a struct with named fields")
.into_compile_error()
}
};

let mut cx = Ctxt::new();
Expand All @@ -81,7 +82,7 @@ fn expand_derive_oauth1_authorize(input: DeriveInput) -> TokenStream {
let name = f.name();
let (name, span) = (name.string_value(), name.span());
if name == prev_name {
cx.error(&format!("duplicate parameter \"{}\"", name), span);
cx.add_error_message(span, format!("duplicate parameter \"{}\"", name));
}
name
});
Expand All @@ -105,7 +106,10 @@ fn expand_derive_oauth1_authorize(input: DeriveInput) -> TokenStream {
&*krate
}
Err(proc_macro_crate::Error::CargoManifestDirNotSet) => "oauth1_request",
Err(e) => panic!("{:?}", e),
Err(e) => {
cx.add_error_message(Span::call_site(), e);
"oauth1_request"
}
};
let krate = Ident::new(krate, Span::call_site());
quote! {
Expand All @@ -116,7 +120,8 @@ fn expand_derive_oauth1_authorize(input: DeriveInput) -> TokenStream {
add_trait_bounds(&mut generics);
let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();

if let Some(mut tokens) = cx.emit_errors() {
if let Some(e) = cx.take_error() {
let mut tokens = e.into_compile_error();
tokens.extend(quote! {
const _: () = {
#use_oauth1_request
Expand Down
4 changes: 2 additions & 2 deletions oauth1-request-derive/src/meta.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,14 @@ macro_rules! def_meta {
let meta_list = match attr.parse_args_with(parser) {
Ok(list) => list,
Err(e) => {
cx.error(&e.to_string(), e.span());
cx.add_error(e);
continue;
}
};

for meta in meta_list {
if let Err(e) = ret.add_meta(meta) {
cx.error(&e.to_string(), e.span());
cx.add_error(e);
}
}
}
Expand Down
8 changes: 1 addition & 7 deletions oauth1-request-derive/src/util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ mod oauth_parameter;
pub use oauth_parameter::OAuthParameter;

use proc_macro2::{Ident, Span, TokenStream, TokenTree};
use quote::{quote_spanned, ToTokens};
use quote::ToTokens;

impl OAuthParameter {
fn serialize_method_name(self) -> Option<&'static str> {
Expand All @@ -30,9 +30,3 @@ impl ToTokens for OAuthParameter {
tokens.extend(::core::iter::once(TokenTree::Ident(ident)));
}
}

pub fn error(msg: &str, span: Span) -> TokenStream {
quote_spanned!(span=>
compile_error!(#msg);
)
}

0 comments on commit f57dbf1

Please sign in to comment.