Skip to content

Commit da33f6a

Browse files
authored
Adjust project symbol syntax highlights (#97)
These changes should make them the same across all the language servers - Implements `label_for_symbol` for `lexical` to enable syntax highlights when using it - Adds syntax highlights to module attributes when using `next-ls` - Adds syntax highlights to functions and module attributes when using `expert`
1 parent 3664ffb commit da33f6a

3 files changed

Lines changed: 46 additions & 3 deletions

File tree

src/language_servers/expert.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,13 @@ impl Expert {
262262
let display_range = defmodule.len()..defmodule.len() + name.len();
263263
(code, filter_range, display_range)
264264
}
265+
SymbolKind::Function | SymbolKind::Constant => {
266+
let def = "def ";
267+
let code = format!("{def}{name}");
268+
let filter_range = 0..name.len();
269+
let display_range = def.len()..def.len() + name.len();
270+
(code, filter_range, display_range)
271+
}
265272
_ => return None,
266273
};
267274

src/language_servers/lexical.rs

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::fs;
22

33
use zed_extension_api::{
44
self as zed, CodeLabel, CodeLabelSpan, LanguageServerId, Result, Worktree,
5-
lsp::{Completion, CompletionKind, Symbol},
5+
lsp::{Completion, CompletionKind, Symbol, SymbolKind},
66
serde_json::Value,
77
};
88

@@ -210,7 +210,37 @@ impl Lexical {
210210
}
211211
}
212212

213-
pub fn label_for_symbol(&self, _symbol: Symbol) -> Option<CodeLabel> {
214-
None
213+
pub fn label_for_symbol(&self, symbol: Symbol) -> Option<CodeLabel> {
214+
let name = &symbol.name;
215+
216+
let (code, filter_range, display_range) = match symbol.kind {
217+
SymbolKind::Module | SymbolKind::Class | SymbolKind::Interface | SymbolKind::Struct => {
218+
let defmodule = "defmodule ";
219+
let code = format!("{defmodule}{name}");
220+
let filter_range = 0..name.len();
221+
let display_range = defmodule.len()..defmodule.len() + name.len();
222+
(code, filter_range, display_range)
223+
}
224+
SymbolKind::Function => {
225+
let def = "def ";
226+
let code = format!("{def}{name}");
227+
let filter_range = 0..name.len();
228+
let display_range = def.len()..def.len() + name.len();
229+
(code, filter_range, display_range)
230+
}
231+
SymbolKind::Constant => {
232+
let code = name.clone();
233+
let filter_range = 0..code.len();
234+
let display_range = 0..code.len();
235+
(code, filter_range, display_range)
236+
}
237+
_ => return None,
238+
};
239+
240+
Some(CodeLabel {
241+
spans: vec![CodeLabelSpan::code_range(display_range)],
242+
filter_range: filter_range.into(),
243+
code,
244+
})
215245
}
216246
}

src/language_servers/next_ls.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,12 @@ impl NextLs {
249249
let display_range = def.len()..def.len() + name.len();
250250
(code, filter_range, display_range)
251251
}
252+
SymbolKind::Property => {
253+
let code = name.clone();
254+
let filter_range = 0..code.len();
255+
let display_range = 0..code.len();
256+
(code, filter_range, display_range)
257+
}
252258
_ => return None,
253259
};
254260

0 commit comments

Comments
 (0)