Skip to content

Commit b9a3348

Browse files
committed
A few fixes to move-analyzer and a small optimization to reuse a regex rather than creating a new one every time
1 parent bae8f68 commit b9a3348

File tree

5 files changed

+65
-34
lines changed

5 files changed

+65
-34
lines changed

external-crates/move/crates/move-analyzer/src/symbols/compilation.rs

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -339,13 +339,19 @@ pub fn get_compiled_pkg<F: MoveFlavor>(
339339

340340
let root_pkg = load_root_pkg::<F>(&build_config, pkg_path)?;
341341
let root_pkg_name = Symbol::from(root_pkg.name().to_string());
342+
// the package's transitive dependencies
343+
let dependencies: Vec<_> = root_pkg
344+
.packages()
345+
.into_iter()
346+
.filter(|x| !x.is_root())
347+
.collect();
342348
let build_plan =
343349
BuildPlan::create(&root_pkg, &build_config)?.set_compiler_vfs_root(overlay_fs_root.clone());
344350

345-
let mapped_files_data =
346-
compute_mapped_files(&root_pkg, &build_config, overlay_fs_root.clone())?;
347351
// Hash dependencies so we can check if something has changed.
348352
// TODO: do we still need this?
353+
let mapped_files_data =
354+
compute_mapped_files(&root_pkg, &build_config, overlay_fs_root.clone())?;
349355
let file_paths: Arc<BTreeMap<FileHash, PathBuf>> = Arc::new(
350356
mapped_files_data
351357
.files
@@ -361,9 +367,6 @@ pub fn get_compiled_pkg<F: MoveFlavor>(
361367
let mut compiler_analysis_info_opt = None;
362368
let mut compiler_autocomplete_info_opt = None;
363369

364-
// TODO: we need to rework on loading the root pkg only once.
365-
let dependencies = root_pkg.packages();
366-
367370
let compiler_flags = compiler_flags(&build_config);
368371
let (mut caching_result, other_diags) = if let Ok(deps_package_paths) =
369372
make_deps_for_compiler(&mut Vec::new(), dependencies, &build_config)
@@ -435,14 +438,21 @@ pub fn get_compiled_pkg<F: MoveFlavor>(
435438
)
436439
}
437440
None => {
438-
let sorted_deps = root_pkg.sorted_deps();
439-
let sorted_deps: Vec<PackageName> = sorted_deps.into_iter().cloned().collect();
441+
// get the topologically sorted dependencies, but use the package ids instead of
442+
// package names. In the new pkg system, multiple packages with the same name can
443+
// exist as the package system will assign unique package ids to them, before
444+
// passing them to the compiler.
445+
let sorted_deps: Result<Vec<_>> = root_pkg
446+
.sorted_deps_ids()
447+
.into_iter()
448+
.map(|x| PackageName::new(x.to_string()))
449+
.collect();
440450
if let Some((program_deps, dep_names)) = compute_pre_compiled_dep_data(
441451
&mut cached_packages.compiled_dep_pkgs,
442452
mapped_files_data.dep_pkg_paths,
443453
src_deps,
444454
root_pkg_name,
445-
&sorted_deps,
455+
&sorted_deps?,
446456
compiler_flags,
447457
overlay_fs_root.clone(),
448458
) {
@@ -509,7 +519,7 @@ pub fn get_compiled_pkg<F: MoveFlavor>(
509519
let mut ide_diags = lsp_empty_diagnostics(mapped_files_data.files.file_name_mapping());
510520
if full_compilation || !files_to_compile.is_empty() {
511521
build_plan.compile_with_driver(
512-
// dependencies,
522+
//dependencies,
513523
&mut std::io::sink(),
514524
|compiler| {
515525
let compiler = compiler.set_ide_mode();
@@ -548,7 +558,6 @@ pub fn get_compiled_pkg<F: MoveFlavor>(
548558
let failure = true;
549559
diagnostics = Some((diags, failure));
550560
eprintln!("typed AST compilation failed");
551-
eprintln!("diagnostics: {:#?}", diagnostics);
552561
return Ok((files, vec![]));
553562
}
554563
};
@@ -827,10 +836,7 @@ fn compute_mapped_files<F: MoveFlavor>(
827836
if is_dep {
828837
hasher.update(fhash.0);
829838
dep_hashes.push(fhash);
830-
dep_pkg_paths.insert(
831-
rpkg.name().as_str().into(),
832-
rpkg.path().path().to_path_buf(),
833-
);
839+
dep_pkg_paths.insert(rpkg.id().clone().into(), rpkg.path().path().to_path_buf());
834840
}
835841
// write to top layer of the overlay file system so that the content
836842
// is immutable for the duration of compilation and symbolication

external-crates/move/crates/move-package-alt-compilation/src/build_plan.rs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,16 @@ impl<'a, F: MoveFlavor> BuildPlan<'a, F> {
8787
)?;
8888

8989
let project_root = self.root_pkg.package_path();
90-
let sorted_deps = self.root_pkg.sorted_deps().into_iter().cloned().collect();
90+
let sorted_deps: Result<BTreeSet<_>, _> = self
91+
.root_pkg
92+
.sorted_deps()
93+
.into_iter()
94+
.map(|x| PackageName::new(x))
95+
.collect();
9196

9297
self.clean(
9398
&project_root.join(CompiledPackageLayout::Root.path()),
94-
sorted_deps,
99+
sorted_deps?,
95100
)?;
96101

97102
Ok(compiled)
@@ -183,11 +188,17 @@ impl<'a, F: MoveFlavor> BuildPlan<'a, F> {
183188
};
184189

185190
let project_root = self.root_pkg.package_path();
186-
let sorted_deps = self.root_pkg.sorted_deps().into_iter().cloned().collect();
191+
192+
let sorted_deps: Result<BTreeSet<_>, _> = self
193+
.root_pkg
194+
.sorted_deps()
195+
.into_iter()
196+
.map(|x| PackageName::new(x))
197+
.collect();
187198

188199
self.clean(
189200
&project_root.join(CompiledPackageLayout::Root.path()),
190-
sorted_deps,
201+
sorted_deps?,
191202
)?;
192203

193204
Ok(migration)

external-crates/move/crates/move-package-alt/src/compatibility/mod.rs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use std::path::{Path, PathBuf};
88

99
use anyhow::{Context, Result, bail};
1010
use move_core_types::account_address::{AccountAddress, AccountAddressParseError};
11+
use once_cell::sync::Lazy;
1112
use regex::Regex;
1213
use tracing::debug;
1314

@@ -34,6 +35,9 @@ pub enum LegacySubstOrRename {
3435
/// The regex to detect `module <name>::<module_name>` on its different forms.
3536
const MODULE_REGEX: &str = r"\bmodule\s+([a-zA-Z_][\w]*)::([a-zA-Z_][\w]*)";
3637

38+
// Compile regex once at program startup
39+
static MODULE_REGEX_COMPILED: Lazy<Regex> = Lazy::new(|| Regex::new(MODULE_REGEX).unwrap());
40+
3741
/// This is a naive way to detect all module names that are part of the source code
3842
/// for a given package.
3943
///
@@ -111,18 +115,15 @@ fn find_files(files: &mut Vec<PathBuf>, dir: &Path, extension: &str, max_depth:
111115
// Consider supporting the legacy `address { module {} }` format.
112116
fn parse_module_names(contents: &str) -> Result<HashSet<String>> {
113117
let clean = strip_comments(contents);
114-
let mut set = HashSet::new();
118+
115119
// This matches `module a::b {}`, and `module a::b;` cases.
116120
// In both cases, the match is the 2nd group (so `match.get(1)`)
117-
let regex = Regex::new(MODULE_REGEX).unwrap();
118-
119-
for cap in regex.captures_iter(&clean) {
120-
set.insert(cap[1].to_string());
121-
}
122-
123-
Ok(set
124-
.into_iter()
125-
.filter(|name| !is_address_like(name.as_str()))
121+
Ok(MODULE_REGEX_COMPILED
122+
.captures_iter(&clean)
123+
.filter_map(|cap| {
124+
let name = &cap[1];
125+
(!is_address_like(name)).then(|| name.to_string())
126+
})
126127
.collect())
127128
}
128129

external-crates/move/crates/move-package-alt/src/graph/mod.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use crate::{
2626
errors::PackageResult,
2727
flavor::MoveFlavor,
2828
package::{Package, paths::PackagePath},
29-
schema::{Environment, PackageID, PackageName},
29+
schema::{Environment, PackageID},
3030
};
3131
use bimap::BiBTreeMap;
3232
use builder::PackageGraphBuilder;
@@ -113,13 +113,19 @@ impl<F: MoveFlavor> PackageGraph<F> {
113113
.collect()
114114
}
115115

116+
/// Return the list of all packages that are in the package graph, sorted in topological order.
117+
pub fn sorted_packages(&self) -> Vec<PackageInfo<F>> {
118+
let sorted = toposort(&self.inner, None).expect("to sort the graph");
119+
sorted.iter().map(|x| self.package_info(*x)).collect()
120+
}
121+
116122
/// Return the sorted list of dependencies' name
117-
pub(crate) fn sorted_deps(&self) -> Vec<&PackageName> {
123+
pub(crate) fn sorted_deps(&self) -> Vec<&str> {
118124
let sorted = toposort(&self.inner, None).expect("to sort the graph");
119125
sorted
120126
.iter()
121127
.flat_map(|x| self.inner.node_weight(*x))
122-
.map(|x| x.name())
128+
.map(|x| x.display_name())
123129
.collect()
124130
}
125131

external-crates/move/crates/move-package-alt/src/package/root_package.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ use crate::graph::PackageInfo;
1414
use crate::package::block_on;
1515
use crate::package::package_lock::PackageSystemLock;
1616
use crate::schema::{
17-
Environment, LocalPub, LockfileDependencyInfo, ModeName, PackageID, PackageName,
18-
ParsedEphemeralPubs, ParsedPublishedFile, Publication, RenderToml,
17+
Environment, LocalPub, LockfileDependencyInfo, ModeName, PackageID, ParsedEphemeralPubs,
18+
ParsedPublishedFile, Publication, RenderToml,
1919
};
2020
use crate::{
2121
errors::{PackageError, PackageResult},
@@ -486,9 +486,16 @@ impl<F: MoveFlavor + fmt::Debug> RootPackage<F> {
486486
// *** PATHS RELATED FUNCTIONS ***
487487

488488
/// Return a list of sorted package names
489-
pub fn sorted_deps(&self) -> Vec<&PackageName> {
489+
pub fn sorted_deps(&self) -> Vec<&str> {
490490
self.filtered_graph.sorted_deps()
491491
}
492+
493+
/// Return a list of package ids, topologically sorted
494+
pub fn sorted_deps_ids(&self) -> Vec<&PackageID> {
495+
let pkgs = self.filtered_graph.sorted_packages();
496+
let ids = pkgs.into_iter().map(|p| p.id()).collect();
497+
ids
498+
}
492499
}
493500

494501
fn localpubs_to_publications<F: MoveFlavor>(

0 commit comments

Comments
 (0)