fix: avoid exception prone Hashtbl.find

This commit is contained in:
Simon Cruanes 2021-04-08 19:33:31 -04:00
parent b7e89f67e4
commit 0808ecefbe

View file

@ -171,26 +171,38 @@ module Make(IO : IO) = struct
self#on_req_initialize ~notify_back i self#on_req_initialize ~notify_back i
| Lsp.Client_request.TextDocumentHover { textDocument; position } -> | Lsp.Client_request.TextDocumentHover { textDocument; position } ->
let uri = textDocument.uri in let uri = textDocument.uri in
let doc_st = Hashtbl.find docs uri in begin match Hashtbl.find_opt docs uri with
let notify_back = new notify_back ~uri ~notify_back () in | None -> IO.return None
self#on_req_hover ~notify_back ~uri ~pos:position doc_st | Some doc_st ->
let notify_back = new notify_back ~uri ~notify_back () in
self#on_req_hover ~notify_back ~uri ~pos:position doc_st
end
| Lsp.Client_request.TextDocumentCompletion { textDocument; position; context } -> | Lsp.Client_request.TextDocumentCompletion { textDocument; position; context } ->
let uri = textDocument.uri in let uri = textDocument.uri in
let doc_st = Hashtbl.find docs uri in begin match Hashtbl.find_opt docs uri with
let notify_back = new notify_back ~uri ~notify_back () in | None -> IO.return None
self#on_req_completion ~notify_back ~uri | Some doc_st ->
~pos:position ~ctx:context doc_st let notify_back = new notify_back ~uri ~notify_back () in
self#on_req_completion ~notify_back ~uri
~pos:position ~ctx:context doc_st
end
| Lsp.Client_request.TextDocumentDefinition { textDocument; position } -> | Lsp.Client_request.TextDocumentDefinition { textDocument; position } ->
let uri = textDocument.uri in let uri = textDocument.uri in
let notify_back = new notify_back ~uri ~notify_back () in let notify_back = new notify_back ~uri ~notify_back () in
let doc_st = Hashtbl.find docs uri in begin match Hashtbl.find_opt docs uri with
self#on_req_definition ~notify_back | None -> IO.return None
~uri ~pos:position doc_st | Some doc_st ->
self#on_req_definition ~notify_back
~uri ~pos:position doc_st
end
| Lsp.Client_request.TextDocumentCodeLens {textDocument} -> | Lsp.Client_request.TextDocumentCodeLens {textDocument} ->
let uri = textDocument.uri in let uri = textDocument.uri in
let notify_back = new notify_back ~uri ~notify_back () in let notify_back = new notify_back ~uri ~notify_back () in
let doc_st = Hashtbl.find docs uri in begin match Hashtbl.find_opt docs uri with
self#on_req_code_lens ~notify_back ~uri doc_st | None -> IO.return []
| Some doc_st ->
self#on_req_code_lens ~notify_back ~uri doc_st
end
| Lsp.Client_request.TextDocumentCodeLensResolve cl -> | Lsp.Client_request.TextDocumentCodeLensResolve cl ->
let notify_back = new notify_back ~notify_back () in let notify_back = new notify_back ~notify_back () in
self#on_req_code_lens_resolve ~notify_back cl self#on_req_code_lens_resolve ~notify_back cl
@ -270,9 +282,9 @@ module Make(IO : IO) = struct
self#on_notif_doc_did_close ~notify_back doc self#on_notif_doc_did_close ~notify_back doc
| Lsp.Client_notification.TextDocumentDidChange {textDocument=doc; contentChanges=c} -> | Lsp.Client_notification.TextDocumentDidChange {textDocument=doc; contentChanges=c} ->
let notify_back = new notify_back ~uri:doc.uri ~notify_back () in let notify_back = new notify_back ~uri:doc.uri ~notify_back () in
begin match Hashtbl.find docs doc.uri with begin match Hashtbl.find_opt docs doc.uri with
| exception Not_found -> IO.failwith "unknown document" | None -> IO.failwith "unknown document"
| st -> | Some st ->
let old_content = st.content in let old_content = st.content in
let new_doc: Lsp.Text_document.t = let new_doc: Lsp.Text_document.t =
let doc = Lsp.Text_document.make let doc = Lsp.Text_document.make