diff --git a/analysis/src/Hover.ml b/analysis/src/Hover.ml index b928123d0..c86509e0d 100644 --- a/analysis/src/Hover.ml +++ b/analysis/src/Hover.ml @@ -164,3 +164,12 @@ let newHover ~full:{SharedTypes.file; package} locItem = typeString :: docstring) in Some (String.concat "\n\n" parts) + + +module A = struct end + +module B = A + +module C = B + +module D = C \ No newline at end of file diff --git a/analysis/src/References.ml b/analysis/src/References.ml index 43207325f..98058ec31 100644 --- a/analysis/src/References.ml +++ b/analysis/src/References.ml @@ -193,11 +193,13 @@ let alternateDeclared ~(file : File.t) ~package declared tip = | Some declared -> Some (file, extra, declared))) | _ -> None) -let rec resolveModuleReference ~file ~package (declared : moduleKind declared) = +let rec resolveModuleReference ?(pathsSeen = []) ~file ~package + (declared : moduleKind declared) = match declared.item with | Structure _ -> Some (file, Some declared) | Constraint (_moduleItem, moduleTypeItem) -> - resolveModuleReference ~file ~package {declared with item = moduleTypeItem} + resolveModuleReference ~pathsSeen ~file ~package + {declared with item = moduleTypeItem} | Ident path -> ( let env = QueryEnv.fromFile file in match ProcessCmt.fromCompilerPath ~env path with @@ -226,6 +228,9 @@ let rec resolveModuleReference ~file ~package (declared : moduleKind declared) = | `Stamp stamp -> ( match Hashtbl.find_opt file.stamps.modules stamp with | None -> None + | Some ({item = Ident path} as md) when not (List.mem path pathsSeen) -> + (* avoid possible infinite loops *) + resolveModuleReference ~file ~package ~pathsSeen:(path :: pathsSeen) md | Some md -> Some (file, Some md)) | `GlobalMod name -> ( match ProcessCmt.fileForModule ~package name with diff --git a/analysis/tests/src/expected/Hover.res.txt b/analysis/tests/src/expected/Hover.res.txt index 8302e089c..40645e99c 100644 --- a/analysis/tests/src/expected/Hover.res.txt +++ b/analysis/tests/src/expected/Hover.res.txt @@ -44,5 +44,5 @@ Hover tests/src/Hover.res 71:7 {"contents": "```rescript\nmodule A = {\n let x: int\n}\n```"} Hover tests/src/Hover.res 74:7 -{"contents": "Unable to resolve module reference A"} +{"contents": "```rescript\nmodule A = {\n let x: int\n}\n```"}