sway_ast/item/
item_trait.rs

1use sway_error::handler::ErrorEmitted;
2
3use crate::priv_prelude::*;
4
5#[derive(Clone, Debug, Serialize)]
6pub enum ItemTraitItem {
7    Fn(FnSignature, Option<SemicolonToken>),
8    Const(ItemConst, Option<SemicolonToken>),
9    Type(TraitType, Option<SemicolonToken>),
10    // to handle parser recovery: Error represents an incomplete trait item
11    Error(Box<[Span]>, #[serde(skip_serializing)] ErrorEmitted),
12}
13
14#[derive(Clone, Debug, Serialize)]
15pub struct ItemTrait {
16    pub visibility: Option<PubToken>,
17    pub trait_token: TraitToken,
18    pub name: Ident,
19    pub generics: Option<GenericParams>,
20    pub where_clause_opt: Option<WhereClause>,
21    pub super_traits: Option<(ColonToken, Traits)>,
22    pub trait_items: Braces<Vec<Annotated<ItemTraitItem>>>,
23    pub trait_defs_opt: Option<Braces<Vec<Annotated<ItemFn>>>>,
24}
25
26impl Spanned for ItemTrait {
27    fn span(&self) -> Span {
28        let start = match &self.visibility {
29            Some(pub_token) => pub_token.span(),
30            None => self.trait_token.span(),
31        };
32        let end = match &self.trait_defs_opt {
33            Some(trait_defs) => trait_defs.span(),
34            None => self.trait_items.span(),
35        };
36        Span::join(start, &end)
37    }
38}
39
40impl Spanned for ItemTraitItem {
41    fn span(&self) -> Span {
42        match self {
43            ItemTraitItem::Fn(fn_decl, semicolon) => match semicolon.as_ref().map(|x| x.span()) {
44                Some(semicolon) => Span::join(fn_decl.span(), &semicolon),
45                None => fn_decl.span(),
46            },
47            ItemTraitItem::Const(const_decl, semicolon) => {
48                match semicolon.as_ref().map(|x| x.span()) {
49                    Some(semicolon) => Span::join(const_decl.span(), &semicolon),
50                    None => const_decl.span(),
51                }
52            }
53            ItemTraitItem::Type(type_decl, semicolon) => {
54                match semicolon.as_ref().map(|x| x.span()) {
55                    Some(semicolon) => Span::join(type_decl.span(), &semicolon),
56                    None => type_decl.span(),
57                }
58            }
59            ItemTraitItem::Error(spans, _) => Span::join_all(spans.iter().cloned()),
60        }
61    }
62}
63
64#[derive(Clone, Debug, Serialize)]
65pub struct Traits {
66    pub prefix: PathType,
67    pub suffixes: Vec<(AddToken, PathType)>,
68}
69
70impl Traits {
71    pub fn iter(&self) -> impl Iterator<Item = &PathType> {
72        vec![&self.prefix]
73            .into_iter()
74            .chain(self.suffixes.iter().map(|(_add_token, path)| path))
75    }
76
77    pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut PathType> {
78        vec![&mut self.prefix]
79            .into_iter()
80            .chain(self.suffixes.iter_mut().map(|(_add_token, path)| path))
81    }
82}
83
84impl Spanned for Traits {
85    fn span(&self) -> Span {
86        match self.suffixes.last() {
87            Some((_add_token, path_type)) => Span::join(self.prefix.span(), &path_type.span()),
88            None => self.prefix.span(),
89        }
90    }
91}