sway_ast/
module.rs

1use sway_types::SourceId;
2
3use crate::priv_prelude::*;
4
5#[derive(Clone, Debug, Serialize)]
6pub struct Module {
7    pub kind: ModuleKind,
8    pub semicolon_token: SemicolonToken,
9    pub items: Vec<Item>,
10}
11
12impl Module {
13    pub fn submodules(&self) -> impl Iterator<Item = &Submodule> {
14        self.items.iter().filter_map(|i| {
15            if let ItemKind::Submodule(submod) = &i.value {
16                Some(submod)
17            } else {
18                None
19            }
20        })
21    }
22
23    pub fn source_id(&self) -> Option<SourceId> {
24        self.kind.span().source_id().copied()
25    }
26}
27
28impl Spanned for Module {
29    fn span(&self) -> Span {
30        let start = self.kind.span();
31        let end = if let Some(item) = self.items.last() {
32            item.span()
33        } else {
34            self.semicolon_token.span()
35        };
36        Span::join(start, &end)
37    }
38}
39
40#[derive(Clone, Debug, Serialize)]
41pub enum ModuleKind {
42    Script { script_token: ScriptToken },
43    Contract { contract_token: ContractToken },
44    Predicate { predicate_token: PredicateToken },
45    Library { library_token: LibraryToken },
46}
47
48impl Spanned for ModuleKind {
49    fn span(&self) -> Span {
50        match self {
51            Self::Script { script_token } => script_token.span(),
52            Self::Contract { contract_token } => contract_token.span(),
53            Self::Predicate { predicate_token } => predicate_token.span(),
54            Self::Library { library_token } => library_token.span(),
55        }
56    }
57}