Skip to content

Commit 3e2e8a8

Browse files
committed
perf: Reduce client_commands allocations in proto conversion
1 parent c8472a7 commit 3e2e8a8

File tree

2 files changed

+45
-20
lines changed

2 files changed

+45
-20
lines changed

crates/rust-analyzer/src/handlers/request.rs

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ use triomphe::Arc;
3333
use vfs::{AbsPath, AbsPathBuf, FileId, VfsPath};
3434

3535
use crate::{
36-
config::{Config, RustfmtConfig, WorkspaceSymbolConfig},
36+
config::{
37+
ClientCommandsConfig, Config, HoverActionsConfig, RustfmtConfig, WorkspaceSymbolConfig,
38+
},
3739
diagnostics::convert_diagnostic,
3840
global_state::{FetchWorkspaceRequest, GlobalState, GlobalStateSnapshot},
3941
line_index::LineEndings,
@@ -1463,13 +1465,14 @@ pub(crate) fn handle_code_action(
14631465
resolve,
14641466
frange,
14651467
)?;
1468+
let client_commands = snap.config.client_commands();
14661469
for (index, assist) in assists.into_iter().enumerate() {
14671470
let resolve_data = if code_action_resolve_cap {
14681471
Some((index, params.clone(), snap.file_version(file_id)))
14691472
} else {
14701473
None
14711474
};
1472-
let code_action = to_proto::code_action(&snap, assist, resolve_data)?;
1475+
let code_action = to_proto::code_action(&snap, &client_commands, assist, resolve_data)?;
14731476

14741477
// Check if the client supports the necessary `ResourceOperation`s.
14751478
let changes = code_action.edit.as_ref().and_then(|it| it.document_changes.as_ref());
@@ -1570,7 +1573,7 @@ pub(crate) fn handle_code_action_resolve(
15701573
))
15711574
.into());
15721575
}
1573-
let ca = to_proto::code_action(&snap, assist.clone(), None)?;
1576+
let ca = to_proto::code_action(&snap, &snap.config.client_commands(), assist.clone(), None)?;
15741577
code_action.edit = ca.edit;
15751578
code_action.command = ca.command;
15761579

