Skip to content

Commit d4e2932

Browse files
committed
Add support for transitive module references.
Fixes #195
1 parent ce95a62 commit d4e2932

File tree

3 files changed

+17
-3
lines changed

3 files changed

+17
-3
lines changed

analysis/src/Hover.ml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,3 +164,12 @@ let newHover ~full:{SharedTypes.file; package} locItem =
164164
typeString :: docstring)
165165
in
166166
Some (String.concat "\n\n" parts)
167+
168+
169+
module A = struct end
170+
171+
module B = A
172+
173+
module C = B
174+
175+
module D = C

analysis/src/References.ml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,11 +193,13 @@ let alternateDeclared ~(file : File.t) ~package declared tip =
193193
| Some declared -> Some (file, extra, declared)))
194194
| _ -> None)
195195

196-
let rec resolveModuleReference ~file ~package (declared : moduleKind declared) =
196+
let rec resolveModuleReference ?(pathsSeen = []) ~file ~package
197+
(declared : moduleKind declared) =
197198
match declared.item with
198199
| Structure _ -> Some (file, Some declared)
199200
| Constraint (_moduleItem, moduleTypeItem) ->
200-
resolveModuleReference ~file ~package {declared with item = moduleTypeItem}
201+
resolveModuleReference ~pathsSeen ~file ~package
202+
{declared with item = moduleTypeItem}
201203
| Ident path -> (
202204
let env = QueryEnv.fromFile file in
203205
match ProcessCmt.fromCompilerPath ~env path with
@@ -226,6 +228,9 @@ let rec resolveModuleReference ~file ~package (declared : moduleKind declared) =
226228
| `Stamp stamp -> (
227229
match Hashtbl.find_opt file.stamps.modules stamp with
228230
| None -> None
231+
| Some ({item = Ident path} as md) when not (List.mem path pathsSeen) ->
232+
(* avoid possible infinite loops *)
233+
resolveModuleReference ~file ~package ~pathsSeen:(path :: pathsSeen) md
229234
| Some md -> Some (file, Some md))
230235
| `GlobalMod name -> (
231236
match ProcessCmt.fileForModule ~package name with

analysis/tests/src/expected/Hover.res.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,5 +44,5 @@ Hover tests/src/Hover.res 71:7
4444
{"contents": "```rescript\nmodule A = {\n let x: int\n}\n```"}
4545

4646
Hover tests/src/Hover.res 74:7
47-
{"contents": "Unable to resolve module reference A"}
47+
{"contents": "```rescript\nmodule A = {\n let x: int\n}\n```"}
4848

0 commit comments

Comments
 (0)