Skip to content

Commit 1c5b438

Browse files
amiraliescristianoc
authored andcommitted
Add type definition provider
1 parent ddc3abe commit 1c5b438

File tree

5 files changed

+167
-29
lines changed

5 files changed

+167
-29
lines changed

analysis/.depend

Lines changed: 96 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,106 @@
1-
src/BuildSystem.cmx : src/ModuleResolution.cmx src/Log.cmx src/Files.cmx
2-
src/Cli.cmx : src/Commands.cmx
3-
src/Cmt.cmx : src/Utils.cmx src/Uri2.cmx src/SharedTypes.cmx \
4-
src/ProcessCmt.cmx src/Packages.cmx src/FindFiles.cmx src/BuildSystem.cmx
5-
src/Commands.cmx : src/Utils.cmx src/Uri2.cmx src/SharedTypes.cmx \
6-
src/Shared.cmx src/References.cmx src/Protocol.cmx src/NewCompletions.cmx \
7-
src/Hover.cmx src/Files.cmx src/Cmt.cmx
1+
src/BuildSystem.cmx : \
2+
src/ModuleResolution.cmx \
3+
src/Log.cmx \
4+
src/Files.cmx
5+
src/Cli.cmx : \
6+
src/Commands.cmx
7+
src/Cmt.cmx : \
8+
src/Utils.cmx \
9+
src/Uri2.cmx \
10+
src/SharedTypes.cmx \
11+
src/ProcessCmt.cmx \
12+
src/Packages.cmx \
13+
src/FindFiles.cmx \
14+
src/BuildSystem.cmx
15+
src/Commands.cmx : \
16+
src/Utils.cmx \
17+
src/Uri2.cmx \
18+
src/SharedTypes.cmx \
19+
src/Shared.cmx \
20+
src/References.cmx \
21+
src/Protocol.cmx \
22+
src/NewCompletions.cmx \
23+
src/Hover.cmx \
24+
src/Files.cmx \
25+
src/Cmt.cmx
826
src/Files.cmx :
9-
src/FindFiles.cmx : src/Utils.cmx src/SharedTypes.cmx \
10-
src/ModuleResolution.cmx src/Log.cmx src/vendor/Json.cmx src/Infix.cmx \
11-
src/Files.cmx src/BuildSystem.cmx
12-
src/Hover.cmx : src/Utils.cmx src/SharedTypes.cmx src/Shared.cmx \
13-
src/References.cmx src/ProcessCmt.cmx
27+
src/FindFiles.cmx : \
28+
src/Utils.cmx \
29+
src/SharedTypes.cmx \
30+
src/ModuleResolution.cmx \
31+
src/Log.cmx \
32+
src/vendor/Json.cmx \
33+
src/Infix.cmx \
34+
src/Files.cmx \
35+
src/BuildSystem.cmx
36+
src/Hover.cmx : \
37+
src/Utils.cmx \
38+
src/SharedTypes.cmx \
39+
src/Shared.cmx \
40+
src/References.cmx \
41+
src/ProcessCmt.cmx
1442
src/Infix.cmx :
1543
src/Log.cmx :
16-
src/ModuleResolution.cmx : src/Files.cmx
17-
src/NewCompletions.cmx : src/Utils.cmx src/Uri2.cmx src/SharedTypes.cmx \
18-
src/Shared.cmx src/Protocol.cmx src/ProcessCmt.cmx src/PartialParser.cmx \
19-
src/Log.cmx src/Hover.cmx
20-
src/Packages.cmx : src/Uri2.cmx src/SharedTypes.cmx src/Log.cmx \
21-
src/vendor/Json.cmx src/Infix.cmx src/FindFiles.cmx src/Files.cmx \
44+
src/ModuleResolution.cmx : \
45+
src/Files.cmx
46+
src/NewCompletions.cmx : \
47+
src/Utils.cmx \
48+
src/Uri2.cmx \
49+
src/SharedTypes.cmx \
50+
src/Shared.cmx \
51+
src/Protocol.cmx \
52+
src/ProcessCmt.cmx \
53+
src/PartialParser.cmx \
54+
src/Log.cmx \
55+
src/Hover.cmx
56+
src/Packages.cmx : \
57+
src/Uri2.cmx \
58+
src/SharedTypes.cmx \
59+
src/Log.cmx \
60+
src/vendor/Json.cmx \
61+
src/Infix.cmx \
62+
src/FindFiles.cmx \
63+
src/Files.cmx \
2264
src/BuildSystem.cmx
23-
src/PartialParser.cmx : src/SharedTypes.cmx
65+
src/PartialParser.cmx : \
66+
src/SharedTypes.cmx
2467
src/PrepareUtils.cmx :
25-
src/PrintType.cmx : src/vendor/res_outcome_printer/res_outcome_printer.cmx \
68+
src/PrintType.cmx : \
69+
src/vendor/res_outcome_printer/res_outcome_printer.cmx \
2670
src/vendor/res_outcome_printer/res_doc.cmx
27-
src/ProcessAttributes.cmx : src/SharedTypes.cmx src/PrepareUtils.cmx
28-
src/ProcessCmt.cmx : src/Utils.cmx src/Uri2.cmx src/SharedTypes.cmx \
29-
src/Shared.cmx src/ProcessAttributes.cmx src/Log.cmx src/Files.cmx
30-
src/Protocol.cmx : src/vendor/Json.cmx
31-
src/References.cmx : src/Utils.cmx src/Uri2.cmx src/SharedTypes.cmx \
32-
src/ProcessCmt.cmx src/Log.cmx src/Infix.cmx src/Cmt.cmx
33-
src/Shared.cmx : src/PrintType.cmx src/Log.cmx src/Files.cmx
34-
src/SharedTypes.cmx : src/Utils.cmx src/Uri2.cmx src/Shared.cmx
71+
src/ProcessAttributes.cmx : \
72+
src/SharedTypes.cmx \
73+
src/PrepareUtils.cmx
74+
src/ProcessCmt.cmx : \
75+
src/Utils.cmx \
76+
src/Uri2.cmx \
77+
src/SharedTypes.cmx \
78+
src/Shared.cmx \
79+
src/ProcessAttributes.cmx \
80+
src/Log.cmx \
81+
src/Files.cmx
82+
src/Protocol.cmx : \
83+
src/vendor/Json.cmx
84+
src/References.cmx : \
85+
src/Utils.cmx \
86+
src/Uri2.cmx \
87+
src/SharedTypes.cmx \
88+
src/Shared.cmx \
89+
src/ProcessCmt.cmx \
90+
src/Log.cmx \
91+
src/Infix.cmx \
92+
src/Cmt.cmx
93+
src/Shared.cmx : \
94+
src/PrintType.cmx \
95+
src/Log.cmx \
96+
src/Files.cmx
97+
src/SharedTypes.cmx : \
98+
src/Utils.cmx \
99+
src/Uri2.cmx \
100+
src/Shared.cmx
35101
src/Uri2.cmx :
36-
src/Utils.cmx : src/Protocol.cmx
102+
src/Utils.cmx : \
103+
src/Protocol.cmx
37104
src/vendor/Json.cmx :
38105
src/vendor/res_outcome_printer/res_comment.cmx : \
39106
src/vendor/res_outcome_printer/res_comment.cmi

