mirror of
https://github.com/Myzel394/config-lsp.git
synced 2025-06-18 15:05:28 +02:00
Merge pull request #31 from Myzel394/fix-quotes
This commit is contained in:
commit
be93c874db
@ -27,15 +27,18 @@ func checkIsUsingDoubleQuotes(
|
|||||||
valueRange common.LocationRange,
|
valueRange common.LocationRange,
|
||||||
) {
|
) {
|
||||||
quoteRanges := utils.GetQuoteRanges(value.Raw)
|
quoteRanges := utils.GetQuoteRanges(value.Raw)
|
||||||
singleQuotePosition := strings.Index(value.Raw, "'")
|
invertedRanges := quoteRanges.GetInvertedRanges(len(value.Raw))
|
||||||
|
|
||||||
// Single quote
|
for _, rang := range invertedRanges {
|
||||||
if singleQuotePosition != -1 && !quoteRanges.IsIndexInsideQuotes(singleQuotePosition) {
|
text := value.Raw[rang[0]:rang[1]]
|
||||||
ctx.diagnostics = append(ctx.diagnostics, protocol.Diagnostic{
|
|
||||||
Range: valueRange.ToLSPRange(),
|
if strings.Contains(text, "'") {
|
||||||
Message: "ssh_config does not support single quotes. Use double quotes (\") instead.",
|
ctx.diagnostics = append(ctx.diagnostics, protocol.Diagnostic{
|
||||||
Severity: &common.SeverityError,
|
Range: valueRange.ToLSPRange(),
|
||||||
})
|
Message: "ssh_config does not support single quotes. Use double quotes (\") instead.",
|
||||||
|
Severity: &common.SeverityError,
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,7 +101,8 @@ func TestValidDependentOptionsExample(
|
|||||||
d := testutils_test.DocumentFromInput(t, `
|
d := testutils_test.DocumentFromInput(t, `
|
||||||
Port 1234
|
Port 1234
|
||||||
CanonicalizeHostname yes
|
CanonicalizeHostname yes
|
||||||
CanonicalDomains example.com
|
CanonicalDomains "example.com"
|
||||||
|
Test "hello world 'test' "
|
||||||
`)
|
`)
|
||||||
ctx := &analyzerContext{
|
ctx := &analyzerContext{
|
||||||
document: d,
|
document: d,
|
||||||
|
@ -3,7 +3,6 @@ package analyzer
|
|||||||
import (
|
import (
|
||||||
"config-lsp/common"
|
"config-lsp/common"
|
||||||
commonparser "config-lsp/common/parser"
|
commonparser "config-lsp/common/parser"
|
||||||
"config-lsp/utils"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
protocol "github.com/tliron/glsp/protocol_3_16"
|
protocol "github.com/tliron/glsp/protocol_3_16"
|
||||||
@ -26,14 +25,10 @@ func checkIsUsingDoubleQuotes(
|
|||||||
value commonparser.ParsedString,
|
value commonparser.ParsedString,
|
||||||
valueRange common.LocationRange,
|
valueRange common.LocationRange,
|
||||||
) {
|
) {
|
||||||
quoteRanges := utils.GetQuoteRanges(value.Raw)
|
if strings.HasPrefix(value.Raw, "'") && strings.HasSuffix(value.Raw, "'") {
|
||||||
singleQuotePosition := strings.Index(value.Raw, "'")
|
|
||||||
|
|
||||||
// Single quote
|
|
||||||
if singleQuotePosition != -1 && !quoteRanges.IsIndexInsideQuotes(singleQuotePosition) {
|
|
||||||
ctx.diagnostics = append(ctx.diagnostics, protocol.Diagnostic{
|
ctx.diagnostics = append(ctx.diagnostics, protocol.Diagnostic{
|
||||||
Range: valueRange.ToLSPRange(),
|
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,
|
Severity: &common.SeverityError,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,45 @@ func (q quoteRanges) GetQuoteForIndex(index int) *quoteRange {
|
|||||||
return &q[index]
|
return &q[index]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (q quoteRanges) GetInvertedRanges(textLength int) [][2]int {
|
||||||
|
if textLength == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(q) == 0 {
|
||||||
|
return [][2]int{
|
||||||
|
{
|
||||||
|
0,
|
||||||
|
textLength - 1,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inverted := make([][2]int, 0, len(q))
|
||||||
|
|
||||||
|
firstRange := q[0]
|
||||||
|
|
||||||
|
if firstRange[0] != 0 {
|
||||||
|
inverted = append(inverted, [2]int{0, firstRange[0]})
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(q) > 1 {
|
||||||
|
for index, currentRange := range q[:len(q)-1] {
|
||||||
|
nextRange := q[index+1]
|
||||||
|
|
||||||
|
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] + 1, textLength})
|
||||||
|
}
|
||||||
|
|
||||||
|
return inverted
|
||||||
|
}
|
||||||
|
|
||||||
func GetQuoteRanges(s string) quoteRanges {
|
func GetQuoteRanges(s string) quoteRanges {
|
||||||
quoteRanges := make(quoteRanges, 0, 2)
|
quoteRanges := make(quoteRanges, 0, 2)
|
||||||
inQuote := false
|
inQuote := false
|
||||||
|
@ -21,3 +21,75 @@ func TestQuotesEscapedQuotes(
|
|||||||
t.Fatalf("Unexpected quote ranges: %v", quoteRanges)
|
t.Fatalf("Unexpected quote ranges: %v", quoteRanges)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestInvertedQuotesSimple(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
|
text := `"hello" "world"`
|
||||||
|
quoteRanges := GetQuoteRanges(text)
|
||||||
|
inverted := quoteRanges.GetInvertedRanges(len(text))
|
||||||
|
|
||||||
|
if !(len(inverted) == 1 && inverted[0][0] == 7 && inverted[0][1] == 8) {
|
||||||
|
t.Fatalf("Unexpected inverted quote ranges: %v", inverted)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestInvertedQuotesImmediatelyFollowing(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
|
text := `"hello""world"`
|
||||||
|
quoteRanges := GetQuoteRanges(text)
|
||||||
|
inverted := quoteRanges.GetInvertedRanges(len(text))
|
||||||
|
|
||||||
|
if !(len(inverted) == 1 && inverted[0][0] == 7 && inverted[0][1] == 7) {
|
||||||
|
t.Fatalf("Unexpected inverted quote ranges: %v", inverted)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestInvertedQuotesEscapedQuotes(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
|
text := `hello \"world\"`
|
||||||
|
quoteRanges := GetQuoteRanges(text)
|
||||||
|
inverted := quoteRanges.GetInvertedRanges(len(text))
|
||||||
|
|
||||||
|
if !(len(inverted) == 1 && inverted[0][0] == 0 && inverted[0][1] == 14) {
|
||||||
|
t.Fatalf("Unexpected inverted quote ranges: %v", inverted)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestInvertedQuotesMultiple(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
|
text := `"hello" "world" "hello"`
|
||||||
|
quoteRanges := GetQuoteRanges(text)
|
||||||
|
inverted := quoteRanges.GetInvertedRanges(len(text))
|
||||||
|
|
||||||
|
if !(len(inverted) == 2 && inverted[0][0] == 7 && inverted[0][1] == 8 && inverted[1][0] == 15 && inverted[1][1] == 16) {
|
||||||
|
t.Fatalf("Unexpected inverted quote ranges: %v", inverted)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestInvertedQuotesFullyQuoted(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
|
text := `"hello world"`
|
||||||
|
quoteRanges := GetQuoteRanges(text)
|
||||||
|
inverted := quoteRanges.GetInvertedRanges(len(text))
|
||||||
|
|
||||||
|
if !(len(inverted) == 0) {
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user