mirror of
https://github.com/Myzel394/config-lsp.git
synced 2025-06-18 23:15:26 +02:00
fix(ssh_config): Fix formatter; Fetch options per line now
This commit is contained in:
parent
a0c0ccce25
commit
2ea2c1eea8
@ -229,3 +229,15 @@ func (c SSHConfig) GetAllOptions() []AllOptionInfo {
|
|||||||
|
|
||||||
return options
|
return options
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c SSHConfig) GetOptionsInRange(startLine uint32, endLine uint32) []AllOptionInfo {
|
||||||
|
options := make([]AllOptionInfo, 0, 50)
|
||||||
|
|
||||||
|
for _, info := range c.GetAllOptions() {
|
||||||
|
if info.Option.LocationRange.Start.Line >= startLine && info.Option.LocationRange.End.Line <= endLine {
|
||||||
|
options = append(options, info)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return options
|
||||||
|
}
|
||||||
|
@ -2,11 +2,14 @@ package handlers
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
sshconfig "config-lsp/handlers/ssh_config"
|
sshconfig "config-lsp/handlers/ssh_config"
|
||||||
"config-lsp/handlers/ssh_config/ast"
|
"config-lsp/handlers/ssh_config/fields"
|
||||||
|
|
||||||
protocol "github.com/tliron/glsp/protocol_3_16"
|
protocol "github.com/tliron/glsp/protocol_3_16"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var hostOption = fields.CreateNormalizedName("Host")
|
||||||
|
var matchOption = fields.CreateNormalizedName("Match")
|
||||||
|
|
||||||
func FormatDocument(
|
func FormatDocument(
|
||||||
d *sshconfig.SSHDocument,
|
d *sshconfig.SSHDocument,
|
||||||
textRange protocol.Range,
|
textRange protocol.Range,
|
||||||
@ -14,33 +17,45 @@ func FormatDocument(
|
|||||||
) ([]protocol.TextEdit, error) {
|
) ([]protocol.TextEdit, error) {
|
||||||
edits := make([]protocol.TextEdit, 0)
|
edits := make([]protocol.TextEdit, 0)
|
||||||
|
|
||||||
it := d.Config.Options.Iterator()
|
entries := d.Config.GetOptionsInRange(textRange.Start.Line, textRange.End.Line)
|
||||||
for it.Next() {
|
|
||||||
line := it.Key().(uint32)
|
|
||||||
entry := it.Value().(ast.SSHEntry)
|
|
||||||
|
|
||||||
if !(line >= textRange.Start.Line && line <= textRange.End.Line) {
|
for _, info := range entries {
|
||||||
|
option := info.Option
|
||||||
|
|
||||||
|
if option.Key == nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
switch entry.GetType() {
|
edits = append(edits, formatOption(option, info.Block, options)...)
|
||||||
case ast.SSHTypeOption:
|
|
||||||
option := entry.(*ast.SSHOption)
|
|
||||||
edits = append(edits, formatSSHOption(
|
|
||||||
option,
|
|
||||||
options,
|
|
||||||
optionTemplate,
|
|
||||||
)...)
|
|
||||||
case ast.SSHTypeMatch:
|
|
||||||
matchBlock := entry.(*ast.SSHMatchBlock)
|
|
||||||
|
|
||||||
edits = formatSSHMatchBlock(textRange, matchBlock, options)
|
|
||||||
case ast.SSHTypeHost:
|
|
||||||
hostBlock := entry.(*ast.SSHHostBlock)
|
|
||||||
|
|
||||||
edits = formatSSHHostBlock(textRange, hostBlock, options)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// it := d.Config.Options.Iterator()
|
||||||
|
// for it.Next() {
|
||||||
|
// line := it.Key().(uint32)
|
||||||
|
// entry := it.Value().(ast.SSHEntry)
|
||||||
|
//
|
||||||
|
// if !(line >= textRange.Start.Line && line <= textRange.End.Line) {
|
||||||
|
// continue
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// switch entry.GetType() {
|
||||||
|
// case ast.SSHTypeOption:
|
||||||
|
// option := entry.(*ast.SSHOption)
|
||||||
|
// edits = append(edits, formatSSHOption(
|
||||||
|
// option,
|
||||||
|
// options,
|
||||||
|
// optionTemplate,
|
||||||
|
// )...)
|
||||||
|
// case ast.SSHTypeMatch:
|
||||||
|
// matchBlock := entry.(*ast.SSHMatchBlock)
|
||||||
|
//
|
||||||
|
// edits = formatSSHMatchBlock(textRange, matchBlock, options)
|
||||||
|
// case ast.SSHTypeHost:
|
||||||
|
// hostBlock := entry.(*ast.SSHHostBlock)
|
||||||
|
//
|
||||||
|
// edits = formatSSHHostBlock(textRange, hostBlock, options)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
return edits, nil
|
return edits, nil
|
||||||
}
|
}
|
||||||
|
@ -16,12 +16,82 @@ import (
|
|||||||
var optionTemplate = formatting.FormatTemplate(
|
var optionTemplate = formatting.FormatTemplate(
|
||||||
"%s /!'%s/!'",
|
"%s /!'%s/!'",
|
||||||
)
|
)
|
||||||
|
var blockOptionTemplate = formatting.FormatTemplate(
|
||||||
|
" %s /!'%s/!'",
|
||||||
|
)
|
||||||
var matchTemplate = formatting.FormatTemplate(
|
var matchTemplate = formatting.FormatTemplate(
|
||||||
"%s %s",
|
"%s %s",
|
||||||
)
|
)
|
||||||
var matchOptionTemplate = formatting.FormatTemplate(
|
|
||||||
" %s /!'%s/!'",
|
func formatOption(
|
||||||
)
|
option *ast.SSHOption,
|
||||||
|
block ast.SSHBlock,
|
||||||
|
options protocol.FormattingOptions,
|
||||||
|
) []protocol.TextEdit {
|
||||||
|
if option.Key == nil || option.OptionValue == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
edits := make([]protocol.TextEdit, 0)
|
||||||
|
|
||||||
|
if option.Key.Key == hostOption {
|
||||||
|
edits = append(edits, formatHostBlock(block.(*ast.SSHHostBlock), options)...)
|
||||||
|
} else if option.Key.Key == matchOption {
|
||||||
|
edits = append(edits, formatMatchBlock(block.(*ast.SSHMatchBlock), options)...)
|
||||||
|
} else {
|
||||||
|
var template formatting.FormatTemplate
|
||||||
|
|
||||||
|
if block == nil {
|
||||||
|
template = optionTemplate
|
||||||
|
} else if block.GetBlockType() == ast.SSHBlockTypeMatch {
|
||||||
|
template = blockOptionTemplate
|
||||||
|
} else if block.GetBlockType() == ast.SSHBlockTypeHost {
|
||||||
|
template = blockOptionTemplate
|
||||||
|
}
|
||||||
|
|
||||||
|
edits = append(edits, formatSSHOption(option, options, template)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
return edits
|
||||||
|
}
|
||||||
|
|
||||||
|
func formatHostBlock(
|
||||||
|
hostBlock *ast.SSHHostBlock,
|
||||||
|
options protocol.FormattingOptions,
|
||||||
|
) []protocol.TextEdit {
|
||||||
|
edits := make([]protocol.TextEdit, 0)
|
||||||
|
|
||||||
|
key := fields.FieldsNameFormattedMap[hostBlock.GetEntryOption().Key.Key]
|
||||||
|
edits = append(edits, protocol.TextEdit{
|
||||||
|
Range: hostBlock.GetEntryOption().ToLSPRange(),
|
||||||
|
NewText: matchTemplate.Format(
|
||||||
|
options,
|
||||||
|
key,
|
||||||
|
formatHostToString(hostBlock.HostValue),
|
||||||
|
),
|
||||||
|
})
|
||||||
|
|
||||||
|
return edits
|
||||||
|
}
|
||||||
|
|
||||||
|
func formatMatchBlock(
|
||||||
|
matchBlock *ast.SSHMatchBlock,
|
||||||
|
options protocol.FormattingOptions,
|
||||||
|
) []protocol.TextEdit {
|
||||||
|
edits := make([]protocol.TextEdit, 0)
|
||||||
|
|
||||||
|
key := fields.FieldsNameFormattedMap[matchBlock.GetEntryOption().Key.Key]
|
||||||
|
edits = append(edits, protocol.TextEdit{
|
||||||
|
Range: matchBlock.GetEntryOption().ToLSPRange(),
|
||||||
|
NewText: matchTemplate.Format(
|
||||||
|
options,
|
||||||
|
key,
|
||||||
|
formatMatchToString(matchBlock.MatchValue),
|
||||||
|
),
|
||||||
|
})
|
||||||
|
|
||||||
|
return edits
|
||||||
|
}
|
||||||
|
|
||||||
func formatSSHOption(
|
func formatSSHOption(
|
||||||
option *ast.SSHOption,
|
option *ast.SSHOption,
|
||||||
@ -52,41 +122,6 @@ func formatSSHOption(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func formatSSHMatchBlock(
|
|
||||||
textRange protocol.Range,
|
|
||||||
matchBlock *ast.SSHMatchBlock,
|
|
||||||
options protocol.FormattingOptions,
|
|
||||||
) []protocol.TextEdit {
|
|
||||||
edits := make([]protocol.TextEdit, 0)
|
|
||||||
|
|
||||||
key := fields.FieldsNameFormattedMap[matchBlock.GetEntryOption().Key.Key]
|
|
||||||
edits = append(edits, protocol.TextEdit{
|
|
||||||
Range: matchBlock.GetEntryOption().ToLSPRange(),
|
|
||||||
NewText: matchTemplate.Format(
|
|
||||||
options,
|
|
||||||
key,
|
|
||||||
formatMatchToString(matchBlock.MatchValue),
|
|
||||||
),
|
|
||||||
})
|
|
||||||
|
|
||||||
it := matchBlock.GetOptions().Iterator()
|
|
||||||
for it.Next() {
|
|
||||||
option := it.Value().(*ast.SSHOption)
|
|
||||||
|
|
||||||
if !(option.Start.Line >= textRange.Start.Line && option.End.Line <= textRange.End.Line) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
edits = append(edits, formatSSHOption(
|
|
||||||
option,
|
|
||||||
options,
|
|
||||||
matchOptionTemplate,
|
|
||||||
)...)
|
|
||||||
}
|
|
||||||
|
|
||||||
return edits
|
|
||||||
}
|
|
||||||
|
|
||||||
func formatMatchToString(
|
func formatMatchToString(
|
||||||
match *matchparser.Match,
|
match *matchparser.Match,
|
||||||
) string {
|
) string {
|
||||||
@ -112,41 +147,6 @@ func formatMatchToString(
|
|||||||
return strings.Join(entriesAsStrings, " ")
|
return strings.Join(entriesAsStrings, " ")
|
||||||
}
|
}
|
||||||
|
|
||||||
func formatSSHHostBlock(
|
|
||||||
textRange protocol.Range,
|
|
||||||
hostBlock *ast.SSHHostBlock,
|
|
||||||
options protocol.FormattingOptions,
|
|
||||||
) []protocol.TextEdit {
|
|
||||||
edits := make([]protocol.TextEdit, 0)
|
|
||||||
|
|
||||||
key := fields.FieldsNameFormattedMap[hostBlock.GetEntryOption().Key.Key]
|
|
||||||
edits = append(edits, protocol.TextEdit{
|
|
||||||
Range: hostBlock.GetEntryOption().ToLSPRange(),
|
|
||||||
NewText: matchTemplate.Format(
|
|
||||||
options,
|
|
||||||
key,
|
|
||||||
formatHostToString(hostBlock.HostValue),
|
|
||||||
),
|
|
||||||
})
|
|
||||||
|
|
||||||
it := hostBlock.GetOptions().Iterator()
|
|
||||||
for it.Next() {
|
|
||||||
option := it.Value().(*ast.SSHOption)
|
|
||||||
|
|
||||||
if !(option.Start.Line >= textRange.Start.Line && option.End.Line <= textRange.End.Line) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
edits = append(edits, formatSSHOption(
|
|
||||||
option,
|
|
||||||
options,
|
|
||||||
matchOptionTemplate,
|
|
||||||
)...)
|
|
||||||
}
|
|
||||||
|
|
||||||
return edits
|
|
||||||
}
|
|
||||||
|
|
||||||
func formatHostToString(
|
func formatHostToString(
|
||||||
host *hostparser.Host,
|
host *hostparser.Host,
|
||||||
) string {
|
) string {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user