From a9e58a7f5051f80a78e385210ec6f286a06fc262 Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Sun, 22 Sep 2024 22:23:08 +0200 Subject: [PATCH] feat(ssh_config): Add completions support --- handlers/ssh_config/handlers/completions.go | 39 +++++++++++++++++++ .../lsp/text-document-completion.go | 16 ++++---- 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/handlers/ssh_config/handlers/completions.go b/handlers/ssh_config/handlers/completions.go index e6236c6..c918093 100644 --- a/handlers/ssh_config/handlers/completions.go +++ b/handlers/ssh_config/handlers/completions.go @@ -1,6 +1,7 @@ package handlers import ( + "config-lsp/common" docvalues "config-lsp/doc-values" sshconfig "config-lsp/handlers/ssh_config" "config-lsp/handlers/ssh_config/ast" @@ -57,3 +58,41 @@ func GetRootCompletions( }, ), nil } + +func GetOptionCompletions( + d *sshconfig.SSHDocument, + entry *ast.SSHOption, + block ast.SSHBlock, + cursor common.CursorPosition, +) ([]protocol.CompletionItem, error) { + option, found := fields.Options[entry.Key.Key] + + if !found { + return nil, nil + } + + if entry.Key.Key == "Match" { + return nil, nil + // return getMatchCompletions( + // d, + // cursor, + // matchBlock.MatchValue, + // ) + } + + if entry.OptionValue == nil { + return option.FetchCompletions("", 0), nil + } + + // Hello wo|rld + line := entry.OptionValue.Value.Raw + // NEW: docvalues index + return option.FetchCompletions( + line, + common.DeprecatedImprovedCursorToIndex( + cursor, + line, + entry.OptionValue.Start.Character, + ), + ), nil +} diff --git a/handlers/ssh_config/lsp/text-document-completion.go b/handlers/ssh_config/lsp/text-document-completion.go index 5813dae..56d6973 100644 --- a/handlers/ssh_config/lsp/text-document-completion.go +++ b/handlers/ssh_config/lsp/text-document-completion.go @@ -37,14 +37,14 @@ func TextDocumentCompletion(context *glsp.Context, params *protocol.CompletionPa ) } - // if option.Separator != nil && option.OptionValue.IsPositionAfterStart(cursor) { - // return handlers.GetOptionCompletions( - // d, - // entry, - // matchBlock, - // cursor, - // ) - // } + if option.Separator != nil && option.OptionValue.IsPositionAfterStart(cursor) { + return handlers.GetOptionCompletions( + d, + option, + block, + cursor, + ) + } return nil, nil }