| // Copyright 2019 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package parse | |
| import ( | |
| "log" | |
| p "golang.org/x/tools/internal/lsp/protocol" | |
| ) | |
| // Requests and notifications are fixed types | |
| // Responses may be one of several types | |
| // Requests returns a pointer to a type suitable for Unmarshal | |
| func Requests(m string) interface{} { | |
| // these are in the documentation's order | |
| switch m { | |
| case "initialize": | |
| return new(p.InitializeParams) | |
| case "shutdown": | |
| return new(struct{}) | |
| case "window/showMessgeRequest": | |
| return new(p.ShowMessageRequestParams) | |
| case "client/registerCapability": | |
| return new(p.RegistrationParams) | |
| case "client/unregisterCapability": | |
| return new(p.UnregistrationParams) | |
| case "workspace/workspaceFolders": | |
| return nil | |
| case "workspace/configuration": | |
| return new(p.ConfigurationParams) | |
| case "workspace/symbol": | |
| return new(p.WorkspaceSymbolParams) | |
| case "workspace/executeCommand": | |
| return new(p.ExecuteCommandParams) | |
| case "workspace/applyEdit": | |
| return new(p.ApplyWorkspaceEditParams) | |
| case "textDocument/willSaveWaitUntil": | |
| return new(p.WillSaveTextDocumentParams) | |
| case "textDocument/completion": | |
| return new(p.CompletionParams) | |
| case "completionItem/resolve": | |
| return new(p.CompletionItem) | |
| case "textDocument/hover": | |
| return new(p.TextDocumentPositionParams) | |
| case "textDocument/signatureHelp": | |
| return new(p.TextDocumentPositionParams) | |
| case "textDocument/declaration": | |
| return new(p.TextDocumentPositionParams) | |
| case "textDocument/definition": | |
| return new(p.TextDocumentPositionParams) | |
| case "textDocument/typeDefinition": | |
| return new(p.TextDocumentPositionParams) | |
| case "textDocument/implementation": | |
| return new(p.TextDocumentPositionParams) | |
| case "textDocument/references": | |
| return new(p.ReferenceParams) | |
| case "textDocument/documentHighlight": | |
| return new(p.TextDocumentPositionParams) | |
| case "textDocument/documentSymbol": | |
| return new(p.DocumentSymbolParams) | |
| case "textDocument/codeAction": | |
| return new(p.CodeActionParams) | |
| case "textDocument/codeLens": | |
| return new(p.CodeLensParams) | |
| case "codeLens/resolve": | |
| return new(p.CodeLens) | |
| case "textDocument/documentLink": | |
| return new(p.DocumentLinkParams) | |
| case "documentLink/resolve": | |
| return new(p.DocumentLink) | |
| case "textDocument/documentColor": | |
| return new(p.DocumentColorParams) | |
| case "textDocument/colorPressentation": | |
| return new(p.ColorPresentationParams) | |
| case "textDocument/formatting": | |
| return new(p.DocumentFormattingParams) | |
| case "textDocument/rangeFormatting": | |
| return new(p.DocumentRangeFormattingParams) | |
| case "textDocument/typeFormatting": | |
| return new(p.DocumentOnTypeFormattingParams) | |
| case "textDocument/rename": | |
| return new(p.RenameParams) | |
| case "textDocument/prepareRename": | |
| return new(p.TextDocumentPositionParams) | |
| case "textDocument/foldingRange": | |
| return new(p.FoldingRangeParams) | |
| case "textDocument/incomingCalls": | |
| return new(p.CallHierarchyIncomingCallsParams) | |
| case "textDocument/outgoingCalls": | |
| return new(p.CallHierarchyOutgoingCallsParams) | |
| } | |
| log.Fatalf("request(%s) undefined", m) | |
| return "" | |
| } | |
| // Notifs returns a pointer to a type suitable for Unmarshal | |
| func Notifs(m string) interface{} { | |
| switch m { | |
| case "$/cancelRequest": | |
| return new(p.CancelParams) | |
| case "$/setTraceNotification": | |
| return new(struct{ Value string }) | |
| case "client/registerCapability": // why is this a notification? (serer->client rpc) | |
| return new(p.RegistrationParams) | |
| case "initialized": | |
| return new(p.InitializedParams) | |
| case "exit": | |
| return nil | |
| case "window/showMessage": | |
| return new(p.ShowMessageParams) | |
| case "window/logMessage": | |
| return new(p.LogMessageParams) | |
| case "telemetry/event": | |
| return new(interface{}) // any | |
| case "workspace/didChangeWorkspaceFolders": | |
| return new(p.DidChangeWorkspaceFoldersParams) | |
| case "workspace/didChangeConfiguration": | |
| return new(p.DidChangeConfigurationParams) | |
| case "workspace/didChangeWatchedFiles": | |
| return new(p.DidChangeWatchedFilesParams) | |
| case "textDocument/didOpen": | |
| return new(p.DidOpenTextDocumentParams) | |
| case "textDocument/didChange": | |
| return new(p.DidChangeTextDocumentParams) | |
| case "textDocument/willSave": | |
| return new(p.WillSaveTextDocumentParams) | |
| case "textDocument/didSave": | |
| return new(p.DidSaveTextDocumentParams) | |
| case "textDocument/didClose": | |
| return new(p.DidCloseTextDocumentParams) | |
| case "textDocument/willClose": | |
| return new(p.DidCloseTextDocumentParams) | |
| case "textDocument/publishDiagnostics": | |
| return new(p.PublishDiagnosticsParams) | |
| } | |
| log.Fatalf("notif(%s) undefined", m) | |
| return "" | |
| } | |
| // Responses returns a slice of types, one of which should be | |
| // suitable for Unmarshal | |
| func Responses(m string) []interface{} { | |
| switch m { | |
| case "initialize": | |
| return []interface{}{new(p.InitializeResult)} | |
| case "shutdown": | |
| return []interface{}{nil} | |
| case "window/showMessageRequest": | |
| return []interface{}{new(p.MessageActionItem), nil} | |
| case "client/registerCapability": | |
| return []interface{}{nil} | |
| case "client/unregisterCapability": | |
| return []interface{}{nil} | |
| case "workspace/workspaceFolder": | |
| return []interface{}{new([]p.WorkspaceFolder), nil} | |
| case "workspace/configuration": | |
| return []interface{}{new([]interface{}), new(interface{})} | |
| case "workspace/symbol": | |
| return []interface{}{new([]p.SymbolInformation), nil} | |
| case "workspace/executeCommand": | |
| return []interface{}{new(interface{}), nil} | |
| case "workspace/applyEdit": | |
| return []interface{}{new(p.ApplyWorkspaceEditResponse)} | |
| case "textDocument/willSaveWaitUntil": | |
| return []interface{}{new([]p.TextEdit), nil} | |
| case "textDocument/completion": | |
| return []interface{}{new(p.CompletionList), new([]p.CompletionItem), nil} | |
| case "completionItem/resolve": | |
| return []interface{}{new(p.CompletionItem)} | |
| case "textDocument/hover": | |
| return []interface{}{new(p.Hover), nil} | |
| case "textDocument/signatureHelp": | |
| return []interface{}{new(p.SignatureHelp), nil} | |
| case "textDocument/declaration": | |
| return []interface{}{new(p.Location), new([]p.Location), new([]p.LocationLink), nil} | |
| case "textDocument/definition": | |
| return []interface{}{new([]p.Location), new([]p.Location), new([]p.LocationLink), nil} | |
| case "textDocument/typeDefinition": | |
| return []interface{}{new([]p.Location), new([]p.LocationLink), new(p.Location), nil} | |
| case "textDocument/implementation": | |
| return []interface{}{new(p.Location), new([]p.Location), new([]p.LocationLink), nil} | |
| case "textDocument/references": | |
| return []interface{}{new([]p.Location), nil} | |
| case "textDocument/documentHighlight": | |
| return []interface{}{new([]p.DocumentHighlight), nil} | |
| case "textDocument/documentSymbol": | |
| return []interface{}{new([]p.DocumentSymbol), new([]p.SymbolInformation), nil} | |
| case "textDocument/codeAction": | |
| return []interface{}{new([]p.CodeAction), new(p.Command), nil} | |
| case "textDocument/codeLens": | |
| return []interface{}{new([]p.CodeLens), nil} | |
| case "codelens/resolve": | |
| return []interface{}{new(p.CodeLens)} | |
| case "textDocument/documentLink": | |
| return []interface{}{new([]p.DocumentLink), nil} | |
| case "documentLink/resolve": | |
| return []interface{}{new(p.DocumentLink)} | |
| case "textDocument/documentColor": | |
| return []interface{}{new([]p.ColorInformation)} | |
| case "textDocument/colorPresentation": | |
| return []interface{}{new([]p.ColorPresentation)} | |
| case "textDocument/formatting": | |
| return []interface{}{new([]p.TextEdit), nil} | |
| case "textDocument/rangeFormatting": | |
| return []interface{}{new([]p.TextEdit), nil} | |
| case "textDocument/onTypeFormatting": | |
| return []interface{}{new([]p.TextEdit), nil} | |
| case "textDocument/rename": | |
| return []interface{}{new(p.WorkspaceEdit), nil} | |
| case "textDocument/prepareRename": | |
| return []interface{}{new(p.Range), nil} | |
| case "textDocument/foldingRange": | |
| return []interface{}{new([]p.FoldingRange), nil} | |
| case "callHierarchy/incomingCalls": | |
| return []interface{}{new([]p.CallHierarchyIncomingCall), nil} | |
| case "callHierarchy/outgoingCalls": | |
| return []interface{}{new([]p.CallHierarchyOutgoingCall), nil} | |
| } | |
| log.Fatalf("responses(%q) undefined", m) | |
| return nil | |
| } | |
| // Msgtype given method names. Note that mSrv|mCl is possible | |
| type Msgtype int | |
| const ( | |
| // Mnot for notifications | |
| Mnot Msgtype = 1 | |
| // Mreq for requests | |
| Mreq Msgtype = 2 | |
| // Msrv for messages from the server | |
| Msrv Msgtype = 4 | |
| // Mcl for messages from the client | |
| Mcl Msgtype = 8 | |
| ) | |
| // IsNotify says if the message is a notification | |
| func IsNotify(msg string) bool { | |
| m, ok := fromMethod[msg] | |
| if !ok { | |
| log.Fatalf("%q", msg) | |
| } | |
| return m&Mnot != 0 | |
| } | |
| // FromServer says if the message is from the server | |
| func FromServer(msg string) bool { | |
| m, ok := fromMethod[msg] | |
| if !ok { | |
| log.Fatalf("%q", msg) | |
| } | |
| return m&Msrv != 0 | |
| } | |
| // FromClient says if the message is from the client | |
| func FromClient(msg string) bool { | |
| m, ok := fromMethod[msg] | |
| if !ok { | |
| log.Fatalf("%q", msg) | |
| } | |
| return m&Mcl != 0 | |
| } | |
| // rpc name to message type | |
| var fromMethod = map[string]Msgtype{ | |
| "$/cancelRequest": Mnot | Msrv | Mcl, | |
| "initialize": Mreq | Msrv, | |
| "initialized": Mnot | Mcl, | |
| "shutdown": Mreq | Mcl, | |
| "exit": Mnot | Mcl, | |
| "window/showMessage": Mreq | Msrv, | |
| "window/logMessage": Mnot | Msrv, | |
| "telemetry'event": Mnot | Msrv, | |
| "client/registerCapability": Mreq | Msrv, | |
| "client/unregisterCapability": Mreq | Msrv, | |
| "workspace/workspaceFolders": Mreq | Msrv, | |
| "workspace/workspaceDidChangeWorkspaceFolders": Mnot | Mcl, | |
| "workspace/didChangeConfiguration": Mnot | Mcl, | |
| "workspace/configuration": Mreq | Msrv, | |
| "workspace/didChangeWatchedFiles": Mnot | Mcl, | |
| "workspace/symbol": Mreq | Mcl, | |
| "workspace/executeCommand": Mreq | Mcl, | |
| "workspace/applyEdit": Mreq | Msrv, | |
| "textDocument/didOpen": Mnot | Mcl, | |
| "textDocument/didChange": Mnot | Mcl, | |
| "textDocument/willSave": Mnot | Mcl, | |
| "textDocument/willSaveWaitUntil": Mreq | Mcl, | |
| "textDocument/didSave": Mnot | Mcl, | |
| "textDocument/didClose": Mnot | Mcl, | |
| "textDocument/publishDiagnostics": Mnot | Msrv, | |
| "textDocument/completion": Mreq | Mcl, | |
| "completionItem/resolve": Mreq | Mcl, | |
| "textDocument/hover": Mreq | Mcl, | |
| "textDocument/signatureHelp": Mreq | Mcl, | |
| "textDocument/declaration": Mreq | Mcl, | |
| "textDocument/definition": Mreq | Mcl, | |
| "textDocument/typeDefinition": Mreq | Mcl, | |
| "textDocument/implementation": Mreq | Mcl, | |
| "textDocument/references": Mreq | Mcl, | |
| "textDocument/documentHighlight": Mreq | Mcl, | |
| "textDocument/documentSymbol": Mreq | Mcl, | |
| "textDocument/codeAction": Mreq | Mcl, | |
| "textDocument/codeLens": Mreq | Mcl, | |
| "codeLens/resolve": Mreq | Mcl, | |
| "textDocument/documentLink": Mreq | Mcl, | |
| "documentLink/resolve": Mreq | Mcl, | |
| "textDocument/documentColor": Mreq | Mcl, | |
| "textDocument/colorPresentation": Mreq | Mcl, | |
| "textDocument/formatting": Mreq | Mcl, | |
| "textDocument/rangeFormatting": Mreq | Mcl, | |
| "textDocument/onTypeFormatting": Mreq | Mcl, | |
| "textDocument/rename": Mreq | Mcl, | |
| "textDocument/prepareRename": Mreq | Mcl, | |
| "textDocument/foldingRange": Mreq | Mcl, | |
| "callHierarchy/incomingCalls": Mreq | Mcl, | |
| "callHierarchy/outgoingCalls": Mreq | Mcl, | |
| } |