Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 57 additions & 9 deletions analysis/src/Hover.ml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,36 @@ open SharedTypes

let codeBlock code = Printf.sprintf "```rescript\n%s\n```" code

let encodeURIComponent text =
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This needs to be replaced by something vastly more complete/robust. Hopefully there's something for OCaml we can find and vendor or similar.

let ln = String.length text in
let buf = Buffer.create ln in
let rec loop i =
if i < ln then (
(match text.[i] with
| '"' -> Buffer.add_string buf "%22"
| ':' -> Buffer.add_string buf "%3A"
| '/' -> Buffer.add_string buf "%2F"
| '\\' -> Buffer.add_string buf "%5C"
| ',' -> Buffer.add_string buf "%2C"
| '&' -> Buffer.add_string buf "%26"
| '[' -> Buffer.add_string buf "%5B"
| ']' -> Buffer.add_string buf "%5D"
| c -> Buffer.add_char buf c);
loop (i + 1))
in
loop 0;
Buffer.contents buf

type link = {range: Protocol.range; file: string; label: string}

let linkToCommandArgs link =
Printf.sprintf "[\"%s\",%i,%i,%i,%i]" link.file link.range.start.character
link.range.start.line link.range.end_.character link.range.end_.line

let makeGotoCommand link =
Printf.sprintf "[%s](command:rescript-vscode.go_to_location?%s)" link.label
(encodeURIComponent (linkToCommandArgs link))

