miden_assembly/project/providers/
masm.rs1use 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}