codelens_engine/lsp/
mod.rs1pub(crate) mod code_actions;
2pub(crate) mod commands;
3#[cfg(test)]
4mod parser_tests;
5pub(crate) mod parsers;
6pub(crate) mod paths;
7pub(crate) mod position;
8pub(crate) mod protocol;
9pub mod registry;
10pub(crate) mod session;
11pub(crate) mod session_requests;
12pub(crate) mod type_hierarchy;
13pub mod types;
14pub(crate) mod workspace_edit;
15
16pub use registry::{
17 LSP_RECIPES, LspRecipe, LspStatus, check_lsp_status, default_lsp_args_for_command,
18 default_lsp_command_for_extension, default_lsp_command_for_path, get_lsp_recipe,
19 lsp_binary_exists,
20};
21pub use session::LspSessionPool;
22pub use types::{
23 LspCodeActionRefactorPlan, LspCodeActionRefactorResult, LspCodeActionRequest, LspDiagnostic,
24 LspDiagnosticRequest, LspReference, LspRenamePlan, LspRenamePlanRequest, LspRenameRequest,
25 LspRequest, LspResolveTargetRequest, LspResolvedTarget, LspResourceOp, LspTypeHierarchyNode,
26 LspTypeHierarchyRequest, LspWorkspaceEditTransaction, LspWorkspaceSymbol,
27 LspWorkspaceSymbolRequest,
28};
29
30use crate::project::ProjectRoot;
31use anyhow::Result;
32use serde_json::Value;
33use std::collections::HashMap;
34
35pub fn find_referencing_symbols_via_lsp(
36 project: &ProjectRoot,
37 request: &LspRequest,
38) -> Result<Vec<LspReference>> {
39 let pool = LspSessionPool::new(project.clone());
40 pool.find_referencing_symbols(request)
41}
42
43pub fn get_diagnostics_via_lsp(
44 project: &ProjectRoot,
45 request: &LspDiagnosticRequest,
46) -> Result<Vec<LspDiagnostic>> {
47 let pool = LspSessionPool::new(project.clone());
48 pool.get_diagnostics(request)
49}
50
51pub fn search_workspace_symbols_via_lsp(
52 project: &ProjectRoot,
53 request: &LspWorkspaceSymbolRequest,
54) -> Result<Vec<LspWorkspaceSymbol>> {
55 let pool = LspSessionPool::new(project.clone());
56 pool.search_workspace_symbols(request)
57}
58
59pub fn get_type_hierarchy_via_lsp(
60 project: &ProjectRoot,
61 request: &LspTypeHierarchyRequest,
62) -> Result<HashMap<String, Value>> {
63 let pool = LspSessionPool::new(project.clone());
64 pool.get_type_hierarchy(request)
65}
66
67pub fn resolve_symbol_target_via_lsp(
68 project: &ProjectRoot,
69 request: &LspResolveTargetRequest,
70) -> Result<Vec<LspResolvedTarget>> {
71 let pool = LspSessionPool::new(project.clone());
72 pool.resolve_symbol_target(request)
73}
74
75pub fn get_rename_plan_via_lsp(
76 project: &ProjectRoot,
77 request: &LspRenamePlanRequest,
78) -> Result<LspRenamePlan> {
79 let pool = LspSessionPool::new(project.clone());
80 pool.get_rename_plan(request)
81}
82
83pub fn rename_symbol_via_lsp(
84 project: &ProjectRoot,
85 request: &LspRenameRequest,
86) -> Result<crate::rename::RenameResult> {
87 let pool = LspSessionPool::new(project.clone());
88 pool.rename_symbol(request)
89}
90
91pub fn code_action_refactor_via_lsp(
92 project: &ProjectRoot,
93 request: &LspCodeActionRequest,
94) -> Result<LspCodeActionRefactorResult> {
95 let pool = LspSessionPool::new(project.clone());
96 pool.code_action_refactor(request)
97}
98
99pub fn workspace_edit_transaction_from_value(
100 project: &ProjectRoot,
101 edit: &Value,
102) -> Result<LspWorkspaceEditTransaction> {
103 workspace_edit::workspace_edit_transaction_from_edit(project, edit)
104}
105
106pub fn apply_workspace_edit_value(
107 project: &ProjectRoot,
108 edit: &Value,
109 dry_run: bool,
110) -> Result<LspWorkspaceEditTransaction> {
111 let transaction = workspace_edit_transaction_from_value(project, edit)?;
112 if !dry_run {
113 let _ = apply_workspace_edit_transaction(project, &transaction)
114 .map_err(|e| anyhow::Error::msg(e.to_string()))?;
115 }
116 Ok(transaction)
117}
118
119pub fn apply_workspace_edit_transaction(
120 project: &ProjectRoot,
121 transaction: &LspWorkspaceEditTransaction,
122) -> Result<crate::edit_transaction::ApplyEvidence, crate::edit_transaction::ApplyError> {
123 workspace_edit::apply_workspace_edit_transaction(project, transaction)
124}
125
126pub fn is_allowed_lsp_command(command: &str) -> bool {
128 commands::is_allowed_lsp_command(command)
129}
130
131pub const ALLOWED_COMMANDS: &[&str] = commands::ALLOWED_COMMANDS;
133
134#[cfg(test)]
135mod tests;