From 131f4d668264781d57175b51ac1a1526e624f9f4 Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Sat, 17 Apr 2021 08:57:42 +0200 Subject: [PATCH] LSP: Improvements on complete ergonomics --- tools/lsp/main.rs | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/tools/lsp/main.rs b/tools/lsp/main.rs index 8af15f0a1..5097e6b8f 100644 --- a/tools/lsp/main.rs +++ b/tools/lsp/main.rs @@ -69,7 +69,7 @@ fn run_lsp_server() -> Result<(), Error> { let capabilities = ServerCapabilities { completion_provider: Some(CompletionOptions { resolve_provider: Some(true), - trigger_characters: None, + trigger_characters: Some(vec![".".to_owned()]), work_done_progress_options: WorkDoneProgressOptions::default(), }), hover_provider: Some(HoverProviderCapability::Simple(true)), @@ -345,7 +345,25 @@ fn token_descr( if !node.text_range().contains(o.into()) { return None; } - let token = node.token_at_offset(o.into()).last()?; + let mut taf = node.token_at_offset(o.into()); + let token = match (taf.next(), taf.next()) { + (None, _) => return None, + (Some(t), None) => t, + (Some(l), Some(r)) => match (l.kind(), r.kind()) { + // Prioritize identifier + (SyntaxKind::Identifier, _) => l, + (_, SyntaxKind::Identifier) => r, + // then the dot + (SyntaxKind::Dot, _) => l, + (_, SyntaxKind::Dot) => r, + // de-prioritize the white spaces + (SyntaxKind::Whitespace, _) => r, + (SyntaxKind::Comment, _) => r, + (_, SyntaxKind::Whitespace) => l, + (_, SyntaxKind::Comment) => l, + _ => l, + }, + }; Some(SyntaxToken { token, source_file: node.source_file.clone() }) }