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, &params); 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, &params); 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, &params); 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, &params); 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, &params); 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  }