Skip to content

Commit 2943d9a

Browse files
bors[bot]matklad
andauthored
Merge #9982
9982: internal: reduce crate interdependence r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <[email protected]>
2 parents 8cd171c + 881d71a commit 2943d9a

File tree

9 files changed

+43
-40
lines changed

9 files changed

+43
-40
lines changed

Cargo.lock

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/project_model/Cargo.toml

-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ la-arena = { version = "0.2.0", path = "../../lib/arena" }
2222
cfg = { path = "../cfg", version = "0.0.0" }
2323
base_db = { path = "../base_db", version = "0.0.0" }
2424
toolchain = { path = "../toolchain", version = "0.0.0" }
25-
proc_macro_api = { path = "../proc_macro_api", version = "0.0.0" }
2625
paths = { path = "../paths", version = "0.0.0" }
2726
stdx = { path = "../stdx", version = "0.0.0" }
2827
profile = { path = "../profile", version = "0.0.0" }

crates/project_model/src/lib.rs

-2
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,6 @@ pub use crate::{
5050
workspace::{CfgOverrides, PackageRoot, ProjectWorkspace},
5151
};
5252

53-
pub use proc_macro_api::ProcMacroClient;
54-
5553
#[derive(Debug, Clone, PartialEq, Eq, Hash, Ord, PartialOrd)]
5654
pub enum ProjectManifest {
5755
ProjectJson(ManifestPath),

crates/project_model/src/tests.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,9 @@ fn rooted_project_json(data: ProjectJsonData) -> ProjectJson {
8484
}
8585

8686
fn to_crate_graph(project_workspace: ProjectWorkspace) -> CrateGraph {
87-
project_workspace.to_crate_graph(None, {
87+
project_workspace.to_crate_graph(&mut |_| Vec::new(), &mut {
8888
let mut counter = 0;
89-
&mut move |_path| {
89+
move |_path| {
9090
counter += 1;
9191
Some(FileId(counter))
9292
}

crates/project_model/src/workspace.rs

+12-17
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ use anyhow::{format_err, Context, Result};
88
use base_db::{CrateDisplayName, CrateGraph, CrateId, CrateName, Edition, Env, FileId, ProcMacro};
99
use cfg::{CfgDiff, CfgOptions};
1010
use paths::{AbsPath, AbsPathBuf};
11-
use proc_macro_api::ProcMacroClient;
1211
use rustc_hash::{FxHashMap, FxHashSet};
1312
use stdx::always;
1413

@@ -350,19 +349,15 @@ impl ProjectWorkspace {
350349

351350
pub fn to_crate_graph(
352351
&self,
353-
proc_macro_client: Option<&ProcMacroClient>,
352+
load_proc_macro: &mut dyn FnMut(&AbsPath) -> Vec<ProcMacro>,
354353
load: &mut dyn FnMut(&AbsPath) -> Option<FileId>,
355354
) -> CrateGraph {
356355
let _p = profile::span("ProjectWorkspace::to_crate_graph");
357-
let proc_macro_loader = |path: &AbsPath| match proc_macro_client {
358-
Some(client) => client.by_dylib_path(path),
359-
None => Vec::new(),
360-
};
361356

362357
let mut crate_graph = match self {
363358
ProjectWorkspace::Json { project, sysroot, rustc_cfg } => project_json_to_crate_graph(
364359
rustc_cfg.clone(),
365-
&proc_macro_loader,
360+
load_proc_macro,
366361
load,
367362
project,
368363
sysroot,
@@ -377,7 +372,7 @@ impl ProjectWorkspace {
377372
} => cargo_to_crate_graph(
378373
rustc_cfg.clone(),
379374
cfg_overrides,
380-
&proc_macro_loader,
375+
load_proc_macro,
381376
load,
382377
cargo,
383378
build_scripts,
@@ -399,7 +394,7 @@ impl ProjectWorkspace {
399394

400395
fn project_json_to_crate_graph(
401396
rustc_cfg: Vec<CfgFlag>,
402-
proc_macro_loader: &dyn Fn(&AbsPath) -> Vec<ProcMacro>,
397+
load_proc_macro: &mut dyn FnMut(&AbsPath) -> Vec<ProcMacro>,
403398
load: &mut dyn FnMut(&AbsPath) -> Option<FileId>,
404399
project: &ProjectJson,
405400
sysroot: &Option<Sysroot>,
@@ -419,7 +414,7 @@ fn project_json_to_crate_graph(
419414
})
420415
.map(|(crate_id, krate, file_id)| {
421416
let env = krate.env.clone().into_iter().collect();
422-
let proc_macro = krate.proc_macro_dylib_path.clone().map(|it| proc_macro_loader(&it));
417+
let proc_macro = krate.proc_macro_dylib_path.clone().map(|it| load_proc_macro(&it));
423418

424419
let target_cfgs = match krate.target.as_deref() {
425420
Some(target) => {
@@ -476,7 +471,7 @@ fn project_json_to_crate_graph(
476471
fn cargo_to_crate_graph(
477472
rustc_cfg: Vec<CfgFlag>,
478473
override_cfg: &CfgOverrides,
479-
proc_macro_loader: &dyn Fn(&AbsPath) -> Vec<ProcMacro>,
474+
load_proc_macro: &mut dyn FnMut(&AbsPath) -> Vec<ProcMacro>,
480475
load: &mut dyn FnMut(&AbsPath) -> Option<FileId>,
481476
cargo: &CargoWorkspace,
482477
build_scripts: &WorkspaceBuildScripts,
@@ -528,7 +523,7 @@ fn cargo_to_crate_graph(
528523
&cargo[pkg],
529524
build_scripts.outputs.get(pkg),
530525
&cfg_options,
531-
proc_macro_loader,
526+
load_proc_macro,
532527
file_id,
533528
&cargo[tgt].name,
534529
);
@@ -599,7 +594,7 @@ fn cargo_to_crate_graph(
599594
load,
600595
&mut crate_graph,
601596
&cfg_options,
602-
proc_macro_loader,
597+
load_proc_macro,
603598
&mut pkg_to_lib_crate,
604599
&public_deps,
605600
cargo,
@@ -658,7 +653,7 @@ fn handle_rustc_crates(
658653
load: &mut dyn FnMut(&AbsPath) -> Option<FileId>,
659654
crate_graph: &mut CrateGraph,
660655
cfg_options: &CfgOptions,
661-
proc_macro_loader: &dyn Fn(&AbsPath) -> Vec<ProcMacro>,
656+
load_proc_macro: &mut dyn FnMut(&AbsPath) -> Vec<ProcMacro>,
662657
pkg_to_lib_crate: &mut FxHashMap<la_arena::Idx<crate::PackageData>, CrateId>,
663658
public_deps: &[(CrateName, CrateId)],
664659
cargo: &CargoWorkspace,
@@ -694,7 +689,7 @@ fn handle_rustc_crates(
694689
&rustc_workspace[pkg],
695690
None,
696691
cfg_options,
697-
proc_macro_loader,
692+
load_proc_macro,
698693
file_id,
699694
&rustc_workspace[tgt].name,
700695
);
@@ -750,7 +745,7 @@ fn add_target_crate_root(
750745
pkg: &PackageData,
751746
build_data: Option<&BuildScriptOutput>,
752747
cfg_options: &CfgOptions,
753-
proc_macro_loader: &dyn Fn(&AbsPath) -> Vec<ProcMacro>,
748+
load_proc_macro: &mut dyn FnMut(&AbsPath) -> Vec<ProcMacro>,
754749
file_id: FileId,
755750
cargo_name: &str,
756751
) -> CrateId {
@@ -778,7 +773,7 @@ fn add_target_crate_root(
778773
let proc_macro = build_data
779774
.as_ref()
780775
.and_then(|it| it.proc_macro_dylib_path.as_ref())
781-
.map(|it| proc_macro_loader(it))
776+
.map(|it| load_proc_macro(it))
782777
.unwrap_or_default();
783778

784779
let display_name = CrateDisplayName::from_canonical_name(cargo_name.to_string());

crates/rust-analyzer/Cargo.toml

+2
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ tracing = "0.1"
3939
tracing-subscriber = { version = "0.2", default-features = false, features = ["env-filter", "registry"] }
4040
tracing-tree = { version = "0.1.4" }
4141
always-assert = "0.1"
42+
4243
stdx = { path = "../stdx", version = "0.0.0" }
4344
flycheck = { path = "../flycheck", version = "0.0.0" }
4445
ide = { path = "../ide", version = "0.0.0" }
@@ -51,6 +52,7 @@ vfs = { path = "../vfs", version = "0.0.0" }
5152
vfs-notify = { path = "../vfs-notify", version = "0.0.0" }
5253
cfg = { path = "../cfg", version = "0.0.0" }
5354
toolchain = { path = "../toolchain", version = "0.0.0" }
55+
proc_macro_api = { path = "../proc_macro_api", version = "0.0.0" }
5456

5557
# This should only be used in CLI
5658
ide_ssr = { path = "../ide_ssr", version = "0.0.0" }

crates/rust-analyzer/src/cli/load_cargo.rs

+13-9
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,8 @@ use crossbeam_channel::{unbounded, Receiver};
77
use hir::db::DefDatabase;
88
use ide::{AnalysisHost, Change};
99
use ide_db::base_db::CrateGraph;
10-
use project_model::{
11-
CargoConfig, ProcMacroClient, ProjectManifest, ProjectWorkspace, WorkspaceBuildScripts,
12-
};
10+
use proc_macro_api::ProcMacroClient;
11+
use project_model::{CargoConfig, ProjectManifest, ProjectWorkspace, WorkspaceBuildScripts};
1312
use vfs::{loader::Handle, AbsPath, AbsPathBuf};
1413

1514
use crate::reload::{ProjectFolders, SourceRootConfig};
@@ -69,12 +68,17 @@ pub fn load_workspace(
6968
WorkspaceBuildScripts::default()
7069
});
7170

72-
let crate_graph = ws.to_crate_graph(proc_macro_client.as_ref(), &mut |path: &AbsPath| {
73-
let contents = loader.load_sync(path);
74-
let path = vfs::VfsPath::from(path.to_path_buf());
75-
vfs.set_file_contents(path.clone(), contents);
76-
vfs.file_id(&path)
77-
});
71+
let crate_graph = ws.to_crate_graph(
72+
&mut |path: &AbsPath| {
73+
proc_macro_client.as_ref().map(|it| it.by_dylib_path(path)).unwrap_or_default()
74+
},
75+
&mut |path: &AbsPath| {
76+
let contents = loader.load_sync(path);
77+
let path = vfs::VfsPath::from(path.to_path_buf());
78+
vfs.set_file_contents(path.clone(), contents);
79+
vfs.file_id(&path)
80+
},
81+
);
7882

7983
let project_folders = ProjectFolders::new(&[ws], &[]);
8084
loader.set_config(vfs::loader::Config {

crates/rust-analyzer/src/global_state.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,8 @@ use ide::{Analysis, AnalysisHost, Cancellable, Change, FileId};
1111
use ide_db::base_db::CrateId;
1212
use lsp_types::{SemanticTokens, Url};
1313
use parking_lot::{Mutex, RwLock};
14-
use project_model::{
15-
CargoWorkspace, ProcMacroClient, ProjectWorkspace, Target, WorkspaceBuildScripts,
16-
};
14+
use proc_macro_api::ProcMacroClient;
15+
use project_model::{CargoWorkspace, ProjectWorkspace, Target, WorkspaceBuildScripts};
1716
use rustc_hash::FxHashMap;
1817
use vfs::AnchoredPathBuf;
1918

crates/rust-analyzer/src/reload.rs

+11-5
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ use flycheck::{FlycheckConfig, FlycheckHandle};
55
use hir::db::DefDatabase;
66
use ide::Change;
77
use ide_db::base_db::{CrateGraph, SourceRoot, VfsPath};
8-
use project_model::{ProcMacroClient, ProjectWorkspace, WorkspaceBuildScripts};
8+
use proc_macro_api::ProcMacroClient;
9+
use project_model::{ProjectWorkspace, WorkspaceBuildScripts};
910
use vfs::{file_set::FileSetConfig, AbsPath, AbsPathBuf, ChangeKind};
1011

1112
use crate::{
@@ -396,11 +397,15 @@ impl GlobalState {
396397

397398
// Create crate graph from all the workspaces
398399
let crate_graph = {
399-
let mut crate_graph = CrateGraph::default();
400+
let proc_macro_client = self.proc_macro_client.as_ref();
401+
let mut load_proc_macro = move |path: &AbsPath| {
402+
proc_macro_client.map(|it| it.by_dylib_path(path)).unwrap_or_default()
403+
};
404+
400405
let vfs = &mut self.vfs.write().0;
401406
let loader = &mut self.loader;
402407
let mem_docs = &self.mem_docs;
403-
let mut load = |path: &AbsPath| {
408+
let mut load = move |path: &AbsPath| {
404409
let _p = profile::span("GlobalState::load");
405410
let vfs_path = vfs::VfsPath::from(path.to_path_buf());
406411
if !mem_docs.contains(&vfs_path) {
@@ -413,10 +418,11 @@ impl GlobalState {
413418
}
414419
res
415420
};
421+
422+
let mut crate_graph = CrateGraph::default();
416423
for ws in self.workspaces.iter() {
417-
crate_graph.extend(ws.to_crate_graph(self.proc_macro_client.as_ref(), &mut load));
424+
crate_graph.extend(ws.to_crate_graph(&mut load_proc_macro, &mut load));
418425
}
419-
420426
crate_graph
421427
};
422428
change.set_crate_graph(crate_graph);

0 commit comments

Comments
 (0)