sway_ast/item/
item_storage.rs

1use crate::priv_prelude::*;
2
3#[derive(Clone, Debug, Serialize)]
4pub struct ItemStorage {
5    pub storage_token: StorageToken,
6    pub entries: Braces<Punctuated<Annotated<StorageEntry>, CommaToken>>,
7}
8
9impl Spanned for ItemStorage {
10    fn span(&self) -> Span {
11        Span::join(self.storage_token.span(), &self.entries.span())
12    }
13}
14
15#[derive(Clone, Debug, Serialize)]
16
17pub struct StorageEntry {
18    pub name: Ident,
19    pub namespace: Option<Braces<Punctuated<Annotated<Box<StorageEntry>>, CommaToken>>>,
20    pub field: Option<StorageField>,
21}
22
23impl StorageEntry {
24    /// Friendly name of the [StorageEntry] kind, namespace or field,
25    /// used for various reportings.
26    pub fn friendly_kind_name(&self) -> &'static str {
27        if self.namespace.is_some() {
28            "storage namespace"
29        } else {
30            "storage field"
31        }
32    }
33}
34
35impl Spanned for StorageEntry {
36    fn span(&self) -> Span {
37        if let Some(namespace) = &self.namespace {
38            Span::join(self.name.span(), &namespace.span())
39        } else if let Some(field) = &self.field {
40            Span::join(self.name.span(), &field.span())
41        } else {
42            self.name.span()
43        }
44    }
45}
46
47#[derive(Clone, Debug, Serialize)]
48
49pub struct StorageField {
50    pub name: Ident,
51    pub in_token: Option<InToken>,
52    pub key_expr: Option<Expr>,
53    pub colon_token: ColonToken,
54    pub ty: Ty,
55    pub eq_token: EqToken,
56    pub initializer: Expr,
57}
58
59impl Spanned for StorageField {
60    fn span(&self) -> Span {
61        Span::join_all([
62            self.name.span(),
63            self.colon_token.span(),
64            self.ty.span(),
65            self.eq_token.span(),
66            self.initializer.span(),
67        ])
68    }
69}