1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#![allow(dead_code)]
use crate::core::token::{AstToken, Token};
use sway_core::{language::parsed::Declaration, transform};

pub fn attributes_map(token: &Token) -> Option<&transform::AttributesMap> {
    match &token.parsed {
        AstToken::Declaration(declaration) => match declaration {
            Declaration::EnumDeclaration(decl) => Some(&decl.attributes),
            Declaration::FunctionDeclaration(decl) => Some(&decl.attributes),
            Declaration::StructDeclaration(decl) => Some(&decl.attributes),
            Declaration::ConstantDeclaration(decl) => Some(&decl.attributes),
            Declaration::StorageDeclaration(decl) => Some(&decl.attributes),
            _ => None,
        },
        AstToken::FunctionDeclaration(decl) => Some(&decl.attributes),
        AstToken::StorageField(field) => Some(&field.attributes),
        AstToken::StructField(field) => Some(&field.attributes),
        AstToken::TraitFn(trait_fn) => Some(&trait_fn.attributes),
        AstToken::EnumVariant(variant) => Some(&variant.attributes),
        _ => None,
    }
}

pub fn doc_attributes(token: &Token) -> Option<&[transform::Attribute]> {
    attributes_map(token)
        .and_then(|attributes| attributes.get(&transform::AttributeKind::Doc))
        .map(Vec::as_slice)
}

pub fn storage_attributes(token: &Token) -> Option<&[transform::Attribute]> {
    attributes_map(token)
        .and_then(|attributes| attributes.get(&transform::AttributeKind::Storage))
        .map(Vec::as_slice)
}