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 ModuleKind {
49 pub fn friendly_name(&self) -> &'static str {
51 use ModuleKind::*;
52 match self {
53 Script { .. } => "module kind (script)",
54 Contract { .. } => "module kind (contract)",
55 Predicate { .. } => "module kind (predicate)",
56 Library { .. } => "module kind (library)",
57 }
58 }
59}
60
61impl Spanned for ModuleKind {
62 fn span(&self) -> Span {
63 match self {
64 Self::Script { script_token } => script_token.span(),
65 Self::Contract { contract_token } => contract_token.span(),
66 Self::Predicate { predicate_token } => predicate_token.span(),
67 Self::Library { library_token } => library_token.span(),
68 }
69 }
70}