diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs index 6a72c4e326..b07afd5a69 100644 --- a/crates/rust-analyzer/src/config.rs +++ b/crates/rust-analyzer/src/config.rs @@ -288,6 +288,10 @@ config_data! { 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 @@ impl Config { WorkspaceSymbolSearchKindDef::OnlyTypes => WorkspaceSymbolSearchKind::OnlyTypes, WorkspaceSymbolSearchKindDef::AllSymbols => WorkspaceSymbolSearchKind::AllSymbols, }, + search_limit: self.data.workspace_symbol_search_limit, } } @@ -1159,6 +1166,7 @@ fn field_props(field: &str, ty: &str, doc: &[&str], default: &str) -> serde_json 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 0ddddeca67..5caf84ff8b 100644 --- a/crates/rust-analyzer/src/handlers.rs +++ b/crates/rust-analyzer/src/handlers.rs @@ -34,7 +34,7 @@ use vfs::AbsPathBuf; 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 c7bb1bf642..8e4c3462b5 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 e1cbe8ba64..245aa80d45 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": {} } },