Unnamed repository; edit this file 'description' to name the repository.
internal: Improve docs for discoverConfig
Add concrete examples of CLI invocations and JSONL outputs, use BUCK for consistency with the first example, and polish the wording.
Wilfred Hughes 3 months ago
parent a0daa3e · commit c9341e1
-rw-r--r--crates/rust-analyzer/src/config.rs116
-rw-r--r--docs/book/src/configuration_generated.md116
-rw-r--r--docs/book/src/non_cargo_based_projects.md2
-rw-r--r--editors/code/package.json2
4 files changed, 142 insertions, 94 deletions
diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs
index 28ac94e4de..8d6b19a84c 100644
--- a/crates/rust-analyzer/src/config.rs
+++ b/crates/rust-analyzer/src/config.rs
@@ -478,14 +478,26 @@ config_data! {
typing_triggerChars: Option<String> = Some("=.".to_owned()),
- /// Enables automatic discovery of projects using [`DiscoverWorkspaceConfig::command`].
+ /// Configure a command that rust-analyzer can invoke to
+ /// obtain configuration.
///
- /// [`DiscoverWorkspaceConfig`] also requires setting `progressLabel` and `filesToWatch`.
- /// `progressLabel` is used for the title in progress indicators, whereas `filesToWatch`
- /// is used to determine which build system-specific files should be watched in order to
- /// reload rust-analyzer.
+ /// This is an alternative to manually generating
+ /// `rust-project.json`: it enables rust-analyzer to generate
+ /// rust-project.json on the fly, and regenerate it when
+ /// switching or modifying projects.
+ ///
+ /// This is an object with three fields:
+ ///
+ /// * `command`: the shell command to invoke
+ ///
+ /// * `filesToWatch`: which build system-specific files should
+ /// be watched to trigger regenerating the configuration
+ ///
+ /// * `progressLabel`: the name of the command, used in
+ /// progress indicators in the IDE
+ ///
+ /// Here's an example of a valid configuration:
///
- /// Below is an example of a valid configuration:
/// ```json
/// "rust-analyzer.workspace.discoverConfig": {
/// "command": [
@@ -500,12 +512,49 @@ config_data! {
/// }
/// ```
///
- /// ## Workspace Discovery Protocol
+ /// ## Argument Substitutions
+ ///
+ /// If `command` includes the argument `{arg}`, that argument will be substituted
+ /// with the JSON-serialized form of the following enum:
+ ///
+ /// ```norun
+ /// #[derive(PartialEq, Clone, Debug, Serialize)]
+ /// #[serde(rename_all = "camelCase")]
+ /// pub enum DiscoverArgument {
+ /// Path(AbsPathBuf),
+ /// Buildfile(AbsPathBuf),
+ /// }
+ /// ```
+ ///
+ /// rust-analyzer will use the path invocation to find and
+ /// generate a `rust-project.json` and therefore a
+ /// workspace. Example:
+ ///
+ ///
+ /// ```norun
+ /// rust-project develop-json '{ "path": "myproject/src/main.rs" }'
+ /// ```
+ ///
+ /// rust-analyzer will use build file invocations to update an
+ /// existing workspace. Example:
+ ///
+ /// Or with a build file and the configuration above:
+ ///
+ /// ```norun
+ /// rust-project develop-json '{ "buildfile": "myproject/BUCK" }'
+ /// ```
+ ///
+ /// As a reference for implementors, buck2's `rust-project`
+ /// will likely be useful:
+ /// <https://github.com/facebook/buck2/tree/main/integrations/rust-project>.
+ ///
+ /// ## Discover Command Output
///
/// **Warning**: This format is provisional and subject to change.
///
- /// [`DiscoverWorkspaceConfig::command`] *must* return a JSON object corresponding to
- /// `DiscoverProjectData::Finished`:
+ /// The discover command should output JSON objects, one per
+ /// line (JSONL format). These objects should correspond to
+ /// this Rust data type:
///
/// ```norun
/// #[derive(Debug, Clone, Deserialize, Serialize)]
@@ -518,7 +567,14 @@ config_data! {
/// }
/// ```
///
- /// As JSON, `DiscoverProjectData::Finished` is:
+ /// For example, a progress event:
+ ///
+ /// ```json
+ /// {"kind":"progress","message":"generating rust-project.json"}
+ /// ```
+ ///
+ /// A finished event can look like this (expanded and
+ /// commented for readability):
///
/// ```json
/// {
@@ -526,7 +582,7 @@ config_data! {
/// "kind": "finished",
/// // the file used by a non-Cargo build system to define
/// // a package or target.
- /// "buildfile": "rust-analyzer/BUILD",
+ /// "buildfile": "rust-analyzer/BUCK",
/// // the contents of a rust-project.json, elided for brevity
/// "project": {
/// "sysroot": "foo",
@@ -535,41 +591,9 @@ config_data! {
/// }
/// ```
///
- /// It is encouraged, but not required, to use the other variants on `DiscoverProjectData`
- /// to provide a more polished end-user experience.
- ///
- /// `DiscoverWorkspaceConfig::command` may *optionally* include an `{arg}`, which will be
- /// substituted with the JSON-serialized form of the following enum:
- ///
- /// ```norun
- /// #[derive(PartialEq, Clone, Debug, Serialize)]
- /// #[serde(rename_all = "camelCase")]
- /// pub enum DiscoverArgument {
- /// Path(AbsPathBuf),
- /// Buildfile(AbsPathBuf),
- /// }
- /// ```
- ///
- /// The JSON representation of `DiscoverArgument::Path` is:
- ///
- /// ```json
- /// {
- /// "path": "src/main.rs"
- /// }
- /// ```
- ///
- /// Similarly, the JSON representation of `DiscoverArgument::Buildfile` is:
- ///
- /// ```json
- /// {
- /// "buildfile": "BUILD"
- /// }
- /// ```
- ///
- /// `DiscoverArgument::Path` is used to find and generate a `rust-project.json`, and
- /// therefore, a workspace, whereas `DiscoverArgument::buildfile` is used to to update an
- /// existing workspace. As a reference for implementors, buck2's `rust-project` will likely
- /// be useful: <https://github.com/facebook/buck2/tree/main/integrations/rust-project>.
+ /// Only the finished event is required, but the other
+ /// variants are encouraged to give users more feedback about
+ /// progress or errors.
workspace_discoverConfig: Option<DiscoverWorkspaceConfig> = None,
}
}
diff --git a/docs/book/src/configuration_generated.md b/docs/book/src/configuration_generated.md
index c4124aaae0..9bc4126310 100644
--- a/docs/book/src/configuration_generated.md
+++ b/docs/book/src/configuration_generated.md
@@ -1619,14 +1619,26 @@ though Cargo might be the eventual consumer.
Default: `null`
-Enables automatic discovery of projects using [`DiscoverWorkspaceConfig::command`].
+Configure a command that rust-analyzer can invoke to
+obtain configuration.
-[`DiscoverWorkspaceConfig`] also requires setting `progressLabel` and `filesToWatch`.
-`progressLabel` is used for the title in progress indicators, whereas `filesToWatch`
-is used to determine which build system-specific files should be watched in order to
-reload rust-analyzer.
+This is an alternative to manually generating
+`rust-project.json`: it enables rust-analyzer to generate
+rust-project.json on the fly, and regenerate it when
+switching or modifying projects.
+
+This is an object with three fields:
+
+* `command`: the shell command to invoke
+
+* `filesToWatch`: which build system-specific files should
+be watched to trigger regenerating the configuration
+
+* `progressLabel`: the name of the command, used in
+progress indicators in the IDE
+
+Here's an example of a valid configuration:
-Below is an example of a valid configuration:
```json
"rust-analyzer.workspace.discoverConfig": {
"command": [
@@ -1641,12 +1653,49 @@ Below is an example of a valid configuration:
}
```
-## Workspace Discovery Protocol
+## Argument Substitutions
+
+If `command` includes the argument `{arg}`, that argument will be substituted
+with the JSON-serialized form of the following enum:
+
+```norun
+#[derive(PartialEq, Clone, Debug, Serialize)]
+#[serde(rename_all = "camelCase")]
+pub enum DiscoverArgument {
+ Path(AbsPathBuf),
+ Buildfile(AbsPathBuf),
+}
+```
+
+rust-analyzer will use the path invocation to find and
+generate a `rust-project.json` and therefore a
+workspace. Example:
+
+
+```norun
+rust-project develop-json '{ "path": "myproject/src/main.rs" }'
+```
+
+rust-analyzer will use build file invocations to update an
+existing workspace. Example:
+
+Or with a build file and the configuration above:
+
+```norun
+rust-project develop-json '{ "buildfile": "myproject/BUCK" }'
+```
+
+As a reference for implementors, buck2's `rust-project`
+will likely be useful:
+<https://github.com/facebook/buck2/tree/main/integrations/rust-project>.
+
+## Discover Command Output
**Warning**: This format is provisional and subject to change.
-[`DiscoverWorkspaceConfig::command`] *must* return a JSON object corresponding to
-`DiscoverProjectData::Finished`:
+The discover command should output JSON objects, one per
+line (JSONL format). These objects should correspond to
+this Rust data type:
```norun
#[derive(Debug, Clone, Deserialize, Serialize)]
@@ -1659,7 +1708,14 @@ enum DiscoverProjectData {
}
```
-As JSON, `DiscoverProjectData::Finished` is:
+For example, a progress event:
+
+```json
+{"kind":"progress","message":"generating rust-project.json"}
+```
+
+A finished event can look like this (expanded and
+commented for readability):
```json
{
@@ -1667,7 +1723,7 @@ As JSON, `DiscoverProjectData::Finished` is:
"kind": "finished",
// the file used by a non-Cargo build system to define
// a package or target.
- "buildfile": "rust-analyzer/BUILD",
+ "buildfile": "rust-analyzer/BUCK",
// the contents of a rust-project.json, elided for brevity
"project": {
"sysroot": "foo",
@@ -1676,41 +1732,9 @@ As JSON, `DiscoverProjectData::Finished` is:
}
```
-It is encouraged, but not required, to use the other variants on `DiscoverProjectData`
-to provide a more polished end-user experience.
-
-`DiscoverWorkspaceConfig::command` may *optionally* include an `{arg}`, which will be
-substituted with the JSON-serialized form of the following enum:
-
-```norun
-#[derive(PartialEq, Clone, Debug, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub enum DiscoverArgument {
- Path(AbsPathBuf),
- Buildfile(AbsPathBuf),
-}
-```
-
-The JSON representation of `DiscoverArgument::Path` is:
-
-```json
-{
- "path": "src/main.rs"
-}
-```
-
-Similarly, the JSON representation of `DiscoverArgument::Buildfile` is:
-
-```json
-{
- "buildfile": "BUILD"
-}
-```
-
-`DiscoverArgument::Path` is used to find and generate a `rust-project.json`, and
-therefore, a workspace, whereas `DiscoverArgument::buildfile` is used to to update an
-existing workspace. As a reference for implementors, buck2's `rust-project` will likely
-be useful: <https://github.com/facebook/buck2/tree/main/integrations/rust-project>.
+Only the finished event is required, but the other
+variants are encouraged to give users more feedback about
+progress or errors.
## rust-analyzer.workspace.symbol.search.excludeImports {#workspace.symbol.search.excludeImports}
diff --git a/docs/book/src/non_cargo_based_projects.md b/docs/book/src/non_cargo_based_projects.md
index a48b025c7b..f1f10ae336 100644
--- a/docs/book/src/non_cargo_based_projects.md
+++ b/docs/book/src/non_cargo_based_projects.md
@@ -237,7 +237,7 @@ There are four ways to feed `rust-project.json` to rust-analyzer:
[`"rust-analyzer.workspace.discoverConfig": … }`](./configuration.md#workspace.discoverConfig)
to specify a workspace discovery command to generate project descriptions
on-the-fly. Please note that the command output is message-oriented and must
- follow [the discovery protocol](./configuration.md#workspace-discovery-protocol).
+ output JSONL [as described in the configuration docs](./configuration.md#workspace.discoverConfig).
- Place `rust-project.json` file at the root of the project, and
rust-analyzer will discover it.
diff --git a/editors/code/package.json b/editors/code/package.json
index 0d91378706..a197b7abd8 100644
--- a/editors/code/package.json
+++ b/editors/code/package.json
@@ -3135,7 +3135,7 @@
"title": "Workspace",
"properties": {
"rust-analyzer.workspace.discoverConfig": {
- "markdownDescription": "Enables automatic discovery of projects using [`DiscoverWorkspaceConfig::command`].\n\n[`DiscoverWorkspaceConfig`] also requires setting `progressLabel` and `filesToWatch`.\n`progressLabel` is used for the title in progress indicators, whereas `filesToWatch`\nis used to determine which build system-specific files should be watched in order to\nreload rust-analyzer.\n\nBelow is an example of a valid configuration:\n```json\n\"rust-analyzer.workspace.discoverConfig\": {\n \"command\": [\n \"rust-project\",\n \"develop-json\",\n \"{arg}\"\n ],\n \"progressLabel\": \"buck2/rust-project\",\n \"filesToWatch\": [\n \"BUCK\"\n ]\n}\n```\n\n## Workspace Discovery Protocol\n\n**Warning**: This format is provisional and subject to change.\n\n[`DiscoverWorkspaceConfig::command`] *must* return a JSON object corresponding to\n`DiscoverProjectData::Finished`:\n\n```norun\n#[derive(Debug, Clone, Deserialize, Serialize)]\n#[serde(tag = \"kind\")]\n#[serde(rename_all = \"snake_case\")]\nenum DiscoverProjectData {\n Finished { buildfile: Utf8PathBuf, project: ProjectJsonData },\n Error { error: String, source: Option<String> },\n Progress { message: String },\n}\n```\n\nAs JSON, `DiscoverProjectData::Finished` is:\n\n```json\n{\n // the internally-tagged representation of the enum.\n \"kind\": \"finished\",\n // the file used by a non-Cargo build system to define\n // a package or target.\n \"buildfile\": \"rust-analyzer/BUILD\",\n // the contents of a rust-project.json, elided for brevity\n \"project\": {\n \"sysroot\": \"foo\",\n \"crates\": []\n }\n}\n```\n\nIt is encouraged, but not required, to use the other variants on `DiscoverProjectData`\nto provide a more polished end-user experience.\n\n`DiscoverWorkspaceConfig::command` may *optionally* include an `{arg}`, which will be\nsubstituted with the JSON-serialized form of the following enum:\n\n```norun\n#[derive(PartialEq, Clone, Debug, Serialize)]\n#[serde(rename_all = \"camelCase\")]\npub enum DiscoverArgument {\n Path(AbsPathBuf),\n Buildfile(AbsPathBuf),\n}\n```\n\nThe JSON representation of `DiscoverArgument::Path` is:\n\n```json\n{\n \"path\": \"src/main.rs\"\n}\n```\n\nSimilarly, the JSON representation of `DiscoverArgument::Buildfile` is:\n\n```json\n{\n \"buildfile\": \"BUILD\"\n}\n```\n\n`DiscoverArgument::Path` is used to find and generate a `rust-project.json`, and\ntherefore, a workspace, whereas `DiscoverArgument::buildfile` is used to to update an\nexisting workspace. As a reference for implementors, buck2's `rust-project` will likely\nbe useful: <https://github.com/facebook/buck2/tree/main/integrations/rust-project>.",
+ "markdownDescription": "Configure a command that rust-analyzer can invoke to\nobtain configuration.\n\nThis is an alternative to manually generating\n`rust-project.json`: it enables rust-analyzer to generate\nrust-project.json on the fly, and regenerate it when\nswitching or modifying projects.\n\nThis is an object with three fields:\n\n* `command`: the shell command to invoke\n\n* `filesToWatch`: which build system-specific files should\nbe watched to trigger regenerating the configuration\n\n* `progressLabel`: the name of the command, used in\nprogress indicators in the IDE\n\nHere's an example of a valid configuration:\n\n```json\n\"rust-analyzer.workspace.discoverConfig\": {\n \"command\": [\n \"rust-project\",\n \"develop-json\",\n \"{arg}\"\n ],\n \"progressLabel\": \"buck2/rust-project\",\n \"filesToWatch\": [\n \"BUCK\"\n ]\n}\n```\n\n## Argument Substitutions\n\nIf `command` includes the argument `{arg}`, that argument will be substituted\nwith the JSON-serialized form of the following enum:\n\n```norun\n#[derive(PartialEq, Clone, Debug, Serialize)]\n#[serde(rename_all = \"camelCase\")]\npub enum DiscoverArgument {\n Path(AbsPathBuf),\n Buildfile(AbsPathBuf),\n}\n```\n\nrust-analyzer will use the path invocation to find and\ngenerate a `rust-project.json` and therefore a\nworkspace. Example:\n\n\n```norun\nrust-project develop-json '{ \"path\": \"myproject/src/main.rs\" }'\n```\n\nrust-analyzer will use build file invocations to update an\nexisting workspace. Example:\n\nOr with a build file and the configuration above:\n\n```norun\nrust-project develop-json '{ \"buildfile\": \"myproject/BUCK\" }'\n```\n\nAs a reference for implementors, buck2's `rust-project`\nwill likely be useful:\n<https://github.com/facebook/buck2/tree/main/integrations/rust-project>.\n\n## Discover Command Output\n\n**Warning**: This format is provisional and subject to change.\n\nThe discover command should output JSON objects, one per\nline (JSONL format). These objects should correspond to\nthis Rust data type:\n\n```norun\n#[derive(Debug, Clone, Deserialize, Serialize)]\n#[serde(tag = \"kind\")]\n#[serde(rename_all = \"snake_case\")]\nenum DiscoverProjectData {\n Finished { buildfile: Utf8PathBuf, project: ProjectJsonData },\n Error { error: String, source: Option<String> },\n Progress { message: String },\n}\n```\n\nFor example, a progress event:\n\n```json\n{\"kind\":\"progress\",\"message\":\"generating rust-project.json\"}\n```\n\nA finished event can look like this (expanded and\ncommented for readability):\n\n```json\n{\n // the internally-tagged representation of the enum.\n \"kind\": \"finished\",\n // the file used by a non-Cargo build system to define\n // a package or target.\n \"buildfile\": \"rust-analyzer/BUCK\",\n // the contents of a rust-project.json, elided for brevity\n \"project\": {\n \"sysroot\": \"foo\",\n \"crates\": []\n }\n}\n```\n\nOnly the finished event is required, but the other\nvariants are encouraged to give users more feedback about\nprogress or errors.",
"default": null,
"anyOf": [
{