github.com/tiagovtristao/plz@v13.4.0+incompatible/tools/build_langserver/langserver/text_document.go (about) 1 package langserver 2 3 import ( 4 "context" 5 "encoding/json" 6 "github.com/thought-machine/please/tools/build_langserver/lsp" 7 8 "github.com/sourcegraph/jsonrpc2" 9 ) 10 11 func (h *LsHandler) handleTDRequests(ctx context.Context, req *jsonrpc2.Request) (result interface{}, err error) { 12 if !isTextDocumentMethod(req) { 13 return nil, nil 14 } 15 16 switch req.Method { 17 case "textDocument/didOpen": 18 var params lsp.DidOpenTextDocumentParams 19 if err := json.Unmarshal(*req.Params, ¶ms); err != nil { 20 return nil, err 21 } 22 23 documentURI, err := getURIAndHandleErrors(params.TextDocument.URI, "textDocument/didOpen") 24 if err != nil { 25 return nil, err 26 } 27 28 h.workspace.Store(documentURI, params.TextDocument.Text, params.TextDocument.Version) 29 h.diagPublisher.queue.Put(taskDef{uri: documentURI, content: params.TextDocument.Text}) 30 31 return nil, nil 32 case "textDocument/didChange": 33 var params lsp.DidChangeTextDocumentParams 34 if err := json.Unmarshal(*req.Params, ¶ms); err != nil { 35 return nil, err 36 } 37 38 documentURI, err := getURIAndHandleErrors(params.TextDocument.URI, "textDocument/didChange") 39 if err != nil { 40 return nil, err 41 } 42 43 if err := h.workspace.TrackEdit(documentURI, params.ContentChanges, params.TextDocument.Version); err != nil { 44 return nil, err 45 } 46 47 task := taskDef{ 48 uri: documentURI, 49 content: JoinLines(h.workspace.documents[documentURI].textInEdit, true), 50 } 51 h.diagPublisher.queue.Put(task) 52 53 return nil, nil 54 case "textDocument/didSave": 55 var params lsp.DidSaveTextDocumentParams 56 if err := json.Unmarshal(*req.Params, ¶ms); err != nil { 57 return nil, err 58 } 59 if params.Text == "" { 60 return nil, nil 61 } 62 63 documentURI, err := getURIAndHandleErrors(params.TextDocument.URI, "textDocument/didSave") 64 if err != nil { 65 return nil, err 66 } 67 return nil, h.workspace.Update(documentURI, params.Text) 68 case "textDocument/didClose": 69 var params lsp.DidCloseTextDocumentParams 70 if err := json.Unmarshal(*req.Params, ¶ms); err != nil { 71 return nil, err 72 } 73 74 documentURI, err := getURIAndHandleErrors(params.TextDocument.URI, "textDocument/didClose") 75 if err != nil { 76 return nil, err 77 } 78 79 if err := h.workspace.Close(documentURI); err != nil { 80 return nil, err 81 } 82 83 return nil, nil 84 case "textDocument/willSave": 85 var params lsp.WillSaveTextDocumentParams 86 if err := json.Unmarshal(*req.Params, ¶ms); err != nil { 87 return nil, err 88 } 89 // no-op 90 return nil, nil 91 default: 92 log.Error("unexpected file system request method: %s", req.Method) 93 return nil, nil 94 } 95 } 96 97 func isTextDocumentMethod(req *jsonrpc2.Request) bool { 98 return req.Method == "textDocument/didOpen" || 99 req.Method == "textDocument/didChange" || 100 req.Method == "textDocument/didClose" || 101 req.Method == "textDocument/didSave" || 102 req.Method == "textDocument/willSave" 103 }