config-lsp/common/formatting/formatting.go
2024-09-21 09:35:17 +02:00

70 lines
1.2 KiB
Go

package formatting
import (
"fmt"
"strings"
protocol "github.com/tliron/glsp/protocol_3_16"
)
type FormatTemplate string
func (f FormatTemplate) Format(
options protocol.FormattingOptions,
a ...any,
) string {
trimTrailingSpace := true
if shouldTrim, found := options["trimTrailingWhitespace"]; found {
trimTrailingSpace = shouldTrim.(bool)
}
value := ""
value = fmt.Sprintf(
string(
f.replace("/t", getTab(options)),
),
a...,
)
if trimTrailingSpace {
value = strings.TrimRight(value, " ")
value = strings.TrimRight(value, "\t")
}
return value
}
func (f FormatTemplate) replace(format string, replacement string) FormatTemplate {
value := string(f)
currentIndex := 0
for {
position := strings.Index(value[currentIndex:], format)
if position == -1 {
break
}
position = position + currentIndex
currentIndex = position
if position == 0 || value[position-1] != '\\' {
value = value[:position] + replacement + value[position+len(format):]
}
}
return FormatTemplate(value)
}
func getTab(options protocol.FormattingOptions) string {
tabSize := options["tabSize"].(float64)
insertSpace := options["insertSpaces"].(bool)
if insertSpace {
return strings.Repeat(" ", int(tabSize))
} else {
return "\t"
}
}