let showModuleTopLevel ~docstring ~name (topLevel : Module.item list) =
let contents =
topLevel
Expand Down Expand Up @@ -145,20 +175,37 @@ let newHover ~full:{file; package} locItem =
constructors |> List.filter_map (fromConstructorPath ~env:envToSearch)
in
let typeString = typeString :: typeDefinitions |> String.concat "\n\n" in
(typeString, docstring)
let links =
"\n---\nGo to: "
^ ([
makeGotoCommand
{
label = "SomeModule";
file =
"file:///Users/zth/git/rescript-vscode-official/analysis/examples/example-project/src/Json.res";
range =
{
start = {character = 0; line = 34};
end_ = {character = 0; line = 42};
};
};
]
|> String.concat " | ")
in
(typeString, docstring, links)
in
let parts =
match References.definedForLoc ~file ~package locKind with
| None ->
let typeString, docstring = t |> fromType ~docstring:[] in
typeString :: docstring
let typeString, docstring, links = t |> fromType ~docstring:[] in
List.concat [[typeString]; docstring; [links]]
| Some (docstring, res) -> (
match res with
| `Declared ->
let typeString, docstring = t |> fromType ~docstring in
typeString :: docstring
let typeString, docstring, links = t |> fromType ~docstring in
List.concat [[typeString]; docstring; [links]]
| `Constructor {cname = {txt}; args} ->
let typeString, docstring = t |> fromType ~docstring in
let typeString, docstring, links = t |> fromType ~docstring in
let argsString =
match args with
| [] -> ""
Expand All @@ -167,9 +214,10 @@ let newHover ~full:{file; package} locItem =
|> List.map (fun (t, _) -> Shared.typeToString t)
|> String.concat ", " |> Printf.sprintf "(%s)"
in
typeString :: codeBlock (txt ^ argsString) :: docstring
List.concat
[[typeString; codeBlock (txt ^ argsString)]; docstring; [links]]
| `Field ->
let typeString, docstring = t |> fromType ~docstring in
typeString :: docstring)
let typeString, docstring, links = t |> fromType ~docstring in
List.concat [[typeString]; docstring; [links]])
in
Some (String.concat "\n\n" parts)
2 changes: 1 addition & 1 deletion analysis/tests/src/expected/Auto.res.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
Hover src/Auto.res 2:13
{"contents": "```rescript\n(Belt.List.t<'a>, 'a => 'b) => Belt.List.t<'b>\n```\n\n```rescript\ntype t<'a> = list<'a>\n```\n\n\n Returns a new list with `f` applied to each element of `someList`.\n\n ```res example\n list{1, 2}->Belt.List.map(x => x + 1) // list{3, 4}\n ```\n"}
{"contents": "```rescript\n(Belt.List.t<'a>, 'a => 'b) => Belt.List.t<'b>\n```\n\n```rescript\ntype t<'a> = list<'a>\n```\n\n\n Returns a new list with `f` applied to each element of `someList`.\n\n ```res example\n list{1, 2}->Belt.List.map(x => x + 1) // list{3, 4}\n ```\n\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

6 changes: 3 additions & 3 deletions analysis/tests/src/expected/Definition.res.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@ Definition src/Definition.res 10:23
{"uri": "Definition.res", "range": {"start": {"line": 6, "character": 7}, "end": {"line": 6, "character": 13}}}

Hover src/Definition.res 14:14
{"contents": "```rescript\n('a => 'b, list<'a>) => list<'b>\n```\n\n [List.map f [a1; ...; an]] applies function [f] to [a1, ..., an],\n and builds the list [[f a1; ...; f an]]\n with the results returned by [f]. Not tail-recursive. "}
{"contents": "```rescript\n('a => 'b, list<'a>) => list<'b>\n```\n\n [List.map f [a1; ...; an]] applies function [f] to [a1, ..., an],\n and builds the list [[f a1; ...; f an]]\n with the results returned by [f]. Not tail-recursive. \n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Hover src/Definition.res 18:14
{"contents": "```rescript\n(Belt.List.t<'a>, 'a => 'b) => Belt.List.t<'b>\n```\n\n```rescript\ntype t<'a> = list<'a>\n```\n\n\n Returns a new list with `f` applied to each element of `someList`.\n\n ```res example\n list{1, 2}->Belt.List.map(x => x + 1) // list{3, 4}\n ```\n"}
{"contents": "```rescript\n(Belt.List.t<'a>, 'a => 'b) => Belt.List.t<'b>\n```\n\n```rescript\ntype t<'a> = list<'a>\n```\n\n\n Returns a new list with `f` applied to each element of `someList`.\n\n ```res example\n list{1, 2}->Belt.List.map(x => x + 1) // list{3, 4}\n ```\n\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Hover src/Definition.res 23:3
{"contents": "```rescript\n(. int, int) => int\n```"}
{"contents": "```rescript\n(. int, int) => int\n```\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Definition src/Definition.res 26:3
{"uri": "Definition.res", "range": {"start": {"line": 21, "character": 4}, "end": {"line": 21, "character": 13}}}
Expand Down
2 changes: 1 addition & 1 deletion analysis/tests/src/expected/Div.res.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Hover src/Div.res 0:10
getLocItem #3: heuristic for <div>
{"contents": "```rescript\n(\n string,\n ~props: ReactDOMRe.domProps=?,\n array<React.element>,\n) => React.element\n```\n\n```rescript\ntype domProps = ReactDOM.Props.domProps\n```\n\n```rescript\ntype element\n```"}
{"contents": "```rescript\n(\n string,\n ~props: ReactDOMRe.domProps=?,\n array<React.element>,\n) => React.element\n```\n\n```rescript\ntype domProps = ReactDOM.Props.domProps\n```\n\n```rescript\ntype element\n```\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Complete src/Div.res 3:17
posCursor:[3:17] posNoWhite:[3:16] Found expr:[3:4->3:17]
Expand Down
8 changes: 4 additions & 4 deletions analysis/tests/src/expected/DocComments.res.txt
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
Hover src/DocComments.res 9:9
{"contents": "```rescript\nint\n```\n\n Doc comment with a triple-backquote example\\n \\n ```res example\\n let a = 10\\n /*\\n * stuff\\n */\\n ```\\n"}
{"contents": "```rescript\nint\n```\n\n Doc comment with a triple-backquote example\\n \\n ```res example\\n let a = 10\\n /*\\n * stuff\\n */\\n ```\\n\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Hover src/DocComments.res 22:6
{"contents": "```rescript\nint\n```\n\n\n Doc comment with a triple-backquote example\n \n ```res example\n let a = 10\n /*\n * stuff\n */\n ```\n"}
{"contents": "```rescript\nint\n```\n\n\n Doc comment with a triple-backquote example\n \n ```res example\n let a = 10\n /*\n * stuff\n */\n ```\n\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Hover src/DocComments.res 33:9
{"contents": "```rescript\nint\n```\n\n Doc comment with a triple-backquote example\\n \\n ```res example\\n let a = 10\\n let b = 20\\n ```\\n"}
{"contents": "```rescript\nint\n```\n\n Doc comment with a triple-backquote example\\n \\n ```res example\\n let a = 10\\n let b = 20\\n ```\\n\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Hover src/DocComments.res 44:6
{"contents": "```rescript\nint\n```\n\n\n Doc comment with a triple-backquote example\n \n ```res example\n let a = 10\n let b = 20\n ```\n"}
{"contents": "```rescript\nint\n```\n\n\n Doc comment with a triple-backquote example\n \n ```res example\n let a = 10\n let b = 20\n ```\n\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

2 changes: 1 addition & 1 deletion analysis/tests/src/expected/Fragment.res.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Hover src/Fragment.res 6:19
getLocItem #4: heuristic for </Comp> within fragments: take make as makeProps does not work
the type is not great but jump to definition works
{"contents": "```rescript\nReact.component<{\"children\": React.element}>\n```\n\n```rescript\ntype component<'props> = componentLike<'props, element>\n```"}
{"contents": "```rescript\nReact.component<{\"children\": React.element}>\n```\n\n```rescript\ntype component<'props> = componentLike<'props, element>\n```\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Hover src/Fragment.res 9:56
Nothing at that position. Now trying to use completion.
Expand Down
40 changes: 20 additions & 20 deletions analysis/tests/src/expected/Hover.res.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
Hover src/Hover.res 0:4
{"contents": "```rescript\nint\n```"}
{"contents": "```rescript\nint\n```\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Hover src/Hover.res 3:5
{"contents": "```rescript\ntype t = (int, float)\n```"}
Expand All @@ -11,20 +11,20 @@ Hover src/Hover.res 19:11
{"contents": "\nThis module is commented\n```rescript\nmodule Dep = {\n let customDouble: int => int\n}\n```"}

Hover src/Hover.res 22:11
{"contents": "```rescript\nint => int\n```\n\nSome doc comment"}
{"contents": "```rescript\nint => int\n```\n\nSome doc comment\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Hover src/Hover.res 26:6
{"contents": "```rescript\nint\n```"}
{"contents": "```rescript\nint\n```\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Hover src/Hover.res 33:4
{"contents": "```rescript\nunit => int\n```\n\nDoc comment for functionWithTypeAnnotation"}
{"contents": "```rescript\nunit => int\n```\n\nDoc comment for functionWithTypeAnnotation\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Hover src/Hover.res 37:13
getLocItem #5: heuristic for JSX and compiler combined:
~x becomes Props#x
heuristic for: [Props, x], give loc of `x`
n1:Props n2:name
{"contents": "```rescript\nstring\n```"}
{"contents": "```rescript\nstring\n```\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Hover src/Hover.res 42:15
getLocItem #7: heuristic for JSX on type-annotated labeled (~arg:t):
Expand All @@ -33,7 +33,7 @@ Props has the location range of arg:t
arg has the location range of arg
heuristic for: [Props, arg], give loc of `arg`
n1:Props n2:name
{"contents": "```rescript\nstring\n```"}
{"contents": "```rescript\nstring\n```\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Hover src/Hover.res 46:10
{"contents": "```rescript\nint\n```"}
Expand Down Expand Up @@ -69,16 +69,16 @@ JSX <Comp1:[95:3->95:8] > _children:95:8
null

Hover src/Hover.res 103:25
{"contents": "```rescript\nfloat\n```"}
{"contents": "```rescript\nfloat\n```\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Hover src/Hover.res 106:21
{"contents": "```rescript\nint\n```"}
{"contents": "```rescript\nint\n```\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Hover src/Hover.res 116:16
{"contents": "```rescript\nAA.cond<[< #str(string)]> => AA.cond<[< #str(string)]>\n```\n\n```rescript\ntype cond<'a> = 'a\n constraint 'a = [< #str(string)]\n```"}
{"contents": "```rescript\nAA.cond<[< #str(string)]> => AA.cond<[< #str(string)]>\n```\n\n```rescript\ntype cond<'a> = 'a\n constraint 'a = [< #str(string)]\n```\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Hover src/Hover.res 119:25
{"contents": "```rescript\nAA.cond<[< #str(string)]> => AA.cond<[< #str(string)]>\n```\n\n```rescript\ntype cond<'a> = 'a\n constraint 'a = [< #str(string)]\n```"}
{"contents": "```rescript\nAA.cond<[< #str(string)]> => AA.cond<[< #str(string)]>\n```\n\n```rescript\ntype cond<'a> = 'a\n constraint 'a = [< #str(string)]\n```\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Hover src/Hover.res 122:3
Nothing at that position. Now trying to use completion.
Expand All @@ -87,28 +87,28 @@ Completable: Cdecorator(live)
{"contents": "The `@live` decorator is for reanalyze, a static analysis tool for ReScript that can do dead code analysis.\n\n`@live` tells the dead code analysis that the value should be considered live, even though it might appear to be dead. This is typically used in case of FFI where there are indirect ways to access values. It can be added to everything that could otherwise be considered unused by the dead code analysis - values, functions, arguments, records, individual record fields, and so on.\n\n[Read more and see examples in the documentation](https://rescript-lang.org/syntax-lookup#live-decorator).\n\nHint: Did you know you can run an interactive code analysis in your project by running the command `> ReScript: Start Code Analyzer`? Try it!"}

Hover src/Hover.res 125:4
{"contents": "```rescript\n(. ()) => unit => int\n```"}
{"contents": "```rescript\n(. ()) => unit => int\n```\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Hover src/Hover.res 131:4
{"contents": "```rescript\n(. ()) => (. ()) => int\n```"}
{"contents": "```rescript\n(. ()) => (. ()) => int\n```\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Hover src/Hover.res 134:4
{"contents": "```rescript\n(. unit, unit) => int\n```"}
{"contents": "```rescript\n(. unit, unit) => int\n```\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Hover src/Hover.res 137:5
{"contents": "```rescript\n(. ()) => unit => int\n```"}
{"contents": "```rescript\n(. ()) => unit => int\n```\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Hover src/Hover.res 144:9
{"contents": "```rescript\nint\n```\n\ndoc comment 1"}
{"contents": "```rescript\nint\n```\n\ndoc comment 1\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Hover src/Hover.res 148:6
{"contents": "```rescript\nint\n```\n\n doc comment 2 "}
{"contents": "```rescript\nint\n```\n\n doc comment 2 \n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Hover src/Hover.res 165:23
{"contents": "```rescript\nfoo<bar>\n```\n\n```rescript\ntype foo<'a> = {content: 'a, zzz: string}\n```\n\n```rescript\ntype bar = {age: int}\n```"}
{"contents": "```rescript\nfoo<bar>\n```\n\n```rescript\ntype foo<'a> = {content: 'a, zzz: string}\n```\n\n```rescript\ntype bar = {age: int}\n```\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Hover src/Hover.res 167:22
{"contents": "```rescript\nfoobar\n```\n\n```rescript\ntype foobar = foo<bar>\n```"}
{"contents": "```rescript\nfoobar\n```\n\n```rescript\ntype foobar = foo<bar>\n```\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Complete src/Hover.res 170:16
posCursor:[170:16] posNoWhite:[170:15] Found expr:[170:5->170:16]
Expand Down Expand Up @@ -159,8 +159,8 @@ Completable: Cpath Value[y2].content.""
}]

Hover src/Hover.res 197:4
{"contents": "```rescript\nCompV4.props<int, string> => React.element\n```\n\n```rescript\ntype props<'n, 's> = {?n: 'n, s: 's}\n```\n\n```rescript\ntype element\n```"}
{"contents": "```rescript\nCompV4.props<int, string> => React.element\n```\n\n```rescript\ntype props<'n, 's> = {?n: 'n, s: 's}\n```\n\n```rescript\ntype element\n```\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Hover src/Hover.res 202:16
{"contents": "```rescript\nuseR\n```\n\n```rescript\ntype useR = {x: int, y: list<option<r<float>>>}\n```\n\n```rescript\ntype r<'a> = {i: 'a, f: float}\n```"}
{"contents": "```rescript\nuseR\n```\n\n```rescript\ntype useR = {x: int, y: list<option<r<float>>>}\n```\n\n```rescript\ntype r<'a> = {i: 'a, f: float}\n```\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

4 changes: 2 additions & 2 deletions analysis/tests/src/expected/Jsx2.resi.txt
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
Hover src/Jsx2.resi 1:4
getLocItem #1: heuristic for makeProps in interface files
n1:componentLike n2:unit n3:string
{"contents": "```rescript\n(~first: string, ~key: string=?, unit) => {\"first\": string}\n```"}
{"contents": "```rescript\n(~first: string, ~key: string=?, unit) => {\"first\": string}\n```\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Hover src/Jsx2.resi 4:4
{"contents": "```rescript\nint\n```"}
{"contents": "```rescript\nint\n```\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Complete src/Jsx2.resi 7:19
posCursor:[7:19] posNoWhite:[7:18] Found type:[7:12->7:19]
Expand Down
2 changes: 1 addition & 1 deletion analysis/tests/src/expected/LongIdentTest.res.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
Hover src/LongIdentTest.res 2:13
{"contents": "```rescript\nint\n```"}
{"contents": "```rescript\nint\n```\n\n[SomeModule](command:rescript-vscode.go_to_location?%5B%22file%3A%2F%2Fwhatever%2Ffolder%2FSomeModule.res%22%2C0%2C0%2C0%2C0%5D)"}

Loading