pub trait LspBackend: Send {
Show 25 methods
// Required methods
fn open_file(
&mut self,
uri: &Uri,
language_id: &str,
text: &str,
) -> Result<(), String>;
fn references(
&mut self,
uri: &Uri,
position: Position,
scope: &str,
) -> Result<Vec<Location>, String>;
fn definition(
&mut self,
uri: &Uri,
position: Position,
) -> Result<GotoDefinitionResponse, String>;
fn implementations(
&mut self,
uri: &Uri,
position: Position,
scope: &str,
) -> Result<Vec<Location>, String>;
fn rename(
&mut self,
uri: &Uri,
position: Position,
new_name: &str,
) -> Result<Option<WorkspaceEdit>, String>;
// Provided methods
fn declaration(
&mut self,
_uri: &Uri,
_position: Position,
) -> Result<Vec<Location>, String> { ... }
fn type_hierarchy(
&mut self,
_uri: &Uri,
_position: Position,
_direction: HierarchyDirection,
) -> Result<TypeHierarchyNode, String> { ... }
fn symbols_overview(
&mut self,
uri: &Uri,
) -> Result<Vec<SymbolOverviewItem>, String> { ... }
fn format(&mut self, _uri: &Uri) -> Result<Vec<TextEdit>, String> { ... }
fn inspections(&mut self, _uri: &Uri) -> Result<Vec<InspectionDiag>, String> { ... }
fn list_inspections(&mut self) -> Result<Vec<InspectionInfo>, String> { ... }
fn replace_symbol_body(
&mut self,
edit: &RangeEdit,
) -> Result<EditResult, String> { ... }
fn insert_before_symbol(
&mut self,
edit: &RangeEdit,
) -> Result<EditResult, String> { ... }
fn insert_after_symbol(
&mut self,
edit: &RangeEdit,
) -> Result<EditResult, String> { ... }
fn rename_preview(
&mut self,
_req: &RenameQuery,
) -> Result<RenamePlan, String> { ... }
fn rename_apply(
&mut self,
_req: &RenameApply,
) -> Result<RenameResult, String> { ... }
fn move_preview(&mut self, _req: &MoveQuery) -> Result<RenamePlan, String> { ... }
fn move_apply(&mut self, _req: &MoveApply) -> Result<RenameResult, String> { ... }
fn safe_delete_preview(
&mut self,
_req: &SafeDeleteQuery,
) -> Result<RenamePlan, String> { ... }
fn safe_delete_apply(
&mut self,
_req: &SafeDeleteApply,
) -> Result<RenameResult, String> { ... }
fn inline_preview(
&mut self,
_req: &InlineQuery,
) -> Result<RenamePlan, String> { ... }
fn inline_apply(
&mut self,
_req: &InlineApply,
) -> Result<RenameResult, String> { ... }
fn reformat(
&mut self,
_req: &ReformatQuery,
) -> Result<ReformatResult, String> { ... }
fn is_stale(&self, _project_root: &str) -> bool { ... }
fn last_truncation(&self) -> Option<Truncation> { ... }
}Expand description
Code-intelligence backend. Send so instances can live in the global
BACKENDS cache (Mutex<HashMap<String, Box<dyn LspBackend>>>).
Required Methods§
fn open_file( &mut self, uri: &Uri, language_id: &str, text: &str, ) -> Result<(), String>
fn references( &mut self, uri: &Uri, position: Position, scope: &str, ) -> Result<Vec<Location>, String>
fn definition( &mut self, uri: &Uri, position: Position, ) -> Result<GotoDefinitionResponse, String>
fn implementations( &mut self, uri: &Uri, position: Position, scope: &str, ) -> Result<Vec<Location>, String>
fn rename( &mut self, uri: &Uri, position: Position, new_name: &str, ) -> Result<Option<WorkspaceEdit>, String>
Provided Methods§
fn declaration( &mut self, _uri: &Uri, _position: Position, ) -> Result<Vec<Location>, String>
fn type_hierarchy( &mut self, _uri: &Uri, _position: Position, _direction: HierarchyDirection, ) -> Result<TypeHierarchyNode, String>
fn symbols_overview( &mut self, uri: &Uri, ) -> Result<Vec<SymbolOverviewItem>, String>
fn format(&mut self, _uri: &Uri) -> Result<Vec<TextEdit>, String>
fn inspections(&mut self, _uri: &Uri) -> Result<Vec<InspectionDiag>, String>
fn list_inspections(&mut self) -> Result<Vec<InspectionInfo>, String>
Sourcefn replace_symbol_body(
&mut self,
edit: &RangeEdit,
) -> Result<EditResult, String>
fn replace_symbol_body( &mut self, edit: &RangeEdit, ) -> Result<EditResult, String>
Replace a symbol’s full declaration range with edit.text.
DEFAULT = headless local range write; JetBrainsHttpBackend overrides.
Sourcefn insert_before_symbol(
&mut self,
edit: &RangeEdit,
) -> Result<EditResult, String>
fn insert_before_symbol( &mut self, edit: &RangeEdit, ) -> Result<EditResult, String>
Insert a new sibling before the anchor symbol (range is zero-width at the
anchor start line; indentation already baked into edit.text).
Sourcefn insert_after_symbol(
&mut self,
edit: &RangeEdit,
) -> Result<EditResult, String>
fn insert_after_symbol( &mut self, edit: &RangeEdit, ) -> Result<EditResult, String>
Insert a new sibling after the anchor symbol (range is zero-width at the
line following the anchor; indentation already baked into edit.text).
Sourcefn rename_preview(&mut self, _req: &RenameQuery) -> Result<RenamePlan, String>
fn rename_preview(&mut self, _req: &RenameQuery) -> Result<RenamePlan, String>
Phase 1 of the Two-Phase rename: resolve all usages + conflicts of the
target symbol. DEFAULT = Err(BACKEND_REQUIRED) — there is NO lossless
headless usage search (spec §3); only Backing B (live IDE) overrides this.
Sourcefn rename_apply(&mut self, _req: &RenameApply) -> Result<RenameResult, String>
fn rename_apply(&mut self, _req: &RenameApply) -> Result<RenameResult, String>
Phase 2 of the Two-Phase rename: perform the Multi-File rename as ONE
transaction (one Undo entry). DEFAULT = Err(BACKEND_REQUIRED).
Sourcefn move_preview(&mut self, _req: &MoveQuery) -> Result<RenamePlan, String>
fn move_preview(&mut self, _req: &MoveQuery) -> Result<RenamePlan, String>
Phase 1 of the Two-Phase move: resolve all usages + conflicts of the
target at the new location. DEFAULT = Err(BACKEND_REQUIRED) (no lossless
headless move; only Backing B overrides — spec §5.5).
Sourcefn move_apply(&mut self, _req: &MoveApply) -> Result<RenameResult, String>
fn move_apply(&mut self, _req: &MoveApply) -> Result<RenameResult, String>
Phase 2 of the Two-Phase move: perform the Multi-File move as ONE Undo
transaction. DEFAULT = Err(BACKEND_REQUIRED).
Sourcefn safe_delete_preview(
&mut self,
_req: &SafeDeleteQuery,
) -> Result<RenamePlan, String>
fn safe_delete_preview( &mut self, _req: &SafeDeleteQuery, ) -> Result<RenamePlan, String>
Phase 1 of the Two-Phase safe-delete: report the REMAINING (blocking)
references as usages/conflicts. DEFAULT = Err(BACKEND_REQUIRED).
Sourcefn safe_delete_apply(
&mut self,
_req: &SafeDeleteApply,
) -> Result<RenameResult, String>
fn safe_delete_apply( &mut self, _req: &SafeDeleteApply, ) -> Result<RenameResult, String>
Phase 2 of the Two-Phase safe-delete: delete the symbol (force =
deleteEvenIfUsed) as ONE Undo transaction. DEFAULT = Err(BACKEND_REQUIRED).
Sourcefn inline_preview(&mut self, _req: &InlineQuery) -> Result<RenamePlan, String>
fn inline_preview(&mut self, _req: &InlineQuery) -> Result<RenamePlan, String>
Phase 1 of the Two-Phase inline: resolve all substitution sites + conflicts.
DEFAULT = Err(BACKEND_REQUIRED) — only Backing B (live IDE) overrides (spec §5.4).
Sourcefn inline_apply(&mut self, _req: &InlineApply) -> Result<RenameResult, String>
fn inline_apply(&mut self, _req: &InlineApply) -> Result<RenameResult, String>
Phase 2 of the Two-Phase inline: substitute at every call site as ONE Undo
transaction. Hard refusal (recursive, multiple returns, override) → UNSUPPORTED
at the backend. DEFAULT = Err(BACKEND_REQUIRED).
Sourcefn reformat(&mut self, _req: &ReformatQuery) -> Result<ReformatResult, String>
fn reformat(&mut self, _req: &ReformatQuery) -> Result<ReformatResult, String>
Single-Phase reformat (spec §5.3): no preview, no plan_hash.
DEFAULT = Err(BACKEND_REQUIRED).
Sourcefn is_stale(&self, _project_root: &str) -> bool
fn is_stale(&self, _project_root: &str) -> bool
Whether a cached instance of this backend is no longer valid and must be
evicted + re-selected. Backing A (in-process LSP) is never stale → default false.
Backing B overrides: the IDE may have closed/restarted since caching.
Sourcefn last_truncation(&self) -> Option<Truncation>
fn last_truncation(&self) -> Option<Truncation>
Truncation metadata of the most recent capped call, or None (Backing A,
or no capped call yet). Lets ctx_refactor surface “(truncated …)”.
Dyn Compatibility§
This trait is dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".