sway_ast/item/
mod.rs

1use sway_error::handler::ErrorEmitted;
2
3use crate::priv_prelude::*;
4
5pub mod item_abi;
6pub mod item_configurable;
7pub mod item_const;
8pub mod item_enum;
9pub mod item_fn;
10pub mod item_impl;
11pub mod item_storage;
12pub mod item_struct;
13pub mod item_trait;
14pub mod item_type_alias;
15pub mod item_use;
16
17pub type Item = Annotated<ItemKind>;
18
19impl Spanned for Item {
20    fn span(&self) -> Span {
21        match self.attribute_list.first() {
22            Some(attr0) => Span::join(attr0.span(), &self.value.span()),
23            None => self.value.span(),
24        }
25    }
26}
27
28#[allow(clippy::large_enum_variant)]
29#[derive(Clone, Debug, Serialize)]
30pub enum ItemKind {
31    Submodule(Submodule),
32    Use(ItemUse),
33    Struct(ItemStruct),
34    Enum(ItemEnum),
35    Fn(ItemFn),
36    Trait(ItemTrait),
37    Impl(ItemImpl),
38    Abi(ItemAbi),
39    Const(ItemConst),
40    Storage(ItemStorage),
41    Configurable(ItemConfigurable),
42    TypeAlias(ItemTypeAlias),
43    // to handle parser recovery: Error represents an incomplete item
44    Error(Box<[Span]>, #[serde(skip_serializing)] ErrorEmitted),
45}
46
47impl Spanned for ItemKind {
48    fn span(&self) -> Span {
49        match self {
50            ItemKind::Submodule(item_mod) => item_mod.span(),
51            ItemKind::Use(item_use) => item_use.span(),
52            ItemKind::Struct(item_struct) => item_struct.span(),
53            ItemKind::Enum(item_enum) => item_enum.span(),
54            ItemKind::Fn(item_fn) => item_fn.span(),
55            ItemKind::Trait(item_trait) => item_trait.span(),
56            ItemKind::Impl(item_impl) => item_impl.span(),
57            ItemKind::Abi(item_abi) => item_abi.span(),
58            ItemKind::Const(item_const) => item_const.span(),
59            ItemKind::Storage(item_storage) => item_storage.span(),
60            ItemKind::Configurable(item_configurable) => item_configurable.span(),
61            ItemKind::TypeAlias(item_type_alias) => item_type_alias.span(),
62            ItemKind::Error(spans, _) => Span::join_all(spans.iter().cloned()),
63        }
64    }
65}
66
67#[derive(Clone, Debug, Serialize)]
68pub struct TypeField {
69    pub visibility: Option<PubToken>,
70    pub name: Ident,
71    pub colon_token: ColonToken,
72    pub ty: Ty,
73}
74
75impl Spanned for TypeField {
76    fn span(&self) -> Span {
77        let start = match &self.visibility {
78            Some(pub_token) => pub_token.span(),
79            None => self.name.span(),
80        };
81        let end = self.ty.span();
82        Span::join(start, &end)
83    }
84}
85
86#[derive(Clone, Debug, Serialize)]
87pub enum FnArgs {
88    Static(Punctuated<FnArg, CommaToken>),
89    NonStatic {
90        self_token: SelfToken,
91        ref_self: Option<RefToken>,
92        mutable_self: Option<MutToken>,
93        args_opt: Option<(CommaToken, Punctuated<FnArg, CommaToken>)>,
94    },
95}
96
97#[derive(Clone, Debug, Serialize)]
98pub struct FnArg {
99    pub pattern: Pattern,
100    pub colon_token: ColonToken,
101    pub ty: Ty,
102}
103
104impl Spanned for FnArg {
105    fn span(&self) -> Span {
106        Span::join(self.pattern.span(), &self.ty.span())
107    }
108}
109
110#[derive(Clone, Debug, Serialize)]
111pub struct FnSignature {
112    pub visibility: Option<PubToken>,
113    pub fn_token: FnToken,
114    pub name: Ident,
115    pub generics: Option<GenericParams>,
116    pub arguments: Parens<FnArgs>,
117    pub return_type_opt: Option<(RightArrowToken, Ty)>,
118    pub where_clause_opt: Option<WhereClause>,
119}
120
121impl Spanned for FnSignature {
122    fn span(&self) -> Span {
123        let start = match &self.visibility {
124            Some(pub_token) => pub_token.span(),
125            None => self.fn_token.span(),
126        };
127        let end = match &self.where_clause_opt {
128            Some(where_clause) => where_clause.span(),
129            None => match &self.return_type_opt {
130                Some((_right_arrow, ty)) => ty.span(),
131                None => self.arguments.span(),
132            },
133        };
134        Span::join(start, &end)
135    }
136}
137
138#[derive(Clone, Debug, Serialize)]
139pub struct TraitType {
140    pub name: Ident,
141    pub type_token: TypeToken,
142    pub eq_token_opt: Option<EqToken>,
143    pub ty_opt: Option<Ty>,
144    pub semicolon_token: SemicolonToken,
145}
146
147impl Spanned for TraitType {
148    fn span(&self) -> Span {
149        let start = self.type_token.span();
150        let end = match &self.ty_opt {
151            Some(ty_opt) => ty_opt.span(),
152            None => self.name.span(),
153        };
154        Span::join(start, &end)
155    }
156}