@@ -2134,9 +2137,11 @@ fn to_command_link(command: lsp_types::Command, tooltip: String) -> lsp_ext::Com
21342137
fn show_impl_command_link(
21352138
snap: &GlobalStateSnapshot,
21362139
position: &FilePosition,
2140+
implementations: bool,
2141+
show_references: bool,
21372142
) -> Option<lsp_ext::CommandLinkGroup> {
2138-
if snap.config.hover_actions().implementations
2139-
&& snap.config.client_commands().show_reference
2143+
if implementations
2144+
&& show_references
21402145
&& let Some(nav_data) = snap.analysis.goto_implementation(*position).unwrap_or(None)
21412146
{
21422147
let uri = to_proto::url(snap, position.file_id);
@@ -2161,9 +2166,11 @@ fn show_impl_command_link(
21612166
fn show_ref_command_link(
21622167
snap: &GlobalStateSnapshot,
21632168
position: &FilePosition,
2169+
references: bool,
2170+
show_reference: bool,
21642171
) -> Option<lsp_ext::CommandLinkGroup> {
2165-
if snap.config.hover_actions().references
2166-
&& snap.config.client_commands().show_reference
2172+
if references
2173+
&& show_reference
21672174
&& let Some(ref_search_res) = snap
21682175
.analysis
21692176
.find_all_refs(
@@ -2198,8 +2205,9 @@ fn show_ref_command_link(
21982205
fn runnable_action_links(
21992206
snap: &GlobalStateSnapshot,
22002207
runnable: Runnable,
2208+
hover_actions_config: &HoverActionsConfig,
2209+
client_commands_config: &ClientCommandsConfig,
22012210
) -> Option<lsp_ext::CommandLinkGroup> {
2202-
let hover_actions_config = snap.config.hover_actions();
22032211
if !hover_actions_config.runnable() {
22042212
return None;
22052213
}
@@ -2209,7 +2217,6 @@ fn runnable_action_links(
22092217
return None;
22102218
}
22112219

2212-
let client_commands_config = snap.config.client_commands();
22132220
if !(client_commands_config.run_single || client_commands_config.debug_single) {
22142221
return None;
22152222
}
@@ -2244,11 +2251,10 @@ fn runnable_action_links(
22442251
fn goto_type_action_links(
22452252
snap: &GlobalStateSnapshot,
22462253
nav_targets: &[HoverGotoTypeData],
2254+
hover_actions: &HoverActionsConfig,
2255+
client_commands: &ClientCommandsConfig,
22472256
) -> Option<lsp_ext::CommandLinkGroup> {
2248-
if !snap.config.hover_actions().goto_type_def
2249-
|| nav_targets.is_empty()
2250-
|| !snap.config.client_commands().goto_location
2251-
{
2257+
if !hover_actions.goto_type_def || nav_targets.is_empty() || !client_commands.goto_location {
22522258
return None;
22532259
}
22542260

@@ -2268,13 +2274,29 @@ fn prepare_hover_actions(
22682274
snap: &GlobalStateSnapshot,
22692275
actions: &[HoverAction],
22702276
) -> Vec<lsp_ext::CommandLinkGroup> {
2277+
let hover_actions = snap.config.hover_actions();
2278+
let client_commands = snap.config.client_commands();
22712279
actions
22722280
.iter()
22732281
.filter_map(|it| match it {
2274-
HoverAction::Implementation(position) => show_impl_command_link(snap, position),
2275-
HoverAction::Reference(position) => show_ref_command_link(snap, position),
2276-
HoverAction::Runnable(r) => runnable_action_links(snap, r.clone()),
2277-
HoverAction::GoToType(targets) => goto_type_action_links(snap, targets),
2282+
HoverAction::Implementation(position) => show_impl_command_link(
2283+
snap,
2284+
position,
2285+
hover_actions.implementations,
2286+
client_commands.show_reference,
2287+
),
2288+
HoverAction::Reference(position) => show_ref_command_link(
2289+
snap,
2290+
position,
2291+
hover_actions.references,
2292+
client_commands.show_reference,
2293+
),
2294+
HoverAction::Runnable(r) => {
2295+
runnable_action_links(snap, r.clone(), &hover_actions, &client_commands)
2296+
}
2297+
HoverAction::GoToType(targets) => {
2298+
goto_type_action_links(snap, targets, &hover_actions, &client_commands)
2299+
}
22782300
})
22792301
.collect()
22802302
}

crates/rust-analyzer/src/lsp/to_proto.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use serde_json::to_value;
2626
use vfs::AbsPath;
2727

2828
use crate::{
29-
config::{CallInfoConfig, Config},
29+
config::{CallInfoConfig, ClientCommandsConfig, Config},
3030
global_state::GlobalStateSnapshot,
3131
line_index::{LineEndings, LineIndex, PositionEncoding},
3232
lsp::{
@@ -258,10 +258,12 @@ pub(crate) fn completion_items(
258258

259259
let max_relevance = items.iter().map(|it| it.relevance.score()).max().unwrap_or_default();
260260
let mut res = Vec::with_capacity(items.len());
261+
let client_commands = config.client_commands();
261262
for item in items {
262263
completion_item(
263264
&mut res,
264265
config,
266+
&client_commands,
265267
fields_to_resolve,
266268
line_index,
267269
version,
@@ -283,6 +285,7 @@ pub(crate) fn completion_items(
283285
fn completion_item(
284286
acc: &mut Vec<lsp_types::CompletionItem>,
285287
config: &Config,
288+
client_commands: &ClientCommandsConfig,
286289
fields_to_resolve: &CompletionFieldsToResolve,
287290
line_index: &LineIndex,
288291
version: Option<i32>,
@@ -342,7 +345,7 @@ fn completion_item(
342345
} else {
343346
item.deprecated.then(|| vec![lsp_types::CompletionItemTag::DEPRECATED])
344347
};
345-
let command = if item.trigger_call_info && config.client_commands().trigger_parameter_hints {
348+
let command = if item.trigger_call_info && client_commands.trigger_parameter_hints {
346349
if fields_to_resolve.resolve_command {
347350
something_to_resolve |= true;
348351
None
@@ -1500,6 +1503,7 @@ pub(crate) fn code_action_kind(kind: AssistKind) -> lsp_types::CodeActionKind {
15001503

15011504
pub(crate) fn code_action(
15021505
snap: &GlobalStateSnapshot,
1506+
commands: &ClientCommandsConfig,
15031507
assist: Assist,
15041508
resolve_data: Option<(usize, lsp_types::CodeActionParams, Option<i32>)>,
15051509
) -> Cancellable<lsp_ext::CodeAction> {
@@ -1513,7 +1517,6 @@ pub(crate) fn code_action(
15131517
command: None,
15141518
};
15151519

1516-
let commands = snap.config.client_commands();
15171520
res.command = match assist.command {
15181521
Some(assists::Command::TriggerParameterHints) if commands.trigger_parameter_hints => {
15191522
Some(command::trigger_parameter_hints())

0 commit comments

Comments
 (0)