miden_assembly_syntax/ast/
form.rs

1use alloc::string::String;
2
3use miden_debug_types::{SourceSpan, Span, Spanned};
4
5use super::{
6    AdviceMapEntry, Alias, Block, Constant, EnumType, Export, Procedure, TypeAlias, TypeDecl,
7};
8
9/// This type represents the top-level forms of a Miden Assembly module
10#[derive(Debug, PartialEq, Eq)]
11pub enum Form {
12    /// A documentation string for the entire module
13    ModuleDoc(Span<String>),
14    /// A documentation string
15    Doc(Span<String>),
16    /// A type declaration
17    Type(TypeAlias),
18    /// An enum type/constant declaration
19    Enum(EnumType),
20    /// A constant definition, possibly unresolved
21    Constant(Constant),
22    /// An executable block, represents a program entrypoint
23    Begin(Block),
24    /// A procedure
25    Procedure(Procedure),
26    /// A foreign item alias
27    Alias(Alias),
28    /// An entry into the Advice Map
29    AdviceMapEntry(AdviceMapEntry),
30}
31
32impl From<Span<String>> for Form {
33    fn from(doc: Span<String>) -> Self {
34        Self::Doc(doc)
35    }
36}
37
38impl From<TypeAlias> for Form {
39    fn from(value: TypeAlias) -> Self {
40        Self::Type(value)
41    }
42}
43
44impl From<EnumType> for Form {
45    fn from(value: EnumType) -> Self {
46        Self::Enum(value)
47    }
48}
49
50impl From<Constant> for Form {
51    fn from(constant: Constant) -> Self {
52        Self::Constant(constant)
53    }
54}
55
56impl From<Alias> for Form {
57    fn from(alias: Alias) -> Self {
58        Self::Alias(alias)
59    }
60}
61
62impl From<Block> for Form {
63    fn from(block: Block) -> Self {
64        Self::Begin(block)
65    }
66}
67
68impl From<Export> for Form {
69    fn from(item: Export) -> Self {
70        match item {
71            Export::Alias(item) => Self::Alias(item),
72            Export::Constant(item) => Self::Constant(item),
73            Export::Type(TypeDecl::Alias(item)) => Self::Type(item),
74            Export::Type(TypeDecl::Enum(item)) => Self::Enum(item),
75            Export::Procedure(item) => Self::Procedure(item),
76        }
77    }
78}
79
80impl Spanned for Form {
81    fn span(&self) -> SourceSpan {
82        match self {
83            Self::ModuleDoc(spanned) | Self::Doc(spanned) => spanned.span(),
84            Self::Type(spanned) => spanned.span(),
85            Self::Enum(spanned) => spanned.span(),
86            Self::Constant(Constant { span, .. })
87            | Self::AdviceMapEntry(AdviceMapEntry { span, .. }) => *span,
88            Self::Begin(spanned) => spanned.span(),
89            Self::Procedure(spanned) => spanned.span(),
90            Self::Alias(spanned) => spanned.span(),
91        }
92    }
93}