From dbf6f7bc997dc3a9ab1f014ea075600357226950 Mon Sep 17 00:00:00 2001 From: Quentin Boyer Date: Sat, 10 Aug 2024 18:56:59 +0200 Subject: [PATCH] update-script/rust-analyzer: Filter out headers from option descriptions Headers are not allowed in nixpkgs option descriptions. --- generated/rust-analyzer.nix | 45 ++++++++++--------- update-scripts/default.nix | 2 +- .../default.nix} | 18 +++++++- .../rust-analyzer/heading_filter.lua | 3 ++ 4 files changed, 44 insertions(+), 24 deletions(-) rename update-scripts/{rust-analyzer.nix => rust-analyzer/default.nix} (90%) create mode 100644 update-scripts/rust-analyzer/heading_filter.lua diff --git a/generated/rust-analyzer.nix b/generated/rust-analyzer.nix index 129ce7b0..a47d57b0 100644 --- a/generated/rust-analyzer.nix +++ b/generated/rust-analyzer.nix @@ -1987,15 +1987,18 @@ }; "rust-analyzer.workspace.discoverConfig" = { description = '' - Enables automatic discovery of projects using [`DiscoverWorkspaceConfig::command`]. + Enables automatic discovery of projects using + \[`DiscoverWorkspaceConfig::command`\]. - [`DiscoverWorkspaceConfig`] also requires setting `progress_label` and `files_to_watch`. - `progress_label` is used for the title in progress indicators, whereas `files_to_watch` - is used to determine which build system-specific files should be watched in order to - reload rust-analyzer. + \[`DiscoverWorkspaceConfig`\] also requires setting `progress_label` and + `files_to_watch`. `progress_label` is used for the title in progress + indicators, whereas `files_to_watch` is used to determine which build + system-specific files should be watched in order to reload + rust-analyzer. Below is an example of a valid configuration: - ```json + + ``` json "rust-analyzer.workspace.discoverConfig": { "command": [ "rust-project", @@ -2009,14 +2012,14 @@ } ``` - ## On `DiscoverWorkspaceConfig::command` + **On `DiscoverWorkspaceConfig::command`** **Warning**: This format is provisional and subject to change. - [`DiscoverWorkspaceConfig::command`] *must* return a JSON object + \[`DiscoverWorkspaceConfig::command`\] *must* return a JSON object corresponding to `DiscoverProjectData::Finished`: - ```norun + ``` norun #[derive(Debug, Clone, Deserialize, Serialize)] #[serde(tag = "kind")] #[serde(rename_all = "snake_case")] @@ -2029,7 +2032,7 @@ As JSON, `DiscoverProjectData::Finished` is: - ```json + ``` json { // the internally-tagged representation of the enum. "kind": "finished", @@ -2051,7 +2054,7 @@ which will be substituted with the JSON-serialized form of the following enum: - ```norun + ``` norun #[derive(PartialEq, Clone, Debug, Serialize)] #[serde(rename_all = "camelCase")] pub enum DiscoverArgument { @@ -2062,7 +2065,7 @@ The JSON representation of `DiscoverArgument::Path` is: - ```json + ``` json { "path": "src/main.rs" } @@ -2070,17 +2073,17 @@ Similarly, the JSON representation of `DiscoverArgument::Buildfile` is: - ``` - { - "buildfile": "BUILD" - } - ``` + { + "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: + `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. + ''; pluginDefault = null; type = { diff --git a/update-scripts/default.nix b/update-scripts/default.nix index 25af56b3..91d3e652 100644 --- a/update-scripts/default.nix +++ b/update-scripts/default.nix @@ -25,5 +25,5 @@ lib.fix (self: { # Derivations that build the generated files efmls-configs-sources = pkgs.callPackage ./efmls-configs.nix { }; none-ls-builtins = pkgs.callPackage ./none-ls.nix { }; - rust-analyzer-options = pkgs.callPackage ./rust-analyzer.nix { }; + rust-analyzer-options = pkgs.callPackage ./rust-analyzer { }; }) diff --git a/update-scripts/rust-analyzer.nix b/update-scripts/rust-analyzer/default.nix similarity index 90% rename from update-scripts/rust-analyzer.nix rename to update-scripts/rust-analyzer/default.nix index 181ad852..8a3599b6 100644 --- a/update-scripts/rust-analyzer.nix +++ b/update-scripts/rust-analyzer/default.nix @@ -17,6 +17,8 @@ lib, rust-analyzer, writeText, + pandoc, + runCommand, }: let packageJSON = "${rust-analyzer.src}/editors/code/package.json"; @@ -132,6 +134,18 @@ let type ? null, }: let + filteredMarkdownDesc = + # If there is a risk that the string contains an heading filter it out + if lib.hasInfix "# " markdownDescription then + builtins.readFile ( + runCommand "filtered-documentation" { inherit markdownDescription; } '' + ${lib.getExe pandoc} -o $out -t markdown \ + --lua-filter=${./heading_filter.lua} <<<"$markdownDescription" + '' + ) + else + markdownDescription; + enumDesc = values: descriptions: let @@ -140,7 +154,7 @@ let ); in '' - ${markdownDescription} + ${filteredMarkdownDesc} Values: ${builtins.concatStringsSep "\n" valueDesc} @@ -164,7 +178,7 @@ let enum == null && (anyOf == null || builtins.all (subProp: !(lib.hasAttr "enum" subProp)) anyOf) then '' - ${markdownDescription} + ${filteredMarkdownDesc} '' else if enum != null then assert lib.assertMsg (anyOf == null) "enum + anyOf types are not yet handled"; diff --git a/update-scripts/rust-analyzer/heading_filter.lua b/update-scripts/rust-analyzer/heading_filter.lua new file mode 100644 index 00000000..9d304df9 --- /dev/null +++ b/update-scripts/rust-analyzer/heading_filter.lua @@ -0,0 +1,3 @@ +function Header(elem) + return pandoc.Strong(elem.content) +end