Skip to main content

codelens_engine/lsp/
mod.rs

1pub(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
126/// Known-safe LSP server binaries. Commands not in this list are rejected.
127pub fn is_allowed_lsp_command(command: &str) -> bool {
128    commands::is_allowed_lsp_command(command)
129}
130
131/// The list of allowed LSP server binary names.
132pub const ALLOWED_COMMANDS: &[&str] = commands::ALLOWED_COMMANDS;
133
134#[cfg(test)]
135mod tests;