summaryrefslogtreecommitdiffstats
path: root/vendor/thiserror-impl/src/attr.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/thiserror-impl/src/attr.rs')
-rw-r--r--vendor/thiserror-impl/src/attr.rs38
1 files changed, 24 insertions, 14 deletions
diff --git a/vendor/thiserror-impl/src/attr.rs b/vendor/thiserror-impl/src/attr.rs
index 9963fd6db..0b1b89dce 100644
--- a/vendor/thiserror-impl/src/attr.rs
+++ b/vendor/thiserror-impl/src/attr.rs
@@ -2,9 +2,9 @@ use proc_macro2::{Delimiter, Group, Span, TokenStream, TokenTree};
use quote::{format_ident, quote, ToTokens};
use std::collections::BTreeSet as Set;
use std::iter::FromIterator;
-use syn::parse::{Nothing, ParseStream};
+use syn::parse::ParseStream;
use syn::{
- braced, bracketed, parenthesized, token, Attribute, Error, Ident, Index, LitInt, LitStr,
+ braced, bracketed, parenthesized, token, Attribute, Error, Ident, Index, LitInt, LitStr, Meta,
Result, Token,
};
@@ -54,24 +54,27 @@ pub fn get(input: &[Attribute]) -> Result<Attrs> {
};
for attr in input {
- if attr.path.is_ident("error") {
+ if attr.path().is_ident("error") {
parse_error_attribute(&mut attrs, attr)?;
- } else if attr.path.is_ident("source") {
+ } else if attr.path().is_ident("source") {
require_empty_attribute(attr)?;
if attrs.source.is_some() {
return Err(Error::new_spanned(attr, "duplicate #[source] attribute"));
}
attrs.source = Some(attr);
- } else if attr.path.is_ident("backtrace") {
+ } else if attr.path().is_ident("backtrace") {
require_empty_attribute(attr)?;
if attrs.backtrace.is_some() {
return Err(Error::new_spanned(attr, "duplicate #[backtrace] attribute"));
}
attrs.backtrace = Some(attr);
- } else if attr.path.is_ident("from") {
- if !attr.tokens.is_empty() {
- // Assume this is meant for derive_more crate or something.
- continue;
+ } else if attr.path().is_ident("from") {
+ match attr.meta {
+ Meta::Path(_) => {}
+ Meta::List(_) | Meta::NameValue(_) => {
+ // Assume this is meant for derive_more crate or something.
+ continue;
+ }
}
if attrs.from.is_some() {
return Err(Error::new_spanned(attr, "duplicate #[from] attribute"));
@@ -166,21 +169,21 @@ fn parse_token_expr(input: ParseStream, mut begin_expr: bool) -> Result<TokenStr
let delimiter = parenthesized!(content in input);
let nested = parse_token_expr(&content, true)?;
let mut group = Group::new(Delimiter::Parenthesis, nested);
- group.set_span(delimiter.span);
+ group.set_span(delimiter.span.join());
TokenTree::Group(group)
} else if input.peek(token::Brace) {
let content;
let delimiter = braced!(content in input);
let nested = parse_token_expr(&content, true)?;
let mut group = Group::new(Delimiter::Brace, nested);
- group.set_span(delimiter.span);
+ group.set_span(delimiter.span.join());
TokenTree::Group(group)
} else if input.peek(token::Bracket) {
let content;
let delimiter = bracketed!(content in input);
let nested = parse_token_expr(&content, true)?;
let mut group = Group::new(Delimiter::Bracket, nested);
- group.set_span(delimiter.span);
+ group.set_span(delimiter.span.join());
TokenTree::Group(group)
} else {
input.parse()?
@@ -191,8 +194,15 @@ fn parse_token_expr(input: ParseStream, mut begin_expr: bool) -> Result<TokenStr
}
fn require_empty_attribute(attr: &Attribute) -> Result<()> {
- syn::parse2::<Nothing>(attr.tokens.clone())?;
- Ok(())
+ let error_span = match &attr.meta {
+ Meta::Path(_) => return Ok(()),
+ Meta::List(meta) => meta.delimiter.span().open(),
+ Meta::NameValue(meta) => meta.eq_token.span,
+ };
+ Err(Error::new(
+ error_span,
+ "unexpected token in thiserror attribute",
+ ))
}
impl ToTokens for Display<'_> {