
Fixed environment not being passed to hls, breaking local nix-based installations Release Notes: - N/A
67 lines
2.1 KiB
Rust
67 lines
2.1 KiB
Rust
use zed::lsp::{Symbol, SymbolKind};
|
|
use zed::{CodeLabel, CodeLabelSpan};
|
|
use zed_extension_api::{self as zed, Result};
|
|
|
|
struct HaskellExtension;
|
|
|
|
impl zed::Extension for HaskellExtension {
|
|
fn new() -> Self {
|
|
Self
|
|
}
|
|
|
|
fn language_server_command(
|
|
&mut self,
|
|
_language_server_id: &zed::LanguageServerId,
|
|
worktree: &zed::Worktree,
|
|
) -> Result<zed::Command> {
|
|
let path = worktree
|
|
.which("haskell-language-server-wrapper")
|
|
.ok_or_else(|| "hls must be installed via ghcup".to_string())?;
|
|
|
|
Ok(zed::Command {
|
|
command: path,
|
|
args: vec!["lsp".to_string()],
|
|
env: worktree.shell_env(),
|
|
})
|
|
}
|
|
|
|
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);
|