refactor(server): Improve root handler structure

This commit is contained in:
Myzel394 2024-10-23 14:45:46 +02:00
parent 87c68de419
commit 57ce6c1f4f
No known key found for this signature in database
GPG Key ID: ED20A1D1D423AF3F
18 changed files with 207 additions and 220 deletions

View File

@ -1,6 +1,8 @@
package roothandler package roothandler
import ( import (
"config-lsp/root-handler/lsp"
"config-lsp/root-handler/shared"
"github.com/tliron/glsp" "github.com/tliron/glsp"
protocol "github.com/tliron/glsp/protocol_3_16" protocol "github.com/tliron/glsp/protocol_3_16"
@ -17,24 +19,25 @@ var lspHandler protocol.Handler
// The root handler which handles all the LSP requests and then forwards them to the appropriate handler // The root handler which handles all the LSP requests and then forwards them to the appropriate handler
func SetUpRootHandler() { func SetUpRootHandler() {
rootHandler = NewRootHandler() shared.Handler = shared.NewRootHandler()
lspHandler = protocol.Handler{ lspHandler = protocol.Handler{
Initialize: initialize, Initialize: initialize,
Initialized: initialized, Initialized: initialized,
Shutdown: shutdown, Shutdown: shutdown,
SetTrace: setTrace, SetTrace: setTrace,
TextDocumentDidOpen: TextDocumentDidOpen, TextDocumentDidOpen: lsp.TextDocumentDidOpen,
TextDocumentDidChange: TextDocumentDidChange, TextDocumentDidChange: lsp.TextDocumentDidChange,
TextDocumentCompletion: TextDocumentCompletion, TextDocumentCompletion: lsp.TextDocumentCompletion,
TextDocumentHover: TextDocumentHover, TextDocumentHover: lsp.TextDocumentHover,
TextDocumentDidClose: TextDocumentDidClose, TextDocumentDidClose: lsp.TextDocumentDidClose,
TextDocumentCodeAction: TextDocumentCodeAction, TextDocumentCodeAction: lsp.TextDocumentCodeAction,
TextDocumentDefinition: TextDocumentDefinition, TextDocumentDefinition: lsp.TextDocumentDefinition,
WorkspaceExecuteCommand: WorkspaceExecuteCommand, WorkspaceExecuteCommand: lsp.WorkspaceExecuteCommand,
TextDocumentRename: TextDocumentRename, TextDocumentRename: lsp.TextDocumentRename,
TextDocumentPrepareRename: TextDocumentPrepareRename, TextDocumentPrepareRename: lsp.TextDocumentPrepareRename,
TextDocumentSignatureHelp: TextDocumentSignatureHelp, TextDocumentSignatureHelp: lsp.TextDocumentSignatureHelp,
TextDocumentRangeFormatting: TextDocumentRangeFormattingFunc, TextDocumentRangeFormatting: lsp.TextDocumentRangeFormattingFunc,
} }
server := server.NewServer(&lspHandler, lsName, false) server := server.NewServer(&lspHandler, lsName, false)

View File

@ -1,40 +1,36 @@
package roothandler package lsp
import ( import (
aliases "config-lsp/handlers/aliases/lsp" aliases "config-lsp/handlers/aliases/lsp"
hosts "config-lsp/handlers/hosts/lsp" hosts "config-lsp/handlers/hosts/lsp"
sshconfig "config-lsp/handlers/ssh_config/lsp" sshconfig "config-lsp/handlers/ssh_config/lsp"
wireguard "config-lsp/handlers/wireguard/lsp" wireguard "config-lsp/handlers/wireguard/lsp"
"config-lsp/root-handler/shared"
utils "config-lsp/root-handler/utils"
"github.com/tliron/glsp" "github.com/tliron/glsp"
protocol "github.com/tliron/glsp/protocol_3_16" protocol "github.com/tliron/glsp/protocol_3_16"
) )
func TextDocumentCodeAction(context *glsp.Context, params *protocol.CodeActionParams) (any, error) { func TextDocumentCodeAction(context *glsp.Context, params *protocol.CodeActionParams) (any, error) {
language := rootHandler.GetLanguageForDocument(params.TextDocument.URI) language := shared.Handler.GetLanguageForDocument(params.TextDocument.URI)
if language == nil { if language == nil {
showParseError( return utils.FetchAddLanguageActions(params.TextDocument.URI)
context,
params.TextDocument.URI,
undetectableError,
)
return fetchAddLanguageActions(params.TextDocument.URI)
} }
switch *language { switch *language {
case LanguageFstab: case utils.LanguageFstab:
return nil, nil return nil, nil
case LanguageHosts: case utils.LanguageHosts:
return hosts.TextDocumentCodeAction(context, params) return hosts.TextDocumentCodeAction(context, params)
case LanguageSSHDConfig: case utils.LanguageSSHDConfig:
return nil, nil return nil, nil
case LanguageSSHConfig: case utils.LanguageSSHConfig:
return sshconfig.TextDocumentCodeAction(context, params) return sshconfig.TextDocumentCodeAction(context, params)
case LanguageWireguard: case utils.LanguageWireguard:
return wireguard.TextDocumentCodeAction(context, params) return wireguard.TextDocumentCodeAction(context, params)
case LanguageAliases: case utils.LanguageAliases:
return aliases.TextDocumentCodeAction(context, params) return aliases.TextDocumentCodeAction(context, params)
} }

View File

@ -1,4 +1,4 @@
package roothandler package lsp
import ( import (
aliases "config-lsp/handlers/aliases/lsp" aliases "config-lsp/handlers/aliases/lsp"
@ -7,36 +7,32 @@ import (
sshconfig "config-lsp/handlers/ssh_config/lsp" sshconfig "config-lsp/handlers/ssh_config/lsp"
sshdconfig "config-lsp/handlers/sshd_config/lsp" sshdconfig "config-lsp/handlers/sshd_config/lsp"
wireguard "config-lsp/handlers/wireguard/lsp" wireguard "config-lsp/handlers/wireguard/lsp"
"config-lsp/root-handler/shared"
"config-lsp/root-handler/utils"
"github.com/tliron/glsp" "github.com/tliron/glsp"
protocol "github.com/tliron/glsp/protocol_3_16" protocol "github.com/tliron/glsp/protocol_3_16"
) )
func TextDocumentCompletion(context *glsp.Context, params *protocol.CompletionParams) (any, error) { func TextDocumentCompletion(context *glsp.Context, params *protocol.CompletionParams) (any, error) {
language := rootHandler.GetLanguageForDocument(params.TextDocument.URI) language := shared.Handler.GetLanguageForDocument(params.TextDocument.URI)
if language == nil { if language == nil {
showParseError( return nil, nil
context,
params.TextDocument.URI,
undetectableError,
)
return nil, undetectableError.Err
} }
switch *language { switch *language {
case LanguageFstab: case utils.LanguageFstab:
return fstab.TextDocumentCompletion(context, params) return fstab.TextDocumentCompletion(context, params)
case LanguageSSHDConfig: case utils.LanguageSSHDConfig:
return sshdconfig.TextDocumentCompletion(context, params) return sshdconfig.TextDocumentCompletion(context, params)
case LanguageSSHConfig: case utils.LanguageSSHConfig:
return sshconfig.TextDocumentCompletion(context, params) return sshconfig.TextDocumentCompletion(context, params)
case LanguageWireguard: case utils.LanguageWireguard:
return wireguard.TextDocumentCompletion(context, params) return wireguard.TextDocumentCompletion(context, params)
case LanguageHosts: case utils.LanguageHosts:
return hosts.TextDocumentCompletion(context, params) return hosts.TextDocumentCompletion(context, params)
case LanguageAliases: case utils.LanguageAliases:
return aliases.TextDocumentCompletion(context, params) return aliases.TextDocumentCompletion(context, params)
} }

View File

@ -1,39 +1,35 @@
package roothandler package lsp
import ( import (
aliases "config-lsp/handlers/aliases/lsp" aliases "config-lsp/handlers/aliases/lsp"
sshconfig "config-lsp/handlers/ssh_config/lsp" sshconfig "config-lsp/handlers/ssh_config/lsp"
sshdconfig "config-lsp/handlers/sshd_config/lsp" sshdconfig "config-lsp/handlers/sshd_config/lsp"
"config-lsp/root-handler/shared"
"config-lsp/root-handler/utils"
"github.com/tliron/glsp" "github.com/tliron/glsp"
protocol "github.com/tliron/glsp/protocol_3_16" protocol "github.com/tliron/glsp/protocol_3_16"
) )
func TextDocumentDefinition(context *glsp.Context, params *protocol.DefinitionParams) (any, error) { func TextDocumentDefinition(context *glsp.Context, params *protocol.DefinitionParams) (any, error) {
language := rootHandler.GetLanguageForDocument(params.TextDocument.URI) language := shared.Handler.GetLanguageForDocument(params.TextDocument.URI)
if language == nil { if language == nil {
showParseError( return nil, utils.LanguageUndetectableError{}
context,
params.TextDocument.URI,
undetectableError,
)
return nil, undetectableError.Err
} }
switch *language { switch *language {
case LanguageHosts: case utils.LanguageHosts:
return nil, nil return nil, nil
case LanguageSSHDConfig: case utils.LanguageSSHDConfig:
return sshdconfig.TextDocumentDefinition(context, params) return sshdconfig.TextDocumentDefinition(context, params)
case LanguageSSHConfig: case utils.LanguageSSHConfig:
return sshconfig.TextDocumentDefinition(context, params) return sshconfig.TextDocumentDefinition(context, params)
case LanguageFstab: case utils.LanguageFstab:
return nil, nil return nil, nil
case LanguageWireguard: case utils.LanguageWireguard:
return nil, nil return nil, nil
case LanguageAliases: case utils.LanguageAliases:
return aliases.TextDocumentDefinition(context, params) return aliases.TextDocumentDefinition(context, params)
} }

View File

@ -1,4 +1,4 @@
package roothandler package lsp
import ( import (
aliases "config-lsp/handlers/aliases/lsp" aliases "config-lsp/handlers/aliases/lsp"
@ -7,13 +7,15 @@ import (
sshconfig "config-lsp/handlers/ssh_config/lsp" sshconfig "config-lsp/handlers/ssh_config/lsp"
sshdconfig "config-lsp/handlers/sshd_config/lsp" sshdconfig "config-lsp/handlers/sshd_config/lsp"
wireguard "config-lsp/handlers/wireguard/lsp" wireguard "config-lsp/handlers/wireguard/lsp"
"config-lsp/root-handler/shared"
"config-lsp/root-handler/utils"
"github.com/tliron/glsp" "github.com/tliron/glsp"
protocol "github.com/tliron/glsp/protocol_3_16" protocol "github.com/tliron/glsp/protocol_3_16"
) )
func TextDocumentDidChange(context *glsp.Context, params *protocol.DidChangeTextDocumentParams) error { func TextDocumentDidChange(context *glsp.Context, params *protocol.DidChangeTextDocumentParams) error {
language := rootHandler.GetLanguageForDocument(params.TextDocument.URI) language := shared.Handler.GetLanguageForDocument(params.TextDocument.URI)
if language == nil { if language == nil {
content := params.ContentChanges[0].(protocol.TextDocumentContentChangeEventWhole).Text content := params.ContentChanges[0].(protocol.TextDocumentContentChangeEventWhole).Text
@ -40,33 +42,33 @@ func TextDocumentDidChange(context *glsp.Context, params *protocol.DidChangeText
} }
switch *language { switch *language {
case LanguageFstab: case utils.LanguageFstab:
return fstab.TextDocumentDidOpen(context, params) return fstab.TextDocumentDidOpen(context, params)
case LanguageSSHDConfig: case utils.LanguageSSHDConfig:
return sshdconfig.TextDocumentDidOpen(context, params) return sshdconfig.TextDocumentDidOpen(context, params)
case LanguageSSHConfig: case utils.LanguageSSHConfig:
return sshconfig.TextDocumentDidOpen(context, params) return sshconfig.TextDocumentDidOpen(context, params)
case LanguageWireguard: case utils.LanguageWireguard:
return wireguard.TextDocumentDidOpen(context, params) return wireguard.TextDocumentDidOpen(context, params)
case LanguageHosts: case utils.LanguageHosts:
return hosts.TextDocumentDidOpen(context, params) return hosts.TextDocumentDidOpen(context, params)
case LanguageAliases: case utils.LanguageAliases:
return aliases.TextDocumentDidOpen(context, params) return aliases.TextDocumentDidOpen(context, params)
} }
} }
switch *language { switch *language {
case LanguageFstab: case utils.LanguageFstab:
return fstab.TextDocumentDidChange(context, params) return fstab.TextDocumentDidChange(context, params)
case LanguageSSHDConfig: case utils.LanguageSSHDConfig:
return sshdconfig.TextDocumentDidChange(context, params) return sshdconfig.TextDocumentDidChange(context, params)
case LanguageSSHConfig: case utils.LanguageSSHConfig:
return sshconfig.TextDocumentDidChange(context, params) return sshconfig.TextDocumentDidChange(context, params)
case LanguageWireguard: case utils.LanguageWireguard:
return wireguard.TextDocumentDidChange(context, params) return wireguard.TextDocumentDidChange(context, params)
case LanguageHosts: case utils.LanguageHosts:
return hosts.TextDocumentDidChange(context, params) return hosts.TextDocumentDidChange(context, params)
case LanguageAliases: case utils.LanguageAliases:
return aliases.TextDocumentDidChange(context, params) return aliases.TextDocumentDidChange(context, params)
} }

View File

@ -1,4 +1,4 @@
package roothandler package lsp
import ( import (
aliases "config-lsp/handlers/aliases/lsp" aliases "config-lsp/handlers/aliases/lsp"
@ -7,39 +7,35 @@ import (
sshconfig "config-lsp/handlers/ssh_config/lsp" sshconfig "config-lsp/handlers/ssh_config/lsp"
sshdconfig "config-lsp/handlers/sshd_config/lsp" sshdconfig "config-lsp/handlers/sshd_config/lsp"
wireguard "config-lsp/handlers/wireguard/lsp" wireguard "config-lsp/handlers/wireguard/lsp"
"config-lsp/root-handler/shared"
"config-lsp/root-handler/utils"
"github.com/tliron/glsp" "github.com/tliron/glsp"
protocol "github.com/tliron/glsp/protocol_3_16" protocol "github.com/tliron/glsp/protocol_3_16"
) )
func TextDocumentDidClose(context *glsp.Context, params *protocol.DidCloseTextDocumentParams) error { func TextDocumentDidClose(context *glsp.Context, params *protocol.DidCloseTextDocumentParams) error {
language := rootHandler.GetLanguageForDocument(params.TextDocument.URI) language := shared.Handler.GetLanguageForDocument(params.TextDocument.URI)
if language == nil { if language == nil {
showParseError( return nil
context,
params.TextDocument.URI,
undetectableError,
)
return undetectableError.Err
} }
delete(openedFiles, params.TextDocument.URI) delete(shared.OpenedFiles, params.TextDocument.URI)
rootHandler.RemoveDocument(params.TextDocument.URI) shared.Handler.RemoveDocument(params.TextDocument.URI)
switch *language { switch *language {
case LanguageSSHDConfig: case utils.LanguageSSHDConfig:
return sshdconfig.TextDocumentDidClose(context, params) return sshdconfig.TextDocumentDidClose(context, params)
case LanguageSSHConfig: case utils.LanguageSSHConfig:
return sshconfig.TextDocumentDidClose(context, params) return sshconfig.TextDocumentDidClose(context, params)
case LanguageFstab: case utils.LanguageFstab:
return fstab.TextDocumentDidClose(context, params) return fstab.TextDocumentDidClose(context, params)
case LanguageWireguard: case utils.LanguageWireguard:
return wireguard.TextDocumentDidClose(context, params) return wireguard.TextDocumentDidClose(context, params)
case LanguageHosts: case utils.LanguageHosts:
return hosts.TextDocumentDidClose(context, params) return hosts.TextDocumentDidClose(context, params)
case LanguageAliases: case utils.LanguageAliases:
return aliases.TextDocumentDidClose(context, params) return aliases.TextDocumentDidClose(context, params)
default: default:
} }

View File

@ -1,7 +1,9 @@
package roothandler package lsp
import ( import (
"config-lsp/common" "config-lsp/common"
"config-lsp/root-handler/shared"
"config-lsp/root-handler/utils"
"fmt" "fmt"
aliases "config-lsp/handlers/aliases/lsp" aliases "config-lsp/handlers/aliases/lsp"
@ -32,60 +34,41 @@ func TextDocumentDidOpen(context *glsp.Context, params *protocol.DidOpenTextDocu
} }
switch *language { switch *language {
case LanguageFstab: case utils.LanguageFstab:
return fstab.TextDocumentDidOpen(context, params) return fstab.TextDocumentDidOpen(context, params)
case LanguageSSHDConfig: case utils.LanguageSSHDConfig:
return sshdconfig.TextDocumentDidOpen(context, params) return sshdconfig.TextDocumentDidOpen(context, params)
case LanguageSSHConfig: case utils.LanguageSSHConfig:
return sshconfig.TextDocumentDidOpen(context, params) return sshconfig.TextDocumentDidOpen(context, params)
case LanguageWireguard: case utils.LanguageWireguard:
return wireguard.TextDocumentDidOpen(context, params) return wireguard.TextDocumentDidOpen(context, params)
case LanguageHosts: case utils.LanguageHosts:
return hosts.TextDocumentDidOpen(context, params) return hosts.TextDocumentDidOpen(context, params)
case LanguageAliases: case utils.LanguageAliases:
return aliases.TextDocumentDidOpen(context, params) return aliases.TextDocumentDidOpen(context, params)
} }
panic(fmt.Sprintf("unexpected roothandler.SupportedLanguage: %#v", language)) panic(fmt.Sprintf("unexpected roothandler.SupportedLanguage: %#v", language))
} }
func showParseError(
context *glsp.Context,
uri protocol.DocumentUri,
err common.ParseError,
) {
context.Notify(
"window/showMessage",
protocol.ShowMessageParams{
Type: protocol.MessageTypeError,
Message: err.Err.Error(),
},
)
}
func initFile( func initFile(
context *glsp.Context, context *glsp.Context,
content string, content string,
uri protocol.DocumentUri, uri protocol.DocumentUri,
advertisedLanguage string, advertisedLanguage string,
) (*SupportedLanguage, error) { ) (*utils.SupportedLanguage, error) {
language, err := DetectLanguage(content, advertisedLanguage, uri) language, err := utils.DetectLanguage(content, advertisedLanguage, uri)
if err != nil { if err != nil {
parseError := err.(common.ParseError) utils.NotifyLanguageUndetectable(context, uri)
showParseError(
context,
uri,
parseError,
)
return nil, parseError.Err return nil, utils.LanguageUndetectableError{}
} }
openedFiles[uri] = struct{}{} shared.OpenedFiles[uri] = struct{}{}
// Everything okay, now we can handle the file // Everything okay, now we can handle the file
rootHandler.AddDocument(uri, language) shared.Handler.AddDocument(uri, language)
return &language, nil return &language, nil
} }

View File

@ -1,4 +1,4 @@
package roothandler package lsp
import ( import (
aliases "config-lsp/handlers/aliases/lsp" aliases "config-lsp/handlers/aliases/lsp"
@ -7,36 +7,32 @@ import (
sshconfig "config-lsp/handlers/ssh_config/lsp" sshconfig "config-lsp/handlers/ssh_config/lsp"
sshdconfig "config-lsp/handlers/sshd_config/lsp" sshdconfig "config-lsp/handlers/sshd_config/lsp"
wireguard "config-lsp/handlers/wireguard/lsp" wireguard "config-lsp/handlers/wireguard/lsp"
"config-lsp/root-handler/shared"
"config-lsp/root-handler/utils"
"github.com/tliron/glsp" "github.com/tliron/glsp"
protocol "github.com/tliron/glsp/protocol_3_16" protocol "github.com/tliron/glsp/protocol_3_16"
) )
func TextDocumentHover(context *glsp.Context, params *protocol.HoverParams) (*protocol.Hover, error) { func TextDocumentHover(context *glsp.Context, params *protocol.HoverParams) (*protocol.Hover, error) {
language := rootHandler.GetLanguageForDocument(params.TextDocument.URI) language := shared.Handler.GetLanguageForDocument(params.TextDocument.URI)
if language == nil { if language == nil {
showParseError( return nil, nil
context,
params.TextDocument.URI,
undetectableError,
)
return nil, undetectableError.Err
} }
switch *language { switch *language {
case LanguageHosts: case utils.LanguageHosts:
return hosts.TextDocumentHover(context, params) return hosts.TextDocumentHover(context, params)
case LanguageSSHDConfig: case utils.LanguageSSHDConfig:
return sshdconfig.TextDocumentHover(context, params) return sshdconfig.TextDocumentHover(context, params)
case LanguageSSHConfig: case utils.LanguageSSHConfig:
return sshconfig.TextDocumentHover(context, params) return sshconfig.TextDocumentHover(context, params)
case LanguageFstab: case utils.LanguageFstab:
return fstab.TextDocumentHover(context, params) return fstab.TextDocumentHover(context, params)
case LanguageWireguard: case utils.LanguageWireguard:
return wireguard.TextDocumentHover(context, params) return wireguard.TextDocumentHover(context, params)
case LanguageAliases: case utils.LanguageAliases:
return aliases.TextDocumentHover(context, params) return aliases.TextDocumentHover(context, params)
} }

View File

@ -1,8 +1,10 @@
package roothandler package lsp
import ( import (
aliases "config-lsp/handlers/aliases/lsp" aliases "config-lsp/handlers/aliases/lsp"
sshconfig "config-lsp/handlers/ssh_config/lsp" sshconfig "config-lsp/handlers/ssh_config/lsp"
"config-lsp/root-handler/shared"
"config-lsp/root-handler/utils"
"github.com/tliron/glsp" "github.com/tliron/glsp"
@ -10,30 +12,24 @@ import (
) )
func TextDocumentPrepareRename(context *glsp.Context, params *protocol.PrepareRenameParams) (any, error) { func TextDocumentPrepareRename(context *glsp.Context, params *protocol.PrepareRenameParams) (any, error) {
language := rootHandler.GetLanguageForDocument(params.TextDocument.URI) language := shared.Handler.GetLanguageForDocument(params.TextDocument.URI)
if language == nil { if language == nil {
showParseError( return nil, utils.LanguageUndetectableError{}
context,
params.TextDocument.URI,
undetectableError,
)
return nil, undetectableError.Err
} }
switch *language { switch *language {
case LanguageHosts: case utils.LanguageHosts:
return nil, nil return nil, nil
case LanguageSSHDConfig: case utils.LanguageSSHDConfig:
return nil, nil return nil, nil
case LanguageSSHConfig: case utils.LanguageSSHConfig:
return sshconfig.TextDocumentPrepareRename(context, params) return sshconfig.TextDocumentPrepareRename(context, params)
case LanguageFstab: case utils.LanguageFstab:
return nil, nil return nil, nil
case LanguageWireguard: case utils.LanguageWireguard:
return nil, nil return nil, nil
case LanguageAliases: case utils.LanguageAliases:
return aliases.TextDocumentPrepareRename(context, params) return aliases.TextDocumentPrepareRename(context, params)
} }

View File

@ -1,8 +1,10 @@
package roothandler package lsp
import ( import (
sshconfig "config-lsp/handlers/ssh_config/lsp" sshconfig "config-lsp/handlers/ssh_config/lsp"
sshdconfig "config-lsp/handlers/sshd_config/lsp" sshdconfig "config-lsp/handlers/sshd_config/lsp"
"config-lsp/root-handler/shared"
"config-lsp/root-handler/utils"
"github.com/tliron/glsp" "github.com/tliron/glsp"
protocol "github.com/tliron/glsp/protocol_3_16" protocol "github.com/tliron/glsp/protocol_3_16"
@ -12,30 +14,24 @@ func TextDocumentRangeFormattingFunc(
context *glsp.Context, context *glsp.Context,
params *protocol.DocumentRangeFormattingParams, params *protocol.DocumentRangeFormattingParams,
) ([]protocol.TextEdit, error) { ) ([]protocol.TextEdit, error) {
language := rootHandler.GetLanguageForDocument(params.TextDocument.URI) language := shared.Handler.GetLanguageForDocument(params.TextDocument.URI)
if language == nil { if language == nil {
showParseError( return nil, utils.LanguageUndetectableError{}
context,
params.TextDocument.URI,
undetectableError,
)
return nil, undetectableError.Err
} }
switch *language { switch *language {
case LanguageHosts: case utils.LanguageHosts:
return nil, nil return nil, nil
case LanguageSSHDConfig: case utils.LanguageSSHDConfig:
return sshdconfig.TextDocumentRangeFormatting(context, params) return sshdconfig.TextDocumentRangeFormatting(context, params)
case LanguageSSHConfig: case utils.LanguageSSHConfig:
return sshconfig.TextDocumentRangeFormatting(context, params) return sshconfig.TextDocumentRangeFormatting(context, params)
case LanguageFstab: case utils.LanguageFstab:
return nil, nil return nil, nil
case LanguageWireguard: case utils.LanguageWireguard:
return nil, nil return nil, nil
case LanguageAliases: case utils.LanguageAliases:
return nil, nil return nil, nil
} }

View File

@ -1,38 +1,34 @@
package roothandler package lsp
import ( import (
aliases "config-lsp/handlers/aliases/lsp" aliases "config-lsp/handlers/aliases/lsp"
sshconfig "config-lsp/handlers/ssh_config/lsp" sshconfig "config-lsp/handlers/ssh_config/lsp"
"config-lsp/root-handler/shared"
"config-lsp/root-handler/utils"
"github.com/tliron/glsp" "github.com/tliron/glsp"
protocol "github.com/tliron/glsp/protocol_3_16" protocol "github.com/tliron/glsp/protocol_3_16"
) )
func TextDocumentRename(context *glsp.Context, params *protocol.RenameParams) (*protocol.WorkspaceEdit, error) { func TextDocumentRename(context *glsp.Context, params *protocol.RenameParams) (*protocol.WorkspaceEdit, error) {
language := rootHandler.GetLanguageForDocument(params.TextDocument.URI) language := shared.Handler.GetLanguageForDocument(params.TextDocument.URI)
if language == nil { if language == nil {
showParseError( return nil, utils.LanguageUndetectableError{}
context,
params.TextDocument.URI,
undetectableError,
)
return nil, undetectableError.Err
} }
switch *language { switch *language {
case LanguageHosts: case utils.LanguageHosts:
return nil, nil return nil, nil
case LanguageSSHDConfig: case utils.LanguageSSHDConfig:
return nil, nil return nil, nil
case LanguageSSHConfig: case utils.LanguageSSHConfig:
return sshconfig.TextDocumentRename(context, params) return sshconfig.TextDocumentRename(context, params)
case LanguageFstab: case utils.LanguageFstab:
return nil, nil return nil, nil
case LanguageWireguard: case utils.LanguageWireguard:
return nil, nil return nil, nil
case LanguageAliases: case utils.LanguageAliases:
return aliases.TextDocumentRename(context, params) return aliases.TextDocumentRename(context, params)
} }

View File

@ -1,39 +1,35 @@
package roothandler package lsp
import ( import (
aliases "config-lsp/handlers/aliases/lsp" aliases "config-lsp/handlers/aliases/lsp"
sshconfig "config-lsp/handlers/ssh_config/lsp" sshconfig "config-lsp/handlers/ssh_config/lsp"
sshdconfig "config-lsp/handlers/sshd_config/lsp" sshdconfig "config-lsp/handlers/sshd_config/lsp"
"config-lsp/root-handler/shared"
"config-lsp/root-handler/utils"
"github.com/tliron/glsp" "github.com/tliron/glsp"
protocol "github.com/tliron/glsp/protocol_3_16" protocol "github.com/tliron/glsp/protocol_3_16"
) )
func TextDocumentSignatureHelp(context *glsp.Context, params *protocol.SignatureHelpParams) (*protocol.SignatureHelp, error) { func TextDocumentSignatureHelp(context *glsp.Context, params *protocol.SignatureHelpParams) (*protocol.SignatureHelp, error) {
language := rootHandler.GetLanguageForDocument(params.TextDocument.URI) language := shared.Handler.GetLanguageForDocument(params.TextDocument.URI)
if language == nil { if language == nil {
showParseError( return nil, nil
context,
params.TextDocument.URI,
undetectableError,
)
return nil, undetectableError.Err
} }
switch *language { switch *language {
case LanguageHosts: case utils.LanguageHosts:
return nil, nil return nil, nil
case LanguageSSHDConfig: case utils.LanguageSSHDConfig:
return sshdconfig.TextDocumentSignatureHelp(context, params) return sshdconfig.TextDocumentSignatureHelp(context, params)
case LanguageSSHConfig: case utils.LanguageSSHConfig:
return sshconfig.TextDocumentSignatureHelp(context, params) return sshconfig.TextDocumentSignatureHelp(context, params)
case LanguageFstab: case utils.LanguageFstab:
return nil, nil return nil, nil
case LanguageWireguard: case utils.LanguageWireguard:
return nil, nil return nil, nil
case LanguageAliases: case utils.LanguageAliases:
return aliases.TextDocumentSignatureHelp(context, params) return aliases.TextDocumentSignatureHelp(context, params)
} }

View File

@ -1,4 +1,4 @@
package roothandler package lsp
import ( import (
aliases "config-lsp/handlers/aliases/lsp" aliases "config-lsp/handlers/aliases/lsp"

View File

@ -1,5 +0,0 @@
package roothandler
import protocol "github.com/tliron/glsp/protocol_3_16"
var openedFiles = make(map[protocol.DocumentUri]struct{})

View File

@ -1,26 +1,30 @@
package roothandler package shared
import ( import (
"config-lsp/root-handler/utils"
protocol "github.com/tliron/glsp/protocol_3_16" protocol "github.com/tliron/glsp/protocol_3_16"
) )
var rootHandler RootHandler var Handler RootHandler
var OpenedFiles = make(map[protocol.DocumentUri]struct{})
type RootHandler struct { type RootHandler struct {
languageMap map[protocol.DocumentUri]SupportedLanguage languageMap map[protocol.DocumentUri]utils.SupportedLanguage
} }
func NewRootHandler() RootHandler { func NewRootHandler() RootHandler {
return RootHandler{ return RootHandler{
languageMap: make(map[protocol.DocumentUri]SupportedLanguage), languageMap: make(map[protocol.DocumentUri]utils.SupportedLanguage),
} }
} }
func (h *RootHandler) AddDocument(uri protocol.DocumentUri, language SupportedLanguage) { func (h *RootHandler) AddDocument(uri protocol.DocumentUri, language utils.SupportedLanguage) {
h.languageMap[uri] = language h.languageMap[uri] = language
} }
func (h *RootHandler) GetLanguageForDocument(uri protocol.DocumentUri) *SupportedLanguage { func (h *RootHandler) GetLanguageForDocument(uri protocol.DocumentUri) *utils.SupportedLanguage {
language, found := h.languageMap[uri] language, found := h.languageMap[uri]
if !found { if !found {

View File

@ -1,4 +1,4 @@
package roothandler package utils
import ( import (
"fmt" "fmt"
@ -6,7 +6,7 @@ import (
protocol "github.com/tliron/glsp/protocol_3_16" protocol "github.com/tliron/glsp/protocol_3_16"
) )
func fetchAddLanguageActions(uri protocol.DocumentUri) ([]protocol.CodeAction, error) { func FetchAddLanguageActions(uri protocol.DocumentUri) ([]protocol.CodeAction, error) {
actions := make([]protocol.CodeAction, 0, len(AllSupportedLanguages)) actions := make([]protocol.CodeAction, 0, len(AllSupportedLanguages))
kind := protocol.CodeActionKindQuickFix kind := protocol.CodeActionKindQuickFix

View File

@ -1,4 +1,4 @@
package roothandler package utils
import ( import (
"config-lsp/common" "config-lsp/common"
@ -31,15 +31,6 @@ var AllSupportedLanguages = []string{
string(LanguageAliases), string(LanguageAliases),
} }
type FatalFileNotReadableError struct {
FileURI protocol.DocumentUri
Err error
}
func (e FatalFileNotReadableError) Error() string {
return fmt.Sprintf("Fatal error! config-lsp was unable to read the file (%s); error: %s", e.FileURI, e.Err.Error())
}
type UnsupportedLanguageError struct { type UnsupportedLanguageError struct {
SuggestedLanguage string SuggestedLanguage string
} }

View File

@ -0,0 +1,45 @@
package utils
import (
"github.com/tliron/glsp"
protocol "github.com/tliron/glsp/protocol_3_16"
)
type lspNotification struct {
uri string
}
type lspDetectedLanguage struct {
lspNotification
language string
}
func NotifyLanguageUndetectable(context *glsp.Context, uri protocol.DocumentUri) {
go context.Notify(
"$/config-lsp/languageUndetectable",
lspNotification{
uri: string(uri),
},
)
go context.Notify(
"window/showMessage",
protocol.ShowMessageParams{
Type: protocol.MessageTypeError,
Message: "config-lsp was unable to detect the appropriate language for this file. Please add: '#?lsp.language=<language>'.",
},
)
}
func NotifyDetectedLanguage(context *glsp.Context, uri protocol.DocumentUri, language SupportedLanguage) {
go context.Notify(
"$/config-lsp/detectedLanguage",
lspDetectedLanguage{
lspNotification: lspNotification{
uri: string(uri),
},
language: string(language),
},
)
}