Skip to content

Commit

Permalink
[PR] Add textDocument/codeLens request and codeLens/resolve
Browse files Browse the repository at this point in the history
Summary:
Adds basic requests to implement #7890
Pull Request resolved: #7891

Reviewed By: gabelevi

Differential Revision: D16223318

Pulled By: mroch

fbshipit-source-id: 529906af5e00e4b4de31aefbd66dd7a20a9c07c7
  • Loading branch information
goodmind authored and facebook-github-bot committed Jul 15, 2019
1 parent de994b6 commit 1d524cc
Show file tree
Hide file tree
Showing 5 changed files with 118 additions and 1 deletion.
35 changes: 35 additions & 0 deletions hack/utils/lsp/lsp.ml
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,21 @@ module TextDocumentItem = struct
}
end

(**
* A code lens represents a command that should be shown along with
* source text, like the number of references, a way to run tests, etc.
*
* A code lens is _unresolved_ when no command is associated to it. For performance
* reasons the creation of a code lens and resolving should be done in two stages.
*)
module CodeLens = struct
type t = {
range: range;
command: Command.t;
data: Hh_json.json option;
}
end

(* A parameter literal used in requests to pass a text document and a position
inside that document. *)
module TextDocumentPositionParams = struct
Expand Down Expand Up @@ -407,6 +422,12 @@ module Rage = struct
}
end

(* Code Lens resolve request, method="codeLens/resolve" *)
module CodeLensResolve = struct
type params = CodeLens.t

and result = CodeLens.t
end

(* Hover request, method="textDocument/hover" *)
module Hover = struct
Expand Down Expand Up @@ -801,6 +822,16 @@ module Rename = struct
}
end

(* Code Lens request, method="textDocument/codeLens" *)
module DocumentCodeLens = struct
type params = codelensParams

and result = CodeLens.t list

and codelensParams = {
textDocument: TextDocumentIdentifier.t;
}
end

(* LogMessage notification, method="window/logMessage" *)
module LogMessage = struct
Expand Down Expand Up @@ -985,6 +1016,7 @@ type lsp_request =
| InitializeRequest of Initialize.params
| RegisterCapabilityRequest of RegisterCapability.params
| ShutdownRequest
| CodeLensResolveRequest of CodeLensResolve.params
| HoverRequest of Hover.params
| DefinitionRequest of Definition.params
| TypeDefinitionRequest of TypeDefinition.params
Expand All @@ -1002,11 +1034,13 @@ type lsp_request =
| ShowStatusRequest of ShowStatus.params
| RageRequest
| RenameRequest of Rename.params
| DocumentCodeLensRequest of DocumentCodeLens.params
| UnknownRequest of string * Hh_json.json option

type lsp_result =
| InitializeResult of Initialize.result
| ShutdownResult
| CodeLensResolveResult of CodeLensResolve.result
| HoverResult of Hover.result
| DefinitionResult of Definition.result
| TypeDefinitionResult of TypeDefinition.result
Expand All @@ -1024,6 +1058,7 @@ type lsp_result =
| ShowStatusResult of ShowStatus.result
| RageResult of Rage.result
| RenameResult of Rename.result
| DocumentCodeLensResult of DocumentCodeLens.result
| ErrorResult of Error.t * string (* the string is a stacktrace *)

type lsp_notification =
Expand Down
27 changes: 27 additions & 0 deletions hack/utils/lsp/lsp.mli
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,14 @@ module TextDocumentItem :
text : string;
}
end
module CodeLens :
sig
type t = {
range : range;
command : Command.t;
data : Hh_json.json option;
}
end
module TextDocumentPositionParams :
sig
type t = {
Expand Down Expand Up @@ -197,6 +205,11 @@ module Rage :
type result = rageItem list
and rageItem = { title : string option; data : string; }
end
module CodeLensResolve :
sig
type params = CodeLens.t
and result = CodeLens.t
end
module Hover :
sig
type params = TextDocumentPositionParams.t
Expand Down Expand Up @@ -483,6 +496,16 @@ module Rename :
newName: string;
}
end
module DocumentCodeLens :
sig
type params = codelensParams

and result = CodeLens.t list

and codelensParams = {
textDocument: TextDocumentIdentifier.t;
}
end
module LogMessage :
sig
type params = logMessageParams
Expand Down Expand Up @@ -587,6 +610,7 @@ type lsp_request =
| InitializeRequest of Initialize.params
| RegisterCapabilityRequest of RegisterCapability.params
| ShutdownRequest
| CodeLensResolveRequest of CodeLensResolve.params
| HoverRequest of Hover.params
| DefinitionRequest of Definition.params
| TypeDefinitionRequest of TypeDefinition.params
Expand All @@ -604,10 +628,12 @@ type lsp_request =
| ShowStatusRequest of ShowStatus.params
| RageRequest
| RenameRequest of Rename.params
| DocumentCodeLensRequest of DocumentCodeLens.params
| UnknownRequest of string * Hh_json.json option
type lsp_result =
| InitializeResult of Initialize.result
| ShutdownResult
| CodeLensResolveResult of CodeLensResolve.result
| HoverResult of Hover.result
| DefinitionResult of Definition.result
| TypeDefinitionResult of TypeDefinition.result
Expand All @@ -625,6 +651,7 @@ type lsp_result =
| ShowStatusResult of ShowStatus.result
| RageResult of Rage.result
| RenameResult of Rename.result
| DocumentCodeLensResult of DocumentCodeLens.result
| ErrorResult of Error.t * string (* the string is a stacktrace *)
type lsp_notification =
| ExitNotification
Expand Down
49 changes: 49 additions & 0 deletions hack/utils/lsp/lsp_fmt.ml
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,22 @@ let print_messageType (type_: MessageType.t) : json =
| InfoMessage -> int_ 3
| LogMessage -> int_ 4

