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}