Skip to main content

miden_assembly/project/providers/
masm.rs

1use miden_assembly_syntax::debuginfo::Spanned;
2
3use super::*;
4
5pub struct MasmSourceProvider;
6
7impl ProjectSourceProvider for MasmSourceProvider {
8    fn file_type(&self) -> &'static str {
9        "masm"
10    }
11
12    fn provide_sources(
13        &self,
14        context: &TargetAssemblyContext<'_>,
15    ) -> Result<ProjectSourceInputs, Report> {
16        let TargetAssemblyContext {
17            target,
18            resolved_target_root,
19            source_manager,
20            warnings_as_errors,
21            ..
22        } = context;
23
24        let namespace = target.namespace.inner().clone();
25        let kind = target_root_module_kind(target.ty);
26        let (root, support) = miden_assembly_syntax::parser::read_modules_from_root(
27            resolved_target_root,
28            Some(namespace),
29            Some(kind),
30            source_manager.clone(),
31            *warnings_as_errors,
32        )?;
33
34        Ok(ProjectSourceInputs { root, support })
35    }
36
37    fn provide_source_provenance(
38        &self,
39        context: &TargetAssemblyContext<'_>,
40    ) -> Result<ProjectSourceProvenanceInputs, Report> {
41        let root_path = context.resolved_target_root.as_ref();
42        let namespace = context.target.namespace.inner().clone();
43        let kind = target_root_module_kind(context.target.ty);
44        let (root, support_modules) = miden_assembly_syntax::parser::read_modules_from_root(
45            root_path,
46            Some(namespace),
47            Some(kind),
48            context.source_manager.clone(),
49            context.warnings_as_errors,
50        )?;
51
52        let root = {
53            let source_file = context.source_manager.get(root.span().source_id()).unwrap();
54            SourceFileProvenance {
55                path: source_file.uri().to_path().unwrap().into_boxed_path(),
56                content: source_file.as_str().to_string().into_boxed_str(),
57            }
58        };
59
60        let mut support = Vec::with_capacity(support_modules.len());
61        for module in support_modules.iter() {
62            let source_file = context.source_manager.get(module.span().source_id()).unwrap();
63            support.push(SourceFileProvenance {
64                path: source_file.uri().to_path().unwrap().into_boxed_path(),
65                content: source_file.as_str().to_string().into_boxed_str(),
66            });
67        }
68
69        Ok(ProjectSourceProvenanceInputs { root, support })
70    }
71}
72
73fn target_root_module_kind(ty: TargetType) -> ModuleKind {
74    match ty {
75        TargetType::Executable => ModuleKind::Executable,
76        TargetType::Kernel => ModuleKind::Kernel,
77        _ => ModuleKind::Library,
78    }
79}