From 32ffbb8dbf8662f762c45ceaaa86bc94494540c8 Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Sun, 18 Aug 2024 14:56:57 +0200 Subject: [PATCH] fix(wireguard): Improve root completions --- handlers/wireguard/analyzer.go | 4 +-- handlers/wireguard/parser_completions_test.go | 21 ++++++++++++++ .../wireguard/text-document-completion.go | 3 +- handlers/wireguard/wg-parser.go | 29 +++++++++++++++++-- 4 files changed, 51 insertions(+), 6 deletions(-) diff --git a/handlers/wireguard/analyzer.go b/handlers/wireguard/analyzer.go index e34e069..5643081 100644 --- a/handlers/wireguard/analyzer.go +++ b/handlers/wireguard/analyzer.go @@ -20,13 +20,13 @@ func (p wireguardParser) checkForDuplicateProperties() []protocol.Diagnostic { diagnostics := []protocol.Diagnostic{} for _, section := range p.Sections { - diagnostics = append(diagnostics, section.analyDuplicateProperties()...) + diagnostics = append(diagnostics, section.analyzeDuplicateProperties()...) } return diagnostics } -func (p wireguardSection) analyDuplicateProperties() []protocol.Diagnostic { +func (p wireguardSection) analyzeDuplicateProperties() []protocol.Diagnostic { diagnostics := []protocol.Diagnostic{} existingProperties := make(map[string]uint32) diff --git a/handlers/wireguard/parser_completions_test.go b/handlers/wireguard/parser_completions_test.go index ca3e9e0..3dfc48b 100644 --- a/handlers/wireguard/parser_completions_test.go +++ b/handlers/wireguard/parser_completions_test.go @@ -146,3 +146,24 @@ DNS t.Fatalf("getCompletionsForPropertyLine: Expected completion to be '= ', but got '%v'", completions[0].Label) } } + +func TestHeaderButNoProperty( + t *testing.T, +) { + sample := dedent(` +[Interface] + +`) + parser := createWireguardParser() + parser.parseFromString(sample) + + completions, err := parser.Sections[0].getCompletionsForEmptyLine() + + if err != nil { + t.Fatalf("getCompletionsForEmptyLine failed with error: %v", err) + } + + if len(completions) != len(interfaceOptions) { + t.Fatalf("getCompletionsForEmptyLine: Expected %v completions, but got %v", len(interfaceOptions), len(completions)) + } +} diff --git a/handlers/wireguard/text-document-completion.go b/handlers/wireguard/text-document-completion.go index 0c81f53..3a8c06d 100644 --- a/handlers/wireguard/text-document-completion.go +++ b/handlers/wireguard/text-document-completion.go @@ -19,7 +19,8 @@ func TextDocumentCompletion(context *glsp.Context, params *protocol.CompletionPa case LineTypeHeader: return parser.getRootCompletionsForEmptyLine(), nil case LineTypeEmpty: - if section == nil { + if section.Name == nil { + // Root completions return parser.getRootCompletionsForEmptyLine(), nil } diff --git a/handlers/wireguard/wg-parser.go b/handlers/wireguard/wg-parser.go index 63e7836..9eb81fe 100644 --- a/handlers/wireguard/wg-parser.go +++ b/handlers/wireguard/wg-parser.go @@ -49,14 +49,29 @@ func (p wireguardParser) getInterfaceSection() (*wireguardSection, bool) { return nil, false } +func getHeaderCompletion(name string, documentation string) protocol.CompletionItem { + textFormat := protocol.InsertTextFormatPlainText + kind := protocol.CompletionItemKindEnum + + insertText := "[" + name + "]\n" + + return protocol.CompletionItem{ + Label: "[" + name + "]", + InsertTextFormat: &textFormat, + InsertText: &insertText, + Kind: &kind, + Documentation: &documentation, + } +} + func (p wireguardParser) getRootCompletionsForEmptyLine() []protocol.CompletionItem { completions := []protocol.CompletionItem{} if _, found := p.getInterfaceSection(); !found { - completions = append(completions, headerInterfaceEnum.ToCompletionItem()) + completions = append(completions, getHeaderCompletion("Interface", headerInterfaceEnum.Documentation)) } - completions = append(completions, headerPeerEnum.ToCompletionItem()) + completions = append(completions, getHeaderCompletion("Peer", headerPeerEnum.Documentation)) return completions } @@ -175,9 +190,17 @@ func (p *wireguardParser) parseFromString(input string) []common.ParseError { var emptySection *wireguardSection if len(collectedProperties) > 0 { + var endLine uint32 + + if len(p.Sections) == 0 { + endLine = uint32(len(lines)) + } else { + endLine = p.Sections[len(p.Sections)-1].StartLine + } + emptySection = &wireguardSection{ StartLine: 0, - EndLine: p.Sections[len(p.Sections)-1].StartLine - 1, + EndLine: endLine, Properties: collectedProperties, }