Unnamed repository; edit this file 'description' to name the repository.
Merge pull request #21423 from cormacrelf/project-json-compatibility
Project json compatibility improvements
Chayim Refael Friedman 8 weeks ago
parent 98fd321 · parent f8bc65a · commit 633f271
-rw-r--r--crates/project-model/src/project_json.rs27
-rw-r--r--crates/project-model/src/tests.rs6
-rw-r--r--crates/project-model/test_data/labeled-project.json37
-rw-r--r--crates/rust-analyzer/src/main_loop.rs2
4 files changed, 64 insertions, 8 deletions
diff --git a/crates/project-model/src/project_json.rs b/crates/project-model/src/project_json.rs
index 9b9111012b..682f5462f9 100644
--- a/crates/project-model/src/project_json.rs
+++ b/crates/project-model/src/project_json.rs
@@ -368,6 +368,9 @@ pub enum RunnableKind {
/// Template for checking a target, emitting rustc JSON diagnostics.
/// May include {label} which will get the label from the `build` section of a crate.
Flycheck,
+
+ /// For forwards-compatibility, i.e. old rust-analyzer binary with newer workspace discovery tools
+ Unknown,
}
#[derive(Serialize, Deserialize, Debug, Clone, Eq, PartialEq)]
@@ -380,6 +383,8 @@ pub struct ProjectJsonData {
crates: Vec<CrateData>,
#[serde(default)]
runnables: Vec<RunnableData>,
+ //
+ // New fields should be Option or #[serde(default)]. This applies to most of this datastructure.
}
#[derive(Serialize, Deserialize, Debug, Clone, Eq, PartialEq, Default)]
@@ -453,32 +458,37 @@ enum EditionData {
}
#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)]
-pub struct BuildData {
+struct BuildData {
label: String,
build_file: Utf8PathBuf,
target_kind: TargetKindData,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
-pub struct RunnableData {
- pub program: String,
- pub args: Vec<String>,
- pub cwd: Utf8PathBuf,
- pub kind: RunnableKindData,
+struct RunnableData {
+ program: String,
+ args: Vec<String>,
+ cwd: Utf8PathBuf,
+ kind: RunnableKindData,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
-pub enum RunnableKindData {
+enum RunnableKindData {
Flycheck,
Check,
Run,
TestOne,
+
+ /// For forwards-compatibility, i.e. old rust-analyzer binary with newer workspace discovery tools
+ #[allow(unused)]
+ #[serde(other)]
+ Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
-pub enum TargetKindData {
+enum TargetKindData {
Bin,
/// Any kind of Cargo lib crate-type (dylib, rlib, proc-macro, ...).
Lib,
@@ -542,6 +552,7 @@ impl From<RunnableKindData> for RunnableKind {
RunnableKindData::Run => RunnableKind::Run,
RunnableKindData::TestOne => RunnableKind::TestOne,
RunnableKindData::Flycheck => RunnableKind::Flycheck,
+ RunnableKindData::Unknown => RunnableKind::Unknown,
}
}
}
diff --git a/crates/project-model/src/tests.rs b/crates/project-model/src/tests.rs
index a03ed562e1..395cea6f76 100644
--- a/crates/project-model/src/tests.rs
+++ b/crates/project-model/src/tests.rs
@@ -193,6 +193,12 @@ fn rust_project_hello_world_project_model() {
}
#[test]
+fn rust_project_labeled_project_model() {
+ // This just needs to parse.
+ _ = load_rust_project("labeled-project.json");
+}
+
+#[test]
fn rust_project_cfg_groups() {
let (crate_graph, _proc_macros) = load_rust_project("cfg-groups.json");
check_crate_graph(crate_graph, expect_file!["../test_data/output/rust_project_cfg_groups.txt"]);
diff --git a/crates/project-model/test_data/labeled-project.json b/crates/project-model/test_data/labeled-project.json
new file mode 100644
index 0000000000..5c0e1f3397
--- /dev/null
+++ b/crates/project-model/test_data/labeled-project.json
@@ -0,0 +1,37 @@
+{
+ "sysroot_src": null,
+ "crates": [
+ {
+ "display_name": "hello_world",
+ "root_module": "$ROOT$src/lib.rs",
+ "edition": "2018",
+ "deps": [],
+ "is_workspace_member": true,
+ "build": {
+ "label": "//:hello_world",
+ "build_file": "$ROOT$BUILD",
+ "target_kind": "bin"
+ }
+ }
+ ],
+ "runnables": [
+ {
+ "kind": "run",
+ "program": "bazel",
+ "args": ["run", "{label}"],
+ "cwd": "$ROOT$"
+ },
+ {
+ "kind": "flycheck",
+ "program": "$ROOT$custom-flychecker.sh",
+ "args": ["{label}"],
+ "cwd": "$ROOT$"
+ },
+ {
+ "kind": "we-ignore-unknown-runnable-kinds-for-forwards-compatibility",
+ "program": "abc",
+ "args": ["{label}"],
+ "cwd": "$ROOT$"
+ }
+ ]
+}
diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs
index eb272b5e0b..83edbc722b 100644
--- a/crates/rust-analyzer/src/main_loop.rs
+++ b/crates/rust-analyzer/src/main_loop.rs
@@ -1187,6 +1187,8 @@ impl GlobalState {
} => self.diagnostics.clear_check_older_than_for_package(id, package_id, generation),
FlycheckMessage::Progress { id, progress } => {
let format_with_id = |user_facing_command: String| {
+ // When we're running multiple flychecks, we have to include a disambiguator in
+ // the title, or the editor complains. Note that this is a user-facing string.
if self.flycheck.len() == 1 {
user_facing_command
} else {