Skip to content

Commit 0a29e6f

Browse files
committed
Support flychecking for cargo scripts
1 parent 92ace4b commit 0a29e6f

File tree

7 files changed

+61
-44
lines changed

7 files changed

+61
-44
lines changed

src/tools/rust-analyzer/crates/flycheck/src/lib.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,10 @@ impl FlycheckHandle {
125125
config: FlycheckConfig,
126126
sysroot_root: Option<AbsPathBuf>,
127127
workspace_root: AbsPathBuf,
128+
manifest_path: Option<AbsPathBuf>,
128129
) -> FlycheckHandle {
129-
let actor = FlycheckActor::new(id, sender, config, sysroot_root, workspace_root);
130+
let actor =
131+
FlycheckActor::new(id, sender, config, sysroot_root, workspace_root, manifest_path);
130132
let (sender, receiver) = unbounded::<StateChange>();
131133
let thread = stdx::thread::Builder::new(stdx::thread::ThreadIntent::Worker)
132134
.name("Flycheck".to_owned())
@@ -205,6 +207,7 @@ struct FlycheckActor {
205207
id: usize,
206208
sender: Box<dyn Fn(Message) + Send>,
207209
config: FlycheckConfig,
210+
manifest_path: Option<AbsPathBuf>,
208211
/// Either the workspace root of the workspace we are flychecking,
209212
/// or the project root of the project.
210213
root: AbsPathBuf,
@@ -233,6 +236,7 @@ impl FlycheckActor {
233236
config: FlycheckConfig,
234237
sysroot_root: Option<AbsPathBuf>,
235238
workspace_root: AbsPathBuf,
239+
manifest_path: Option<AbsPathBuf>,
236240
) -> FlycheckActor {
237241
tracing::info!(%id, ?workspace_root, "Spawning flycheck");
238242
FlycheckActor {
@@ -241,6 +245,7 @@ impl FlycheckActor {
241245
config,
242246
sysroot_root,
243247
root: workspace_root,
248+
manifest_path,
244249
command_handle: None,
245250
command_receiver: None,
246251
}
@@ -388,8 +393,13 @@ impl FlycheckActor {
388393
"--message-format=json"
389394
});
390395

391-
cmd.arg("--manifest-path");
392-
cmd.arg(self.root.join("Cargo.toml"));
396+
if let Some(manifest_path) = &self.manifest_path {
397+
cmd.arg("--manifest-path");
398+
cmd.arg(manifest_path);
399+
if manifest_path.extension().map_or(false, |ext| ext == "rs") {
400+
cmd.arg("-Zscript");
401+
}
402+
}
393403

394404
options.apply_on_command(&mut cmd);
395405
(cmd, options.extra_args.clone())

src/tools/rust-analyzer/crates/project-model/src/workspace.rs

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ pub enum ProjectWorkspaceKind {
9191
/// The file in question.
9292
file: ManifestPath,
9393
/// Is this file a cargo script file?
94-
cargo_script: Option<(CargoWorkspace, WorkspaceBuildScripts)>,
94+
cargo: Option<(CargoWorkspace, WorkspaceBuildScripts)>,
9595
/// Environment variables set in the `.cargo/config` file.
9696
cargo_config_extra_env: FxHashMap<String, String>,
9797
},
@@ -135,7 +135,11 @@ impl fmt::Debug for ProjectWorkspace {
135135
.field("n_cfg_overrides", &cfg_overrides.len());
136136
debug_struct.finish()
137137
}
138-
ProjectWorkspaceKind::DetachedFile { file, cargo_script, cargo_config_extra_env } => f
138+
ProjectWorkspaceKind::DetachedFile {
139+
file,
140+
cargo: cargo_script,
141+
cargo_config_extra_env,
142+
} => f
139143
.debug_struct("DetachedFiles")
140144
.field("file", &file)
141145
.field("cargo_script", &cargo_script.is_some())
@@ -451,7 +455,7 @@ impl ProjectWorkspace {
451455
Ok(ProjectWorkspace {
452456
kind: ProjectWorkspaceKind::DetachedFile {
453457
file: detached_file.to_owned(),
454-
cargo_script,
458+
cargo: cargo_script,
455459
cargo_config_extra_env,
456460
},
457461
sysroot,
@@ -476,7 +480,7 @@ impl ProjectWorkspace {
476480
progress: &dyn Fn(String),
477481
) -> anyhow::Result<WorkspaceBuildScripts> {
478482
match &self.kind {
479-
ProjectWorkspaceKind::DetachedFile { cargo_script: Some((cargo, _)), .. }
483+
ProjectWorkspaceKind::DetachedFile { cargo: Some((cargo, _)), .. }
480484
| ProjectWorkspaceKind::Cargo { cargo, .. } => {
481485
WorkspaceBuildScripts::run_for_workspace(
482486
config,
@@ -489,7 +493,7 @@ impl ProjectWorkspace {
489493
format!("Failed to run build scripts for {}", cargo.workspace_root())
490494
})
491495
}
492-
ProjectWorkspaceKind::DetachedFile { cargo_script: None, .. }
496+
ProjectWorkspaceKind::DetachedFile { cargo: None, .. }
493497
| ProjectWorkspaceKind::Json { .. } => Ok(WorkspaceBuildScripts::default()),
494498
}
495499
}
@@ -540,9 +544,9 @@ impl ProjectWorkspace {
540544
pub fn set_build_scripts(&mut self, bs: WorkspaceBuildScripts) {
541545
match &mut self.kind {
542546
ProjectWorkspaceKind::Cargo { build_scripts, .. }
543-
| ProjectWorkspaceKind::DetachedFile {
544-
cargo_script: Some((_, build_scripts)), ..
545-
} => *build_scripts = bs,
547+
| ProjectWorkspaceKind::DetachedFile { cargo: Some((_, build_scripts)), .. } => {
548+
*build_scripts = bs
549+
}
546550
_ => assert_eq!(bs, WorkspaceBuildScripts::default()),
547551
}
548552
}
@@ -674,7 +678,7 @@ impl ProjectWorkspace {
674678
}))
675679
.collect()
676680
}
677-
ProjectWorkspaceKind::DetachedFile { file, cargo_script, .. } => {
681+
ProjectWorkspaceKind::DetachedFile { file, cargo: cargo_script, .. } => {
678682
iter::once(PackageRoot {
679683
is_local: true,
680684
include: vec![file.as_ref().to_owned()],
@@ -736,7 +740,7 @@ impl ProjectWorkspace {
736740
let sysroot_package_len = self.sysroot.as_ref().map_or(0, |it| it.num_packages());
737741
cargo.packages().len() + sysroot_package_len + rustc_package_len
738742
}
739-
ProjectWorkspaceKind::DetachedFile { cargo_script, .. } => {
743+
ProjectWorkspaceKind::DetachedFile { cargo: cargo_script, .. } => {
740744
let sysroot_package_len = self.sysroot.as_ref().map_or(0, |it| it.num_packages());
741745
sysroot_package_len
742746
+ cargo_script.as_ref().map_or(1, |(cargo, _)| cargo.packages().len())
@@ -781,7 +785,7 @@ impl ProjectWorkspace {
781785
),
782786
sysroot,
783787
),
784-
ProjectWorkspaceKind::DetachedFile { file, cargo_script, .. } => (
788+
ProjectWorkspaceKind::DetachedFile { file, cargo: cargo_script, .. } => (
785789
if let Some((cargo, build_scripts)) = cargo_script {
786790
cargo_to_crate_graph(
787791
&mut |path| load(path),
@@ -851,12 +855,12 @@ impl ProjectWorkspace {
851855
(
852856
ProjectWorkspaceKind::DetachedFile {
853857
file,
854-
cargo_script: Some((cargo_script, _)),
858+
cargo: Some((cargo_script, _)),
855859
cargo_config_extra_env,
856860
},
857861
ProjectWorkspaceKind::DetachedFile {
858862
file: o_file,
859-
cargo_script: Some((o_cargo_script, _)),
863+
cargo: Some((o_cargo_script, _)),
860864
cargo_config_extra_env: o_cargo_config_extra_env,
861865
},
862866
) => {

src/tools/rust-analyzer/crates/rust-analyzer/src/cli/rustc_tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ impl Tester {
8181
let workspace = ProjectWorkspace {
8282
kind: ProjectWorkspaceKind::DetachedFile {
8383
file: ManifestPath::try_from(tmp_file).unwrap(),
84-
cargo_script: None,
84+
cargo: None,
8585
cargo_config_extra_env: Default::default(),
8686
},
8787
sysroot,

src/tools/rust-analyzer/crates/rust-analyzer/src/global_state.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -521,7 +521,7 @@ impl GlobalStateSnapshot {
521521
let path = path.as_path()?;
522522
self.workspaces.iter().find_map(|ws| match &ws.kind {
523523
ProjectWorkspaceKind::Cargo { cargo, .. }
524-
| ProjectWorkspaceKind::DetachedFile { cargo_script: Some((cargo, _)), .. } => {
524+
| ProjectWorkspaceKind::DetachedFile { cargo: Some((cargo, _)), .. } => {
525525
cargo.target_by_root(path).map(|it| (cargo, it))
526526
}
527527
ProjectWorkspaceKind::Json { .. } => None,

src/tools/rust-analyzer/crates/rust-analyzer/src/handlers/notification.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ fn run_flycheck(state: &mut GlobalState, vfs_path: VfsPath) -> bool {
292292
let package = match &ws.kind {
293293
project_model::ProjectWorkspaceKind::Cargo { cargo, .. }
294294
| project_model::ProjectWorkspaceKind::DetachedFile {
295-
cargo_script: Some((cargo, _)),
295+
cargo: Some((cargo, _)),
296296
..
297297
} => cargo.packages().find_map(|pkg| {
298298
let has_target_with_root = cargo[pkg]

src/tools/rust-analyzer/crates/rust-analyzer/src/handlers/request.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -767,7 +767,8 @@ pub(crate) fn handle_parent_module(
767767
.workspaces
768768
.iter()
769769
.filter_map(|ws| match &ws.kind {
770-
ProjectWorkspaceKind::Cargo { cargo, .. } => {
770+
ProjectWorkspaceKind::Cargo { cargo, .. }
771+
| ProjectWorkspaceKind::DetachedFile { cargo: Some((cargo, _)), .. } => {
771772
cargo.parent_manifests(&manifest_path)
772773
}
773774
_ => None,
@@ -1759,7 +1760,7 @@ pub(crate) fn handle_open_docs(
17591760

17601761
let ws_and_sysroot = snap.workspaces.iter().find_map(|ws| match &ws.kind {
17611762
ProjectWorkspaceKind::Cargo { cargo, .. }
1762-
| ProjectWorkspaceKind::DetachedFile { cargo_script: Some((cargo, _)), .. } => {
1763+
| ProjectWorkspaceKind::DetachedFile { cargo: Some((cargo, _)), .. } => {
17631764
Some((cargo, ws.sysroot.as_ref().ok()))
17641765
}
17651766
ProjectWorkspaceKind::Json { .. } => None,

src/tools/rust-analyzer/crates/rust-analyzer/src/reload.rs

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -502,7 +502,7 @@ impl GlobalState {
502502
let env = match &ws.kind {
503503
ProjectWorkspaceKind::Cargo { cargo_config_extra_env, .. }
504504
| ProjectWorkspaceKind::DetachedFile {
505-
cargo_script: Some(_),
505+
cargo: Some(_),
506506
cargo_config_extra_env,
507507
..
508508
} => cargo_config_extra_env
@@ -669,43 +669,45 @@ impl GlobalState {
669669
config,
670670
None,
671671
self.config.root_path().clone(),
672+
None,
672673
)],
673674
flycheck::InvocationStrategy::PerWorkspace => {
674675
self.workspaces
675676
.iter()
676677
.enumerate()
677-
.filter_map(|(id, ws)| match &ws.kind {
678-
ProjectWorkspaceKind::Cargo { cargo, .. } => Some((
678+
.filter_map(|(id, ws)| {
679+
Some((
679680
id,
680-
cargo.workspace_root(),
681+
match &ws.kind {
682+
ProjectWorkspaceKind::Cargo { cargo, .. }
683+
| ProjectWorkspaceKind::DetachedFile {
684+
cargo: Some((cargo, _)),
685+
..
686+
} => (cargo.workspace_root(), Some(cargo.manifest_path())),
687+
ProjectWorkspaceKind::Json(project) => {
688+
// Enable flychecks for json projects if a custom flycheck command was supplied
689+
// in the workspace configuration.
690+
match config {
691+
FlycheckConfig::CustomCommand { .. } => {
692+
(project.path(), None)
693+
}
694+
_ => return None,
695+
}
696+
}
697+
ProjectWorkspaceKind::DetachedFile { .. } => return None,
698+
},
681699
ws.sysroot.as_ref().ok().map(|sysroot| sysroot.root().to_owned()),
682-
)),
683-
ProjectWorkspaceKind::Json(project) => {
684-
// Enable flychecks for json projects if a custom flycheck command was supplied
685-
// in the workspace configuration.
686-
match config {
687-
FlycheckConfig::CustomCommand { .. } => Some((
688-
id,
689-
project.path(),
690-
ws.sysroot
691-
.as_ref()
692-
.ok()
693-
.map(|sysroot| sysroot.root().to_owned()),
694-
)),
695-
_ => None,
696-
}
697-
}
698-
// FIXME
699-
ProjectWorkspaceKind::DetachedFile { .. } => None,
700+
))
700701
})
701-
.map(|(id, root, sysroot_root)| {
702+
.map(|(id, (root, manifest_path), sysroot_root)| {
702703
let sender = sender.clone();
703704
FlycheckHandle::spawn(
704705
id,
705706
Box::new(move |msg| sender.send(msg).unwrap()),
706707
config.clone(),
707708
sysroot_root,
708709
root.to_path_buf(),
710+
manifest_path.map(|it| it.to_path_buf()),
709711
)
710712
})
711713
.collect()

0 commit comments

Comments
 (0)