let parse_codeLens (json: json option) : CodeLens.t =
let open CodeLens in
{
range = Jget.obj_exn json "range" |> parse_range_exn;
command = Jget.obj_exn json "command" |> parse_command;
data = Jget.obj_exn json "data";
}

let print_codeLens (codeLens: CodeLens.t) : json =
let open CodeLens in
JSON_Object [
"range", print_range codeLens.range;
"command", print_command codeLens.command;
"data", match codeLens.data with None -> JSON_Null | Some json -> json;
]


(************************************************************************)
(** shutdown request **)
Expand Down Expand Up @@ -346,6 +362,15 @@ let print_signatureHelp (r: SignatureHelp.result) : json =
"activeParameter", Hh_json.int_ r.activeParameter;
]

(************************************************************************)
(** codeLens/resolve Request **)
(************************************************************************)

let parse_codeLensResolve (params: json option) : CodeLensResolve.params =
parse_codeLens params

let print_codeLensResolve (r: CodeLensResolve.result) : json =
print_codeLens r


(************************************************************************)
Expand All @@ -370,7 +395,19 @@ let print_documentRename (r: Rename.result) : json =
"changes", JSON_Object (List.map (SMap.elements r.changes) ~f:print_workspace_edit_changes);
]

(************************************************************************)
(** textDocument/codeLens Request **)
(************************************************************************)

let parse_documentCodeLens (params: json option) : DocumentCodeLens.params =
let open DocumentCodeLens in
{
textDocument = Jget.obj_exn params "textDocument"
|> parse_textDocumentIdentifier;
}

let print_documentCodeLens (r: DocumentCodeLens.result) : json =
JSON_Array (List.map r ~f:print_codeLens)

(************************************************************************)
(** textDocument/publishDiagnostics notification **)
Expand Down Expand Up @@ -1075,6 +1112,7 @@ let request_name_to_string (request: lsp_request) : string =
| InitializeRequest _ -> "initialize"
| RegisterCapabilityRequest _ -> "client/registerCapability"
| ShutdownRequest -> "shutdown"
| CodeLensResolveRequest _ -> "codeLens/resolve"
| HoverRequest _ -> "textDocument/hover"
| CompletionRequest _ -> "textDocument/completion"
| CompletionItemResolveRequest _ -> "completionItem/resolve"
Expand All @@ -1090,6 +1128,7 @@ let request_name_to_string (request: lsp_request) : string =
| DocumentOnTypeFormattingRequest _ -> "textDocument/onTypeFormatting"
| RageRequest -> "telemetry/rage"
| RenameRequest _ -> "textDocument/rename"
| DocumentCodeLensRequest _ -> "textDocument/codeLens"
| UnknownRequest (method_, _params) -> method_

let result_name_to_string (result: lsp_result) : string =
Expand All @@ -1098,6 +1137,7 @@ let result_name_to_string (result: lsp_result) : string =
| ShowStatusResult _ -> "window/showStatus"
| InitializeResult _ -> "initialize"
| ShutdownResult -> "shutdown"
| CodeLensResolveResult _ -> "codeLens/resolve"
| HoverResult _ -> "textDocument/hover"
| CompletionResult _ -> "textDocument/completion"
| CompletionItemResolveResult _ -> "completionItem/resolve"
Expand All @@ -1113,6 +1153,7 @@ let result_name_to_string (result: lsp_result) : string =
| DocumentOnTypeFormattingResult _ -> "textDocument/onTypeFormatting"
| RageResult _ -> "telemetry/rage"
| RenameResult _ -> "textDocument/rename"
| DocumentCodeLensResult _ -> "textDocument/codeLens"
| ErrorResult (e, _stack) -> "ERROR/" ^ (e.Error.message)

