]> git.lizzy.rs Git - rust.git/commitdiff
Allow clients to configure the global workspace search limit
authorPaul Horn <dev@knutwalker.engineer>
Thu, 18 Nov 2021 16:30:36 +0000 (17:30 +0100)
committerPaul Horn <dev@knutwalker.engineer>
Thu, 18 Nov 2021 16:52:02 +0000 (17:52 +0100)
crates/rust-analyzer/src/config.rs
crates/rust-analyzer/src/handlers.rs
docs/user/generated_config.adoc
editors/code/package.json

index 6a72c4e326186905e1b396500e483e3913578796..b07afd5a6949eead8ade46777786979077c7a993 100644 (file)
@@ -288,6 +288,10 @@ struct ConfigData {
         workspace_symbol_search_scope: WorkspaceSymbolSearchScopeDef = "\"workspace\"",
         /// Workspace symbol search kind.
         workspace_symbol_search_kind: WorkspaceSymbolSearchKindDef = "\"only_types\"",
+        /// Limits the number of items returned from a workspace symbol search (Defaults to 128).
+        /// Some clients like vs-code issue new searches on result filtering and don't require all results to be returned in the initial search.
+        /// Other clients requires all results upfront and might require a higher limit.
+        workspace_symbol_search_limit: usize = "128",
     }
 }
 
@@ -421,8 +425,10 @@ pub struct RunnablesConfig {
 pub struct WorkspaceSymbolConfig {
     /// In what scope should the symbol be searched in.
     pub search_scope: WorkspaceSymbolSearchScope,
-    /// What kind of symbol is being search for.
+    /// What kind of symbol is being searched for.
     pub search_kind: WorkspaceSymbolSearchKind,
+    /// How many items are returned at most.
+    pub search_limit: usize,
 }
 
 pub struct ClientCommandsConfig {
@@ -893,6 +899,7 @@ pub fn workspace_symbol(&self) -> WorkspaceSymbolConfig {
                 WorkspaceSymbolSearchKindDef::OnlyTypes => WorkspaceSymbolSearchKind::OnlyTypes,
                 WorkspaceSymbolSearchKindDef::AllSymbols => WorkspaceSymbolSearchKind::AllSymbols,
             },
+            search_limit: self.data.workspace_symbol_search_limit,
         }
     }
 
@@ -1159,6 +1166,7 @@ macro_rules! set {
 
     match ty {
         "bool" => set!("type": "boolean"),
+        "usize" => set!("type": "integer", "minimum": 0),
         "String" => set!("type": "string"),
         "Vec<String>" => set! {
             "type": "array",
index 0ddddeca6759acb0adfddc595b4caefff22774bb..5caf84ff8b517a34b593d7041bbd24f4eadbc34d 100644 (file)
@@ -34,7 +34,7 @@
 
 use crate::{
     cargo_target_spec::CargoTargetSpec,
-    config::RustfmtConfig,
+    config::{RustfmtConfig, WorkspaceSymbolConfig},
     diff::diff,
     from_proto,
     global_state::{GlobalState, GlobalStateSnapshot},
@@ -392,7 +392,9 @@ pub(crate) fn handle_workspace_symbol(
 ) -> Result<Option<Vec<SymbolInformation>>> {
     let _p = profile::span("handle_workspace_symbol");
 
-    let (all_symbols, libs) = decide_search_scope_and_kind(&params, &snap);
+    let config = snap.config.workspace_symbol();
+    let (all_symbols, libs) = decide_search_scope_and_kind(&params, &config);
+    let limit = config.search_limit;
 
     let query = {
         let query: String = params.query.chars().filter(|&c| c != '#' && c != '*').collect();
@@ -403,13 +405,13 @@ pub(crate) fn handle_workspace_symbol(
         if libs {
             q.libs();
         }
-        q.limit(128);
+        q.limit(limit);
         q
     };
     let mut res = exec_query(&snap, query)?;
     if res.is_empty() && !all_symbols {
         let mut query = Query::new(params.query);
-        query.limit(128);
+        query.limit(limit);
         res = exec_query(&snap, query)?;
     }
 
@@ -417,14 +419,12 @@ pub(crate) fn handle_workspace_symbol(
 
     fn decide_search_scope_and_kind(
         params: &WorkspaceSymbolParams,
-        snap: &GlobalStateSnapshot,
+        config: &WorkspaceSymbolConfig,
     ) -> (bool, bool) {
         // Support old-style parsing of markers in the query.
         let mut all_symbols = params.query.contains('#');
         let mut libs = params.query.contains('*');
 
-        let config = snap.config.workspace_symbol();
-
         // If no explicit marker was set, check request params. If that's also empty
         // use global config.
         if !all_symbols {
index c7bb1bf6420e9037fc4e548c24f71debbab0a3b3..8e4c3462b56189224b2d6f32327a38d9a31b269a 100644 (file)
@@ -461,3 +461,10 @@ Workspace symbol search scope.
 --
 Workspace symbol search kind.
 --
+[[rust-analyzer.workspace.symbol.search.limit]]rust-analyzer.workspace.symbol.search.limit (default: `128`)::
++
+--
+Limits the number of items returned from a workspace symbol search (Defaults to 128).
+Some clients like vs-code issue new searches on result filtering and don't require all results to be returned in the initial search.
+Other clients requires all results upfront and might require a higher limit.
+--
index e1cbe8ba64040271cdc736ffb8620d6c4718ce3a..245aa80d457d50edc05b452e28294e7d7f4ba1a4 100644 (file)
                         "Search for all symbols kinds"
                     ]
                 },
+                "rust-analyzer.workspace.symbol.search.limit": {
+                    "markdownDescription": "Limits the number of items returned from a workspace symbol search (Defaults to 128).\nSome clients like vs-code issue new searches on result filtering and don't require all results to be returned in the initial search.\nOther clients requires all results upfront and might require a higher limit.",
+                    "default": 128,
+                    "type": "integer",
+                    "minimum": 0
+                },
                 "$generated-end": {}
             }
         },