From 4c2422c3da44f8c871611cfb6720f4d3920905ac Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Sat, 31 Aug 2024 21:17:13 +0200 Subject: [PATCH] feat: Add aliases lsp handlers --- handlers/aliases/analyzer/parser.go | 2 +- handlers/aliases/indexes/indexes.go | 2 +- .../aliases/lsp/text-document-code-action.go | 14 +++ .../aliases/lsp/text-document-completion.go | 12 +++ .../aliases/lsp/text-document-did-change.go | 42 +++++++++ .../aliases/lsp/text-document-did-close.go | 13 +++ .../aliases/lsp/text-document-did-open.go | 45 ++++++++++ handlers/aliases/lsp/text-document-hover.go | 86 +++++++++++++++++++ .../aliases/lsp/workspace-execute-command.go | 21 +++++ root-handler/lsp-utils.go | 7 ++ root-handler/text-document-code-action.go | 3 + root-handler/text-document-completion.go | 3 + root-handler/text-document-did-change.go | 5 ++ root-handler/text-document-did-close.go | 3 + root-handler/text-document-did-open.go | 3 + root-handler/text-document-hover.go | 3 + 16 files changed, 262 insertions(+), 2 deletions(-) create mode 100644 handlers/aliases/lsp/text-document-code-action.go create mode 100644 handlers/aliases/lsp/text-document-completion.go create mode 100644 handlers/aliases/lsp/text-document-did-change.go create mode 100644 handlers/aliases/lsp/text-document-did-close.go create mode 100644 handlers/aliases/lsp/text-document-did-open.go create mode 100644 handlers/aliases/lsp/text-document-hover.go create mode 100644 handlers/aliases/lsp/workspace-execute-command.go diff --git a/handlers/aliases/analyzer/parser.go b/handlers/aliases/analyzer/parser.go index e1c5820..1a11fde 100644 --- a/handlers/aliases/analyzer/parser.go +++ b/handlers/aliases/analyzer/parser.go @@ -29,7 +29,7 @@ func analyzeValuesAreValid( if entry.Separator == nil { errors = append(errors, common.LSPError{ Range: entry.Location, - Err: ers.New("The separator is required"), + Err: ers.New("A ':' is required as a separator"), }) continue diff --git a/handlers/aliases/indexes/indexes.go b/handlers/aliases/indexes/indexes.go index 345c212..e87cb47 100644 --- a/handlers/aliases/indexes/indexes.go +++ b/handlers/aliases/indexes/indexes.go @@ -26,7 +26,7 @@ func CreateIndexes(parser ast.AliasesParser) (AliasesIndexes, []common.LSPError) if existingEntry, found := indexes.Keys[normalizedAlias]; found { errors = append(errors, common.LSPError{ - Range: entry.Location, + Range: entry.Key.Location, Err: shared.DuplicateKeyEntry{ AlreadyFoundAt: existingEntry.Location.Start.Line, Key: entry.Key.Value, diff --git a/handlers/aliases/lsp/text-document-code-action.go b/handlers/aliases/lsp/text-document-code-action.go new file mode 100644 index 0000000..37950bd --- /dev/null +++ b/handlers/aliases/lsp/text-document-code-action.go @@ -0,0 +1,14 @@ +package lsp + +import ( + "github.com/tliron/glsp" + protocol "github.com/tliron/glsp/protocol_3_16" +) + +func TextDocumentCodeAction(context *glsp.Context, params *protocol.CodeActionParams) ([]protocol.CodeAction, error) { + // document := hosts.DocumentParserMap[params.TextDocument.URI] + // + // actions := make([]protocol.CodeAction, 0, 1) + + return nil, nil +} diff --git a/handlers/aliases/lsp/text-document-completion.go b/handlers/aliases/lsp/text-document-completion.go new file mode 100644 index 0000000..8c0754b --- /dev/null +++ b/handlers/aliases/lsp/text-document-completion.go @@ -0,0 +1,12 @@ +package lsp + +import ( + "github.com/tliron/glsp" + protocol "github.com/tliron/glsp/protocol_3_16" +) + +func TextDocumentCompletion(context *glsp.Context, params *protocol.CompletionParams) (any, error) { + // p := documentParserMap[params.TextDocument.URI] + + return nil, nil +} diff --git a/handlers/aliases/lsp/text-document-did-change.go b/handlers/aliases/lsp/text-document-did-change.go new file mode 100644 index 0000000..87673d4 --- /dev/null +++ b/handlers/aliases/lsp/text-document-did-change.go @@ -0,0 +1,42 @@ +package lsp + +import ( + "config-lsp/common" + "config-lsp/handlers/aliases" + "config-lsp/handlers/aliases/analyzer" + "config-lsp/utils" + + "github.com/tliron/glsp" + protocol "github.com/tliron/glsp/protocol_3_16" +) + +func TextDocumentDidChange( + context *glsp.Context, + params *protocol.DidChangeTextDocumentParams, +) error { + content := params.ContentChanges[0].(protocol.TextDocumentContentChangeEventWhole).Text + common.ClearDiagnostics(context, params.TextDocument.URI) + + document := aliases.DocumentParserMap[params.TextDocument.URI] + document.Parser.Clear() + + diagnostics := make([]protocol.Diagnostic, 0) + errors := document.Parser.Parse(content) + + if len(errors) > 0 { + diagnostics = append(diagnostics, utils.Map( + errors, + func(err common.LSPError) protocol.Diagnostic { + return err.ToDiagnostic() + }, + )...) + } + + diagnostics = append(diagnostics, analyzer.Analyze(document)...) + + if len(diagnostics) > 0 { + common.SendDiagnostics(context, params.TextDocument.URI, diagnostics) + } + + return nil +} diff --git a/handlers/aliases/lsp/text-document-did-close.go b/handlers/aliases/lsp/text-document-did-close.go new file mode 100644 index 0000000..3283aad --- /dev/null +++ b/handlers/aliases/lsp/text-document-did-close.go @@ -0,0 +1,13 @@ +package lsp + +import ( + "config-lsp/handlers/hosts" + "github.com/tliron/glsp" + protocol "github.com/tliron/glsp/protocol_3_16" +) + +func TextDocumentDidClose(context *glsp.Context, params *protocol.DidCloseTextDocumentParams) error { + delete(hosts.DocumentParserMap, params.TextDocument.URI) + + return nil +} diff --git a/handlers/aliases/lsp/text-document-did-open.go b/handlers/aliases/lsp/text-document-did-open.go new file mode 100644 index 0000000..81f9c1e --- /dev/null +++ b/handlers/aliases/lsp/text-document-did-open.go @@ -0,0 +1,45 @@ +package lsp + +import ( + "config-lsp/common" + "config-lsp/handlers/aliases" + "config-lsp/handlers/aliases/analyzer" + "config-lsp/handlers/aliases/ast" + "config-lsp/utils" + + "github.com/tliron/glsp" + protocol "github.com/tliron/glsp/protocol_3_16" +) + +func TextDocumentDidOpen( + context *glsp.Context, + params *protocol.DidOpenTextDocumentParams, +) error { + common.ClearDiagnostics(context, params.TextDocument.URI) + + parser := ast.NewAliasesParser() + document := aliases.AliasesDocument{ + Parser: &parser, + } + aliases.DocumentParserMap[params.TextDocument.URI] = &document + + errors := parser.Parse(params.TextDocument.Text) + + diagnostics := utils.Map( + errors, + func(err common.LSPError) protocol.Diagnostic { + return err.ToDiagnostic() + }, + ) + + diagnostics = append( + diagnostics, + analyzer.Analyze(&document)..., + ) + + if len(diagnostics) > 0 { + common.SendDiagnostics(context, params.TextDocument.URI, diagnostics) + } + + return nil +} diff --git a/handlers/aliases/lsp/text-document-hover.go b/handlers/aliases/lsp/text-document-hover.go new file mode 100644 index 0000000..0845504 --- /dev/null +++ b/handlers/aliases/lsp/text-document-hover.go @@ -0,0 +1,86 @@ +package lsp + +import ( + "config-lsp/handlers/hosts" + + "github.com/tliron/glsp" + protocol "github.com/tliron/glsp/protocol_3_16" +) + +func TextDocumentHover( + context *glsp.Context, + params *protocol.HoverParams, +) (*protocol.Hover, error) { + document := hosts.DocumentParserMap[params.TextDocument.URI] + + line := params.Position.Line + // character := params.Position.Character + + if _, found := document.Parser.CommentLines[line]; found { + // Comment + return nil, nil + } + + // entry, found := document.Parser.Tree.Entries[line] + // + // if !found { + // // Empty line + // return nil, nil + // } + // + // target := handlers.GetHoverTargetInEntry(*entry, character) + // + // var hostname *ast.HostsHostname + // + // switch *target { + // case handlers.HoverTargetIPAddress: + // relativeCursor := character - entry.IPAddress.Location.Start.Character + // hover := fields.IPAddressField.FetchHoverInfo(entry.IPAddress.Value.String(), relativeCursor) + // + // return &protocol.Hover{ + // Contents: hover, + // }, nil + // case handlers.HoverTargetHostname: + // hostname = entry.Hostname + // case handlers.HoverTargetAlias: + // for _, alias := range entry.Aliases { + // if alias.Location.Start.Character <= character && character <= alias.Location.End.Character { + // hostname = alias + // break + // } + // } + // } + // + // if hostname != nil { + // contents := []string{ + // "## Hostname", + // } + // contents = append( + // contents, + // fields.HostnameField.GetTypeDescription()..., + // ) + // contents = append( + // contents, + // []string{ + // "", + // }..., + // ) + // contents = append( + // contents, + // fields.HostnameField.Documentation, + // ) + // contents = append( + // contents, + // handlers.GetHoverInfoForHostname(*document, *hostname, character)..., + // ) + // + // return &protocol.Hover{ + // Contents: &protocol.MarkupContent{ + // Kind: protocol.MarkupKindMarkdown, + // Value: strings.Join(contents, "\n"), + // }, + // }, nil + // } + + return nil, nil +} diff --git a/handlers/aliases/lsp/workspace-execute-command.go b/handlers/aliases/lsp/workspace-execute-command.go new file mode 100644 index 0000000..41f5298 --- /dev/null +++ b/handlers/aliases/lsp/workspace-execute-command.go @@ -0,0 +1,21 @@ +package lsp + +import ( + "github.com/tliron/glsp" + protocol "github.com/tliron/glsp/protocol_3_16" +) + +func WorkspaceExecuteCommand(context *glsp.Context, params *protocol.ExecuteCommandParams) (*protocol.ApplyWorkspaceEditParams, error) { + // _, command, _ := strings.Cut(params.Command, ".") + // + // switch command { + // case string(handlers.CodeActionInlineAliases): + // args := handlers.CodeActionInlineAliasesArgsFromArguments(params.Arguments[0].(map[string]any)) + // + // document := hosts.DocumentParserMap[args.URI] + // + // return args.RunCommand(*document.Parser) + // } + + return nil, nil +} diff --git a/root-handler/lsp-utils.go b/root-handler/lsp-utils.go index a4337f3..8a5b7c6 100644 --- a/root-handler/lsp-utils.go +++ b/root-handler/lsp-utils.go @@ -17,6 +17,7 @@ const ( LanguageFstab SupportedLanguage = "fstab" LanguageWireguard SupportedLanguage = "languagewireguard" LanguageHosts SupportedLanguage = "hosts" + LanguageAliases SupportedLanguage = "aliases" ) var AllSupportedLanguages = []string{ @@ -24,6 +25,7 @@ var AllSupportedLanguages = []string{ string(LanguageFstab), string(LanguageWireguard), string(LanguageHosts), + string(LanguageAliases), } type FatalFileNotReadableError struct { @@ -64,6 +66,9 @@ var valueToLanguageMap = map[string]SupportedLanguage{ "host": LanguageHosts, "hosts": LanguageHosts, "etc/hosts": LanguageHosts, + + "aliases": LanguageAliases, + "etc/aliases": LanguageAliases, } var typeOverwriteRegex = regexp.MustCompile(`#\?\s*lsp\.language\s*=\s*(\w+)\s*`) @@ -111,6 +116,8 @@ func DetectLanguage( return LanguageFstab, nil case "file:///etc/hosts": return LanguageHosts, nil + case "file:///etc/aliases": + return LanguageAliases, nil } if strings.HasPrefix(uri, "file:///etc/wireguard/") || wireguardPattern.MatchString(uri) { diff --git a/root-handler/text-document-code-action.go b/root-handler/text-document-code-action.go index 6a01a26..a1f0642 100644 --- a/root-handler/text-document-code-action.go +++ b/root-handler/text-document-code-action.go @@ -1,6 +1,7 @@ package roothandler import ( + aliases "config-lsp/handlers/aliases/lsp" hosts "config-lsp/handlers/hosts/lsp" wireguard "config-lsp/handlers/wireguard/lsp" @@ -30,6 +31,8 @@ func TextDocumentCodeAction(context *glsp.Context, params *protocol.CodeActionPa return nil, nil case LanguageWireguard: return wireguard.TextDocumentCodeAction(context, params) + case LanguageAliases: + return aliases.TextDocumentCodeAction(context, params) } panic("root-handler/TextDocumentCompletion: unexpected language" + *language) diff --git a/root-handler/text-document-completion.go b/root-handler/text-document-completion.go index 63eb383..bd37e79 100644 --- a/root-handler/text-document-completion.go +++ b/root-handler/text-document-completion.go @@ -1,6 +1,7 @@ package roothandler import ( + aliases "config-lsp/handlers/aliases/lsp" "config-lsp/handlers/fstab" hosts "config-lsp/handlers/hosts/lsp" wireguard "config-lsp/handlers/wireguard/lsp" @@ -31,6 +32,8 @@ func TextDocumentCompletion(context *glsp.Context, params *protocol.CompletionPa return wireguard.TextDocumentCompletion(context, params) case LanguageHosts: return hosts.TextDocumentCompletion(context, params) + case LanguageAliases: + return aliases.TextDocumentCompletion(context, params) } panic("root-handler/TextDocumentCompletion: unexpected language" + *language) diff --git a/root-handler/text-document-did-change.go b/root-handler/text-document-did-change.go index 841dac3..087abc3 100644 --- a/root-handler/text-document-did-change.go +++ b/root-handler/text-document-did-change.go @@ -1,6 +1,7 @@ package roothandler import ( + aliases "config-lsp/handlers/aliases/lsp" "config-lsp/handlers/fstab" hosts "config-lsp/handlers/hosts/lsp" wireguard "config-lsp/handlers/wireguard/lsp" @@ -45,6 +46,8 @@ func TextDocumentDidChange(context *glsp.Context, params *protocol.DidChangeText return wireguard.TextDocumentDidOpen(context, params) case LanguageHosts: return hosts.TextDocumentDidOpen(context, params) + case LanguageAliases: + return aliases.TextDocumentDidOpen(context, params) } } @@ -57,6 +60,8 @@ func TextDocumentDidChange(context *glsp.Context, params *protocol.DidChangeText return wireguard.TextDocumentDidChange(context, params) case LanguageHosts: return hosts.TextDocumentDidChange(context, params) + case LanguageAliases: + return aliases.TextDocumentDidChange(context, params) } panic("root-handler/TextDocumentDidChange: unexpected language" + *language) diff --git a/root-handler/text-document-did-close.go b/root-handler/text-document-did-close.go index 7185980..1790fca 100644 --- a/root-handler/text-document-did-close.go +++ b/root-handler/text-document-did-close.go @@ -1,6 +1,7 @@ package roothandler import ( + aliases "config-lsp/handlers/aliases/lsp" hosts "config-lsp/handlers/hosts/lsp" wireguard "config-lsp/handlers/wireguard/lsp" @@ -31,6 +32,8 @@ func TextDocumentDidClose(context *glsp.Context, params *protocol.DidCloseTextDo return wireguard.TextDocumentDidClose(context, params) case LanguageHosts: return hosts.TextDocumentDidClose(context, params) + case LanguageAliases: + return aliases.TextDocumentDidClose(context, params) default: } diff --git a/root-handler/text-document-did-open.go b/root-handler/text-document-did-open.go index caaddd7..181afa2 100644 --- a/root-handler/text-document-did-open.go +++ b/root-handler/text-document-did-open.go @@ -2,6 +2,7 @@ package roothandler import ( "config-lsp/common" + aliases "config-lsp/handlers/aliases/lsp" fstab "config-lsp/handlers/fstab" hosts "config-lsp/handlers/hosts/lsp" wireguard "config-lsp/handlers/wireguard/lsp" @@ -36,6 +37,8 @@ func TextDocumentDidOpen(context *glsp.Context, params *protocol.DidOpenTextDocu return wireguard.TextDocumentDidOpen(context, params) case LanguageHosts: return hosts.TextDocumentDidOpen(context, params) + case LanguageAliases: + return aliases.TextDocumentDidOpen(context, params) } panic(fmt.Sprintf("unexpected roothandler.SupportedLanguage: %#v", language)) diff --git a/root-handler/text-document-hover.go b/root-handler/text-document-hover.go index 31c67aa..3e94d15 100644 --- a/root-handler/text-document-hover.go +++ b/root-handler/text-document-hover.go @@ -1,6 +1,7 @@ package roothandler import ( + aliases "config-lsp/handlers/aliases/lsp" "config-lsp/handlers/fstab" hosts "config-lsp/handlers/hosts/lsp" wireguard "config-lsp/handlers/wireguard/lsp" @@ -31,6 +32,8 @@ func TextDocumentHover(context *glsp.Context, params *protocol.HoverParams) (*pr return fstab.TextDocumentHover(context, params) case LanguageWireguard: return wireguard.TextDocumentHover(context, params) + case LanguageAliases: + return aliases.TextDocumentHover(context, params) } panic("root-handler/TextDocumentHover: unexpected language" + *language)