analysis/src/Cli.ml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ let help =
55
API examples:
66
./rescript-editor-analysis.exe completion src/MyFile.res 0 4 currentContent.res
77
./rescript-editor-analysis.exe definition src/MyFile.res 9 3
8+
./rescript-editor-analysis.exe typeDefinition src/MyFile.res 9 3
89
./rescript-editor-analysis.exe documentSymbol src/Foo.res
910
./rescript-editor-analysis.exe hover src/MyFile.res 10 2
1011
./rescript-editor-analysis.exe references src/MyFile.res 10 2
@@ -27,6 +28,10 @@ Options:
2728

2829
./rescript-editor-analysis.exe definition src/MyFile.res 10 2
2930

31+
typeDefinition: get type definition for item in MyFile.res at line 10 column 2:
32+
33+
./rescript-editor-analysis.exe typeDefinition src/MyFile.res 10 2
34+
3035
documentSymbol: get all symbols declared in MyFile.res
3136

3237
./rescript-editor-analysis.exe documentSymbol src/MyFile.res
@@ -60,6 +65,9 @@ let main () =
6065
| [_; "definition"; path; line; col] ->
6166
Commands.definition ~path ~line:(int_of_string line)
6267
~col:(int_of_string col)
68+
| [_; "typeDefinition"; path; line; col] ->
69+
Commands.typeDefinition ~path ~line:(int_of_string line)
70+
~col:(int_of_string col)
6371
| _ :: "dump" :: files -> Commands.dump files
6472
| [_; "documentSymbol"; path] -> Commands.documentSymbol ~path
6573
| [_; "hover"; path; line; col] ->

analysis/src/Commands.ml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,26 @@ let definition ~path ~line ~col =
122122
| None -> Protocol.null
123123
| Some location -> location |> Protocol.stringifyLocation)
124124

