diff --git a/analysis/src/SignatureHelp.ml b/analysis/src/SignatureHelp.ml index b51287acd..489c070b2 100644 --- a/analysis/src/SignatureHelp.ml +++ b/analysis/src/SignatureHelp.ml @@ -192,6 +192,12 @@ let findActiveParameter ~argAtCursor ~args = index := !index + 1; None) +type constructorInfo = { + docstring: string list; + name: string; + args: constructorArgs; +} + let findConstructorArgs ~full ~env ~constructorName loc = match References.getLocItem ~debug:false ~full @@ -200,10 +206,51 @@ let findConstructorArgs ~full ~env ~constructorName loc = | None -> None | Some {locType = Typed (_, typExpr, _)} -> ( match TypeUtils.extractType ~env ~package:full.package typExpr with + | Some ((Toption (_, TypeExpr t) as extractedType), _) -> ( + match constructorName with + | "Some" -> + Some + { + name = "Some"; + docstring = + [ + Markdown.codeBlock + (TypeUtils.extractedTypeToString extractedType); + ]; + args = Args [(t, Location.none)]; + } + | _ -> None) + | Some ((Tresult {okType; errorType} as extractedType), _) -> ( + match constructorName with + | "Ok" -> + Some + { + name = "Ok"; + docstring = + [ + Markdown.codeBlock + (TypeUtils.extractedTypeToString extractedType); + ]; + args = Args [(okType, Location.none)]; + } + | "Error" -> + Some + { + name = "Error"; + docstring = + [ + Markdown.codeBlock + (TypeUtils.extractedTypeToString extractedType); + ]; + args = Args [(errorType, Location.none)]; + } + | _ -> None) | Some (Tvariant {constructors}, _) -> constructors |> List.find_opt (fun (c : Constructor.t) -> c.cname.txt = constructorName) + |> Option.map (fun (c : Constructor.t) -> + {docstring = c.docstring; name = c.cname.txt; args = c.args}) | _ -> None) | _ -> None @@ -554,7 +601,7 @@ let signatureHelp ~path ~pos ~currentFile ~debug ~allowForConstructorPayloads = (startOffset, endOffset) )))) in let label = - constructor.cname.txt ^ "(" + constructor.name ^ "(" ^ (match argParts with | None -> "" | Some (`InlineRecord fields) -> @@ -659,7 +706,7 @@ let signatureHelp ~path ~pos ~currentFile ~debug ~allowForConstructorPayloads = | _ -> -1 in - let constructorNameLength = String.length constructor.cname.txt in + let constructorNameLength = String.length constructor.name in let params = match argParts with | None -> [] diff --git a/analysis/tests/src/SignatureHelp.res b/analysis/tests/src/SignatureHelp.res index b061bfe99..387a28971 100644 --- a/analysis/tests/src/SignatureHelp.res +++ b/analysis/tests/src/SignatureHelp.res @@ -152,3 +152,12 @@ let _ = switch _one { | Three(_, _b) => "" // ^she } + +let _bb = Ok(true) +// ^she + +let _bbb = Error("err") +// ^she + +let _cc = Some(true) +// ^she diff --git a/analysis/tests/src/expected/SignatureHelp.res.txt b/analysis/tests/src/expected/SignatureHelp.res.txt index efa84013d..580401264 100644 --- a/analysis/tests/src/expected/SignatureHelp.res.txt +++ b/analysis/tests/src/expected/SignatureHelp.res.txt @@ -560,3 +560,36 @@ Signature help src/SignatureHelp.res 151:12 "activeParameter": 1 } +Signature help src/SignatureHelp.res 155:14 +{ + "signatures": [{ + "label": "Ok(bool)", + "parameters": [{"label": [3, 7], "documentation": {"kind": "markdown", "value": ""}}], + "documentation": {"kind": "markdown", "value": "```rescript\nresult\n```"} + }], + "activeSignature": 0, + "activeParameter": 0 +} + +Signature help src/SignatureHelp.res 158:19 +{ + "signatures": [{ + "label": "Error(string)", + "parameters": [{"label": [6, 12], "documentation": {"kind": "markdown", "value": ""}}], + "documentation": {"kind": "markdown", "value": "```rescript\nresult<'a, string>\n```"} + }], + "activeSignature": 0, + "activeParameter": 0 +} + +Signature help src/SignatureHelp.res 161:16 +{ + "signatures": [{ + "label": "Some(bool)", + "parameters": [{"label": [5, 9], "documentation": {"kind": "markdown", "value": ""}}], + "documentation": {"kind": "markdown", "value": "```rescript\noption\n```"} + }], + "activeSignature": 0, + "activeParameter": 0 +} +