Skip to main content

miden_assembly/linker/
library.rs

1use alloc::{sync::Arc, vec::Vec};
2
3use miden_assembly_syntax::{Library, library::ModuleInfo};
4use miden_core::mast::MastForest;
5use miden_mast_package::Package;
6use miden_project::Linkage;
7/// Prefer to use [`miden_project::Linkage`], as this will be removed in a future release
8pub use miden_project::Linkage as LinkLibraryKind;
9
10/// Represents an assembled module or modules to use when resolving references while linking,
11/// as well as the method by which referenced symbols will be linked into the assembled MAST.
12#[derive(Clone)]
13pub struct LinkLibrary {
14    /// The MAST of this library
15    pub mast: Arc<MastForest>,
16    /// Metadata about the modules and symbols available in the linked forest
17    pub module_infos: Vec<ModuleInfo>,
18    /// How to link against this library
19    pub linkage: Linkage,
20}
21
22impl LinkLibrary {
23    /// Construct a [LinkLibrary] from a [miden_mast_package::Package]
24    pub fn from_package(package: Arc<Package>) -> Self {
25        let mast = package.mast.mast_forest().clone();
26        let module_infos = package
27            .mast
28            .module_infos()
29            .map(|mut mi| {
30                mi.set_version(package.version.clone());
31                mi
32            })
33            .collect();
34        Self {
35            mast,
36            module_infos,
37            linkage: Linkage::Dynamic,
38        }
39    }
40
41    pub(crate) fn from_library(library: &Library) -> Self {
42        let mast = library.mast_forest().clone();
43        let module_infos = library.module_infos().collect();
44        Self {
45            mast,
46            module_infos,
47            linkage: Linkage::Dynamic,
48        }
49    }
50
51    /// Modify the linkage of this library
52    pub fn with_linkage(mut self, linkage: Linkage) -> Self {
53        self.linkage = linkage;
54        self
55    }
56}