sway_ast/item/
item_trait.rs1use 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 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}