use alloc::{string::String, sync::Arc};
use miden_debug_types::{SourceSpan, Span, Spanned};
use super::{
AdviceMapEntry, Block, Constant, EnumType, Ident, ImportDecl, Item, Path, Procedure,
SubmoduleDecl, TypeAlias, TypeDecl,
};
#[derive(Debug, PartialEq, Eq)]
pub enum Form {
ModuleDoc(Span<String>),
Doc(Span<String>),
Namespace(Span<Arc<Path>>),
ExternPackage(Ident),
Submodule(SubmoduleDecl),
Type(TypeAlias),
Enum(EnumType),
Constant(Constant),
Begin(Block),
Procedure(Procedure),
Import(ImportDecl),
AdviceMapEntry(AdviceMapEntry),
}
impl From<Span<String>> for Form {
fn from(doc: Span<String>) -> Self {
Self::Doc(doc)
}
}
impl From<SubmoduleDecl> for Form {
fn from(value: SubmoduleDecl) -> Self {
Self::Submodule(value)
}
}
impl From<TypeAlias> for Form {
fn from(value: TypeAlias) -> Self {
Self::Type(value)
}
}
impl From<EnumType> for Form {
fn from(value: EnumType) -> Self {
Self::Enum(value)
}
}
impl From<Constant> for Form {
fn from(constant: Constant) -> Self {
Self::Constant(constant)
}
}
impl From<ImportDecl> for Form {
fn from(import: ImportDecl) -> Self {
Self::Import(import)
}
}
impl From<Block> for Form {
fn from(block: Block) -> Self {
Self::Begin(block)
}
}
impl From<Item> for Form {
fn from(item: Item) -> Self {
match item {
Item::Constant(item) => Self::Constant(item),
Item::Type(TypeDecl::Alias(item)) => Self::Type(item),
Item::Type(TypeDecl::Enum(item)) => Self::Enum(item),
Item::Procedure(item) => Self::Procedure(item),
}
}
}
impl Spanned for Form {
fn span(&self) -> SourceSpan {
match self {
Self::Namespace(spanned) => spanned.span(),
Self::ExternPackage(spanned) => spanned.span(),
Self::Submodule(spanned) => spanned.name.span(),
Self::ModuleDoc(spanned) | Self::Doc(spanned) => spanned.span(),
Self::Type(spanned) => spanned.span(),
Self::Enum(spanned) => spanned.span(),
Self::Constant(Constant { span, .. })
| Self::AdviceMapEntry(AdviceMapEntry { span, .. }) => *span,
Self::Begin(spanned) => spanned.span(),
Self::Procedure(spanned) => spanned.span(),
Self::Import(spanned) => spanned.span(),
}
}
}