| // 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, |
| } |