Skip to content

Allow clients to configure the global workspace search limit #10802

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 3, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion crates/rust-analyzer/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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",
}
}

Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -893,6 +899,7 @@ impl Config {
WorkspaceSymbolSearchKindDef::OnlyTypes => WorkspaceSymbolSearchKind::OnlyTypes,
WorkspaceSymbolSearchKindDef::AllSymbols => WorkspaceSymbolSearchKind::AllSymbols,
},
search_limit: self.data.workspace_symbol_search_limit,
}
}

Expand Down Expand Up @@ -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<String>" => set! {
"type": "array",
Expand Down
14 changes: 7 additions & 7 deletions crates/rust-analyzer/src/handlers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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},
Expand Down Expand Up @@ -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();
Expand All @@ -403,28 +405,26 @@ 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)?;
}

return Ok(Some(res));

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 {
Expand Down
7 changes: 7 additions & 0 deletions docs/user/generated_config.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -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.
--
6 changes: 6 additions & 0 deletions editors/code/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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": {}
}
},
Expand Down