let notification_name_to_string (notification: lsp_notification) : string =
Expand Down Expand Up @@ -1157,6 +1198,7 @@ let parse_lsp_request (method_: string) (params: json option) : lsp_request =
match method_ with
| "initialize" -> InitializeRequest (parse_initialize params)
| "shutdown" -> ShutdownRequest
| "codeLens/resolve" -> CodeLensResolveRequest (parse_codeLensResolve params)
| "textDocument/hover" -> HoverRequest (parse_hover params)
| "textDocument/completion" -> CompletionRequest (parse_completion params)
| "textDocument/definition" -> DefinitionRequest (parse_definition params)
Expand All @@ -1171,6 +1213,7 @@ let parse_lsp_request (method_: string) (params: json option) : lsp_request =
DocumentRangeFormattingRequest (parse_documentRangeFormatting params)
| "textDocument/onTypeFormatting" ->
DocumentOnTypeFormattingRequest (parse_documentOnTypeFormatting params)
| "textDocument/codeLens" -> DocumentCodeLensRequest (parse_documentCodeLens params)
| "telemetry/rage" -> RageRequest
| "completionItem/resolve"
| "window/showMessageRequest"
Expand Down Expand Up @@ -1208,6 +1251,7 @@ let parse_lsp_result (request: lsp_request) (result: json) : lsp_result =
| InitializeRequest _
| RegisterCapabilityRequest _
| ShutdownRequest
| CodeLensResolveRequest _
| HoverRequest _
| CompletionRequest _
| CompletionItemResolveRequest _
Expand All @@ -1223,6 +1267,7 @@ let parse_lsp_result (request: lsp_request) (result: json) : lsp_result =
| DocumentOnTypeFormattingRequest _
| RageRequest
| RenameRequest _
| DocumentCodeLensRequest _
| UnknownRequest _ ->
raise (Error.Parse ("Don't know how to parse LSP response " ^ method_))

Expand Down Expand Up @@ -1256,6 +1301,7 @@ let print_lsp_request (id: lsp_id) (request: lsp_request) : json =
| InitializeRequest _
| ShutdownRequest
| HoverRequest _
| CodeLensResolveRequest _
| CompletionRequest _
| CompletionItemResolveRequest _
| DefinitionRequest _
Expand All @@ -1270,6 +1316,7 @@ let print_lsp_request (id: lsp_id) (request: lsp_request) : json =
| DocumentOnTypeFormattingRequest _
| RageRequest
| RenameRequest _
| DocumentCodeLensRequest _
| UnknownRequest _ ->
failwith ("Don't know how to print request " ^ method_)
in
Expand All @@ -1285,6 +1332,7 @@ let print_lsp_response ?include_error_stack_trace (id: lsp_id) (result: lsp_resu
let json = match result with
| InitializeResult r -> print_initialize r
| ShutdownResult -> print_shutdown ()
| CodeLensResolveResult r -> print_codeLensResolve r
| HoverResult r -> print_hover r
| CompletionResult r -> print_completion r
| DefinitionResult r -> print_definition r
Expand All @@ -1299,6 +1347,7 @@ let print_lsp_response ?include_error_stack_trace (id: lsp_id) (result: lsp_resu
| DocumentOnTypeFormattingResult r -> print_documentOnTypeFormatting r
| RageResult r -> print_rage r
| RenameResult r -> print_documentRename r
| DocumentCodeLensResult r -> print_documentCodeLens r
| ShowMessageRequestResult _
| ShowStatusResult _
| CompletionItemResolveResult _ ->
Expand Down
4 changes: 3 additions & 1 deletion src/lsp/flowLsp.ml
Original file line number Diff line number Diff line change
Expand Up @@ -469,7 +469,9 @@ let do_initialize () : Initialize.result =
documentSymbolProvider = true;
workspaceSymbolProvider = false;
codeActionProvider = false;
codeLensProvider = None;
codeLensProvider = Some {
codelens_resolveProvider = false;
};
documentFormattingProvider = false;
documentRangeFormattingProvider = false;
documentOnTypeFormattingProvider = None;
Expand Down
4 changes: 4 additions & 0 deletions src/lsp/lspInteraction.ml
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,8 @@ let trigger_of_lsp_msg = Lsp.(function
| RequestMessage (_, ShowMessageRequestRequest _)
| RequestMessage (_, ShowStatusRequest _)
| RequestMessage (_, ShutdownRequest)
| RequestMessage (_, CodeLensResolveRequest _)
| RequestMessage (_, DocumentCodeLensRequest _)
(* TODO not sure if this is right, just need to unbreak the build. *)
| RequestMessage (_, TypeDefinitionRequest _)
| RequestMessage (_, UnknownRequest _)
Expand All @@ -280,6 +282,7 @@ let trigger_of_lsp_msg = Lsp.(function
(* No responses trigger interactions *)
| ResponseMessage (_, InitializeResult _)
| ResponseMessage (_, ShutdownResult)
| ResponseMessage (_, CodeLensResolveResult _)
| ResponseMessage (_, HoverResult _)
| ResponseMessage (_, DefinitionResult _)
| ResponseMessage (_, CompletionResult _)
Expand All @@ -288,6 +291,7 @@ let trigger_of_lsp_msg = Lsp.(function
| ResponseMessage (_, DocumentSymbolResult _)
| ResponseMessage (_, FindReferencesResult _)
| ResponseMessage (_, DocumentHighlightResult _)
| ResponseMessage (_, DocumentCodeLensResult _)
| ResponseMessage (_, TypeCoverageResult _)
(* TODO not sure if this is right, just need to unbreak the build. *)
| ResponseMessage (_, TypeDefinitionResult _)
Expand Down

0 comments on commit 1d524cc

Please sign in to comment.