Add label_for_symbol
to extension API (#10179)
This PR adds `label_for_symbol` to the extension API. As a motivating example, we implemented `label_for_symbol` for the Haskell extension. Release Notes: - N/A Co-authored-by: Max <max@zed.dev>
This commit is contained in:
parent
5d88d9c0d7
commit
4a325614f0
10 changed files with 238 additions and 43 deletions
|
@ -13,4 +13,5 @@ path = "src/haskell.rs"
|
|||
crate-type = ["cdylib"]
|
||||
|
||||
[dependencies]
|
||||
zed_extension_api = "0.0.4"
|
||||
# zed_extension_api = "0.0.4"
|
||||
zed_extension_api = { path = "../../crates/extension_api" }
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
use zed::lsp::{Symbol, SymbolKind};
|
||||
use zed::{CodeLabel, CodeLabelSpan};
|
||||
use zed_extension_api::{self as zed, Result};
|
||||
|
||||
struct HaskellExtension;
|
||||
|
@ -9,7 +11,7 @@ impl zed::Extension for HaskellExtension {
|
|||
|
||||
fn language_server_command(
|
||||
&mut self,
|
||||
_config: zed::LanguageServerConfig,
|
||||
_language_server_id: &zed::LanguageServerId,
|
||||
worktree: &zed::Worktree,
|
||||
) -> Result<zed::Command> {
|
||||
let path = worktree
|
||||
|
@ -22,6 +24,44 @@ impl zed::Extension for HaskellExtension {
|
|||
env: Default::default(),
|
||||
})
|
||||
}
|
||||
|
||||
fn label_for_symbol(
|
||||
&self,
|
||||
_language_server_id: &zed::LanguageServerId,
|
||||
symbol: Symbol,
|
||||
) -> Option<CodeLabel> {
|
||||
let name = &symbol.name;
|
||||
|
||||
let (code, display_range, filter_range) = match symbol.kind {
|
||||
SymbolKind::Struct => {
|
||||
let data_decl = "data ";
|
||||
let code = format!("{data_decl}{name} = A");
|
||||
let display_range = 0..data_decl.len() + name.len();
|
||||
let filter_range = data_decl.len()..display_range.end;
|
||||
(code, display_range, filter_range)
|
||||
}
|
||||
SymbolKind::Constructor => {
|
||||
let data_decl = "data A = ";
|
||||
let code = format!("{data_decl}{name}");
|
||||
let display_range = data_decl.len()..data_decl.len() + name.len();
|
||||
let filter_range = 0..name.len();
|
||||
(code, display_range, filter_range)
|
||||
}
|
||||
SymbolKind::Variable => {
|
||||
let code = format!("{name} :: T");
|
||||
let display_range = 0..name.len();
|
||||
let filter_range = 0..name.len();
|
||||
(code, display_range, filter_range)
|
||||
}
|
||||
_ => return None,
|
||||
};
|
||||
|
||||
Some(CodeLabel {
|
||||
spans: vec![CodeLabelSpan::code_range(display_range)],
|
||||
filter_range: filter_range.into(),
|
||||
code,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
zed::register_extension!(HaskellExtension);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue