Skip to content

Commit 21c51b3

Browse files
authored
Add support for textDocument/documentHighlight request (#308)
* Add support for textDocument/documentHighlight request * Search for references only in the current file
1 parent 805ab71 commit 21c51b3

File tree

4 files changed

+43
-0
lines changed

4 files changed

+43
-0
lines changed

vhdl_lang/src/analysis/root.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,12 @@ impl DesignRoot {
520520
searcher.references
521521
}
522522

523+
pub fn find_all_references_in_source(&self, source: &Source, ent: EntRef) -> Vec<SrcPos> {
524+
let mut searcher = FindAllReferences::new(self, ent);
525+
let _ = self.search_source(source, &mut searcher);
526+
searcher.references
527+
}
528+
523529
pub fn public_symbols<'a>(&'a self) -> Box<dyn Iterator<Item = EntRef<'a>> + 'a> {
524530
Box::new(self.libraries.values().flat_map(|library| {
525531
std::iter::once(self.arenas.get(library.id)).chain(library.units.values().flat_map(

vhdl_lang/src/project.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,10 @@ impl Project {
309309
self.root.find_all_references(ent)
310310
}
311311

312+
pub fn find_all_references_in_source(&self, source: &Source, ent: &AnyEnt) -> Vec<SrcPos> {
313+
self.root.find_all_references_in_source(source, ent)
314+
}
315+
312316
/// Get source positions that are not resolved to a declaration
313317
/// This is used for development to test where the language server is blind
314318
pub fn find_all_unresolved(&self) -> (usize, Vec<SrcPos>) {

vhdl_ls/src/stdio_server.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,14 @@ impl ConnectionRpcChannel {
190190
}
191191
Err(request) => request,
192192
};
193+
let request = match extract::<request::DocumentHighlightRequest>(request) {
194+
Ok((id, params)) => {
195+
let result = server.document_highlight(&params.text_document_position_params);
196+
self.send_response(lsp_server::Response::new_ok(id, result));
197+
return;
198+
}
199+
Err(request) => request,
200+
};
193201
let request = match extract::<request::HoverRequest>(request) {
194202
Ok((id, params)) => {
195203
let result = server.text_document_hover(&params.text_document_position_params);

vhdl_ls/src/vhdl_server.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ impl VHDLServer {
182182
})),
183183
workspace_symbol_provider: Some(OneOf::Left(true)),
184184
document_symbol_provider: Some(OneOf::Left(true)),
185+
document_highlight_provider: Some(OneOf::Left(true)),
185186
completion_provider: Some(CompletionOptions {
186187
resolve_provider: Some(true),
187188
trigger_characters: Some(trigger_chars),
@@ -681,6 +682,30 @@ impl VHDLServer {
681682
})
682683
}
683684

685+
pub fn document_highlight(
686+
&mut self,
687+
params: &TextDocumentPositionParams,
688+
) -> Option<Vec<DocumentHighlight>> {
689+
let source = self
690+
.project
691+
.get_source(&uri_to_file_name(&params.text_document.uri))?;
692+
693+
let ent = self
694+
.project
695+
.find_declaration(&source, from_lsp_pos(params.position))?;
696+
697+
Some(
698+
self.project
699+
.find_all_references_in_source(&source, ent)
700+
.iter()
701+
.map(|pos| DocumentHighlight {
702+
range: to_lsp_range(pos.range()),
703+
kind: Some(DocumentHighlightKind::TEXT),
704+
})
705+
.collect(),
706+
)
707+
}
708+
684709
pub fn workspace_symbol(
685710
&self,
686711
params: &WorkspaceSymbolParams,

0 commit comments

Comments
 (0)