From ea667653cd0ecc2aabbbd8080824bf7aa534bd72 Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Fri, 29 Nov 2024 19:04:47 +0100 Subject: [PATCH] fix(server): Improve quotes --- server/handlers/ssh_config/analyzer/quotes.go | 19 +++++++++++-------- .../ssh_config/analyzer/quotes_test.go | 3 ++- .../handlers/sshd_config/analyzer/quotes.go | 9 ++------- server/utils/quotes.go | 14 ++++++-------- server/utils/quotes_test.go | 12 ++++++++++++ 5 files changed, 33 insertions(+), 24 deletions(-) diff --git a/server/handlers/ssh_config/analyzer/quotes.go b/server/handlers/ssh_config/analyzer/quotes.go index 2155fe9..50a3399 100644 --- a/server/handlers/ssh_config/analyzer/quotes.go +++ b/server/handlers/ssh_config/analyzer/quotes.go @@ -27,15 +27,18 @@ func checkIsUsingDoubleQuotes( valueRange common.LocationRange, ) { quoteRanges := utils.GetQuoteRanges(value.Raw) - singleQuotePosition := strings.Index(value.Raw, "'") + invertedRanges := quoteRanges.GetInvertedRanges(len(value.Raw)) - // Single quote - if singleQuotePosition != -1 && !quoteRanges.IsIndexInsideQuotes(singleQuotePosition) { - ctx.diagnostics = append(ctx.diagnostics, protocol.Diagnostic{ - Range: valueRange.ToLSPRange(), - Message: "ssh_config does not support single quotes. Use double quotes (\") instead.", - Severity: &common.SeverityError, - }) + for _, rang := range invertedRanges { + text := value.Raw[rang[0]:rang[1]] + + if strings.Contains(text, "'") { + ctx.diagnostics = append(ctx.diagnostics, protocol.Diagnostic{ + Range: valueRange.ToLSPRange(), + Message: "ssh_config does not support single quotes. Use double quotes (\") instead.", + Severity: &common.SeverityError, + }) + } } } diff --git a/server/handlers/ssh_config/analyzer/quotes_test.go b/server/handlers/ssh_config/analyzer/quotes_test.go index accb08a..c52a218 100644 --- a/server/handlers/ssh_config/analyzer/quotes_test.go +++ b/server/handlers/ssh_config/analyzer/quotes_test.go @@ -101,7 +101,8 @@ func TestValidDependentOptionsExample( d := testutils_test.DocumentFromInput(t, ` Port 1234 CanonicalizeHostname yes -CanonicalDomains example.com +CanonicalDomains "example.com" +Test "hello world 'test' " `) ctx := &analyzerContext{ document: d, diff --git a/server/handlers/sshd_config/analyzer/quotes.go b/server/handlers/sshd_config/analyzer/quotes.go index 7dbf275..a563bc5 100644 --- a/server/handlers/sshd_config/analyzer/quotes.go +++ b/server/handlers/sshd_config/analyzer/quotes.go @@ -3,7 +3,6 @@ package analyzer import ( "config-lsp/common" commonparser "config-lsp/common/parser" - "config-lsp/utils" "strings" protocol "github.com/tliron/glsp/protocol_3_16" @@ -26,14 +25,10 @@ func checkIsUsingDoubleQuotes( value commonparser.ParsedString, valueRange common.LocationRange, ) { - quoteRanges := utils.GetQuoteRanges(value.Raw) - singleQuotePosition := strings.Index(value.Raw, "'") - - // Single quote - if singleQuotePosition != -1 && !quoteRanges.IsIndexInsideQuotes(singleQuotePosition) { + if strings.HasPrefix(value.Raw, "'") && strings.HasSuffix(value.Raw, "'") { ctx.diagnostics = append(ctx.diagnostics, protocol.Diagnostic{ Range: valueRange.ToLSPRange(), - Message: "sshd_config does not support single quotes. Use double quotes (\") instead.", + Message: "ssh_config does not support single quotes. Use double quotes (\") instead.", Severity: &common.SeverityError, }) } diff --git a/server/utils/quotes.go b/server/utils/quotes.go index 6e024be..3badaca 100644 --- a/server/utils/quotes.go +++ b/server/utils/quotes.go @@ -55,20 +55,18 @@ func (q quoteRanges) GetInvertedRanges(textLength int) [][2]int { inverted = append(inverted, [2]int{0, firstRange[0]}) } - if len(q) == 1 { - return inverted - } + if len(q) > 1 { + for index, currentRange := range q[:len(q)-1] { + nextRange := q[index+1] - for index, currentRange := range q[:len(q)-1] { - nextRange := q[index+1] - - inverted = append(inverted, [2]int{currentRange[1] + 1, nextRange[0]}) + inverted = append(inverted, [2]int{currentRange[1] + 1, nextRange[0]}) + } } lastRange := q[len(q)-1] if lastRange[1] != (textLength - 1) { - inverted = append(inverted, [2]int{lastRange[1], textLength - 1}) + inverted = append(inverted, [2]int{lastRange[1] + 1, textLength}) } return inverted diff --git a/server/utils/quotes_test.go b/server/utils/quotes_test.go index 764e6f2..86fe71a 100644 --- a/server/utils/quotes_test.go +++ b/server/utils/quotes_test.go @@ -81,3 +81,15 @@ func TestInvertedQuotesFullyQuoted( t.Fatalf("Unexpected inverted quote ranges: %v", inverted) } } + +func TestInvertedQuotesFirstThenRemaining( + t *testing.T, +) { + text := `"hello world" i am here` + quoteRanges := GetQuoteRanges(text) + inverted := quoteRanges.GetInvertedRanges(len(text)) + + if !(len(inverted) == 1 && inverted[0][0] == 13 && inverted[0][1] == 23) { + t.Fatalf("Unexpected inverted quote ranges: %v", inverted) + } +}