1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
use crate::{
compilation::compiled_package::make_source_and_deps_for_compiler,
resolution::resolution_graph::ResolvedGraph, ModelConfig,
};
use anyhow::Result;
use move_compiler::shared::PackagePaths;
use move_model::{model::GlobalEnv, options::ModelBuilderOptions, run_model_builder_with_options};
#[derive(Debug, Clone)]
pub struct ModelBuilder {
resolution_graph: ResolvedGraph,
model_config: ModelConfig,
}
impl ModelBuilder {
pub fn create(resolution_graph: ResolvedGraph, model_config: ModelConfig) -> Self {
Self {
resolution_graph,
model_config,
}
}
pub fn build_model(&self) -> Result<GlobalEnv> {
for (pkg_name, pkg) in self.resolution_graph.package_table.iter() {
if !pkg.renaming.is_empty() {
anyhow::bail!(
"Found address renaming in package '{}' when \
building Move model -- this is currently not supported",
pkg_name
)
}
}
let root_name = &self.resolution_graph.root_package.package.name;
let root_package = self.resolution_graph.get_package(root_name).clone();
let deps_source_info = self
.resolution_graph
.package_table
.iter()
.filter_map(|(nm, pkg)| {
if nm == root_name {
return None;
}
let dep_source_paths = pkg
.get_sources(&self.resolution_graph.build_options)
.unwrap();
Some(Ok((*nm, dep_source_paths, &pkg.resolution_table)))
})
.collect::<Result<Vec<_>>>()?;
let (target, deps) = make_source_and_deps_for_compiler(
&self.resolution_graph,
&root_package,
deps_source_info,
)?;
let (all_targets, all_deps) = if self.model_config.all_files_as_targets {
let mut targets = vec![target];
targets.extend(deps.into_iter());
(targets, vec![])
} else {
(vec![target], deps)
};
let (all_targets, all_deps) = match &self.model_config.target_filter {
Some(filter) => {
let mut new_targets = vec![];
let mut new_deps = all_deps;
for PackagePaths {
name,
paths,
named_address_map,
} in all_targets
{
let (true_targets, false_targets): (Vec<_>, Vec<_>) =
paths.into_iter().partition(|t| t.contains(filter));
if !true_targets.is_empty() {
new_targets.push(PackagePaths {
name,
paths: true_targets,
named_address_map: named_address_map.clone(),
})
}
if !false_targets.is_empty() {
new_deps.push(PackagePaths {
name,
paths: false_targets,
named_address_map,
})
}
}
(new_targets, new_deps)
}
None => (all_targets, all_deps),
};
run_model_builder_with_options(all_targets, all_deps, ModelBuilderOptions::default())
}
}