syn_solidity/item/
error.rs

1use crate::{ParameterList, SolIdent, Spanned, Type, kw};
2use proc_macro2::Span;
3use std::fmt;
4use syn::{
5    Attribute, Result, Token, parenthesized,
6    parse::{Parse, ParseStream},
7    token::Paren,
8};
9
10/// An error definition: `error Foo(uint256 a, uint256 b);`.
11///
12/// Solidity reference:
13/// <https://docs.soliditylang.org/en/latest/grammar.html#a4.SolidityParser.errorDefinition>
14#[derive(Clone)]
15pub struct ItemError {
16    pub attrs: Vec<Attribute>,
17    pub error_token: kw::error,
18    pub name: SolIdent,
19    pub paren_token: Paren,
20    pub parameters: ParameterList,
21    pub semi_token: Token![;],
22}
23
24impl fmt::Display for ItemError {
25    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
26        write!(f, "error {}({});", self.name, self.parameters)
27    }
28}
29
30impl fmt::Debug for ItemError {
31    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
32        f.debug_struct("ItemError")
33            .field("attrs", &self.attrs)
34            .field("name", &self.name)
35            .field("fields", &self.parameters)
36            .finish()
37    }
38}
39
40impl Parse for ItemError {
41    fn parse(input: ParseStream<'_>) -> Result<Self> {
42        let content;
43        Ok(Self {
44            attrs: input.call(Attribute::parse_outer)?,
45            error_token: input.parse()?,
46            name: input.parse()?,
47            paren_token: parenthesized!(content in input),
48            parameters: content.parse()?,
49            semi_token: input.parse()?,
50        })
51    }
52}
53
54impl Spanned for ItemError {
55    fn span(&self) -> Span {
56        self.name.span()
57    }
58
59    fn set_span(&mut self, span: Span) {
60        self.name.set_span(span);
61    }
62}
63
64impl ItemError {
65    pub fn as_type(&self) -> Type {
66        let mut ty = Type::Tuple(self.parameters.types().cloned().collect());
67        ty.set_span(self.span());
68        ty
69    }
70}