From: Paul Horn Date: Thu, 18 Nov 2021 16:30:36 +0000 (+0100) Subject: Allow clients to configure the global workspace search limit X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=553bb7f50aac5d062fd8ba534d18f70aaa9bd25b;p=rust.git Allow clients to configure the global workspace search limit --- diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs index 6a72c4e3261..b07afd5a694 100644 --- a/crates/rust-analyzer/src/config.rs +++ b/crates/rust-analyzer/src/config.rs @@ -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" => set! { "type": "array", diff --git a/crates/rust-analyzer/src/handlers.rs b/crates/rust-analyzer/src/handlers.rs index 0ddddeca675..5caf84ff8b5 100644 --- a/crates/rust-analyzer/src/handlers.rs +++ b/crates/rust-analyzer/src/handlers.rs @@ -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>> { let _p = profile::span("handle_workspace_symbol"); - let (all_symbols, libs) = decide_search_scope_and_kind(¶ms, &snap); + let config = snap.config.workspace_symbol(); + let (all_symbols, libs) = decide_search_scope_and_kind(¶ms, &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 { diff --git a/docs/user/generated_config.adoc b/docs/user/generated_config.adoc index c7bb1bf6420..8e4c3462b56 100644 --- a/docs/user/generated_config.adoc +++ b/docs/user/generated_config.adoc @@ -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. +-- diff --git a/editors/code/package.json b/editors/code/package.json index e1cbe8ba640..245aa80d457 100644 --- a/editors/code/package.json +++ b/editors/code/package.json @@ -929,6 +929,12 @@ "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": {} } },