125+
let typeDefinition ~path ~line ~col =
126+
let maybeLocation =
127+
match Cmt.fromPath ~path with
128+
| None -> None
129+
| Some full -> (
130+
match References.getLocItem ~full ~line ~col with
131+
| None -> None
132+
| Some locItem -> (
133+
match References.typeDefinitionForLocItem ~full locItem with
134+
| None -> None
135+
| Some (uri, loc) ->
136+
Some
137+
{Protocol.uri = Uri2.toString uri; range = Utils.cmtLocToRange loc})
138+
)
139+
in
140+
print_endline
141+
(match maybeLocation with
142+
| None -> Protocol.null
143+
| Some location -> location |> Protocol.stringifyLocation)
144+
125145
let references ~path ~line ~col =
126146
let allLocs =
127147
match Cmt.fromPath ~path with
@@ -281,6 +301,11 @@ let test ~path =
281301
("Definition " ^ path ^ " " ^ string_of_int line ^ ":"
282302
^ string_of_int col);
283303
definition ~path ~line ~col
304+
| "typ" ->
305+
print_endline
306+
("TypeDefinition " ^ path ^ " " ^ string_of_int line ^ ":"
307+
^ string_of_int col);
308+
typeDefinition ~path ~line ~col
284309
| "hov" ->
285310
print_endline
286311
("Hover " ^ path ^ " " ^ string_of_int line ^ ":"

analysis/src/References.ml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,29 @@ let definitionForLocItem ~full:{file; package} locItem =
359359
maybeLog ("Got stamp " ^ string_of_int stamp);
360360
definition ~file:env.file ~package stamp tip)))
361361

362+
let typeDefinitionForLocItem ~full:{file; package} locItem =
363+
match locItem.locType with
364+
| Constant _ | TopLevelModule _ | LModule _ | TypeDefinition _ -> None
365+
| Typed (_, typ, _) -> (
366+
let env = SharedTypes.QueryEnv.fromFile file in
367+
match Shared.digConstructor typ with
368+
| None -> None
369+
| Some path -> (
370+
match ProcessCmt.resolveFromCompilerPath ~env ~package path with
371+
| `Not_found -> None
372+
| `Stamp stamp -> (
373+
match Hashtbl.find_opt env.file.stamps.types stamp with
374+
| None -> None
375+
| Some declared -> Some (env.file.uri, declared.item.decl.type_loc))
376+
| `Exported (env, name) -> (
377+
match Hashtbl.find_opt env.exported.types name with
378+
| None -> None
379+
| Some stamp -> (
380+
match Hashtbl.find_opt env.file.stamps.types stamp with
381+
| None -> None
382+
| Some declared -> Some (env.file.uri, declared.item.decl.type_loc))))
383+
)
384+
362385
let isVisible (declared : _ SharedTypes.declared) =
363386
declared.isExported
364387
&&

server/src/server.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,18 @@ function definition(msg: p.RequestMessage) {
265265
return response;
266266
}
267267

268+
function typeDefinition(msg: p.RequestMessage) {
269+
// https://microsoft.github.io/language-server-protocol/specification/specification-current/#textDocument_typeDefinition
270+
let params = msg.params as p.TypeDefinitionParams;
271+
let filePath = fileURLToPath(params.textDocument.uri);
272+
let response = utils.runAnalysisCommand(
273+
filePath,
274+
["typeDefinition", filePath, params.position.line, params.position.character],
275+
msg
276+
);
277+
return response;
278+
}
279+
268280
function references(msg: p.RequestMessage) {
269281
// https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_references
270282
let params = msg.params as p.ReferenceParams;
@@ -620,6 +632,7 @@ function onMessage(msg: m.Message) {
620632
documentFormattingProvider: true,
621633
hoverProvider: true,
622634
definitionProvider: true,
635+
typeDefinitionProvider: true,
623636
referencesProvider: true,
624637
renameProvider: { prepareProvider: true },
625638
documentSymbolProvider: true,
@@ -670,6 +683,8 @@ function onMessage(msg: m.Message) {
670683
send(hover(msg));
671684
} else if (msg.method === p.DefinitionRequest.method) {
672685
send(definition(msg));
686+
} else if (msg.method === p.TypeDefinitionRequest.method) {
687+
send(typeDefinition(msg));
673688
} else if (msg.method === p.ReferencesRequest.method) {
674689
send(references(msg));
675690
} else if (msg.method === p.PrepareRenameRequest.method) {

0 commit comments

Comments
 (0)