diff --git a/CHANGELOG.md b/CHANGELOG.md index 776784277..e32266aa1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## master - ppx autocomplete: handle more atomic expressions to the rhs of `=` without braces (variant, polymorphic variant, function call, list literal, nested component, characters, templates). - Autocomplete for function calls: only suggest labeled args that were not yet assigned. +- Add support for recursive modules. ## 1.1.1 diff --git a/analysis/src/ProcessCmt.ml b/analysis/src/ProcessCmt.ml index 6ac739966..14c534511 100644 --- a/analysis/src/ProcessCmt.ml +++ b/analysis/src/ProcessCmt.ml @@ -2,7 +2,6 @@ open Typedtree open SharedTypes let itemsExtent items = - let open Typedtree in match items with | [] -> Location.none | first :: _ -> @@ -19,7 +18,6 @@ let itemsExtent items = } let sigItemsExtent items = - let open Typedtree in match items with | [] -> Location.none | first :: _ -> @@ -223,7 +221,7 @@ let forTypeDeclaration ~env ~(exported : exported) in {declared with item = MType (declared.item, recStatus)} -let forSignatureItem ~env ~(exported : exported) +let rec forSignatureItem ~env ~(exported : exported) (item : Typedtree.signature_item) = match item.sig_desc with | Tsig_value {val_id; val_loc; val_name = name; val_desc; val_attributes} -> @@ -252,6 +250,12 @@ let forSignatureItem ~env ~(exported : exported) md_attributes exported.modules env.stamps.modules in [{declared with item = Module declared.item}] + | Tsig_recmodule modDecls -> + modDecls + |> List.map (fun modDecl -> + forSignatureItem ~env ~exported + {item with sig_desc = Tsig_module modDecl}) + |> List.flatten | Tsig_include {incl_mod; incl_type} -> let env = match getModuleTypePath incl_mod.mty_desc with @@ -339,6 +343,12 @@ let rec forStructureItem ~env ~(exported : exported) item = mb_attributes exported.modules env.stamps.modules in [{declared with item = Module declared.item}] + | Tstr_recmodule modDecls -> + modDecls + |> List.map (fun modDecl -> + forStructureItem ~env ~exported + {item with str_desc = Tstr_module modDecl}) + |> List.flatten | Tstr_modtype { mtd_name = name; diff --git a/analysis/tests/src/RecModules.res b/analysis/tests/src/RecModules.res new file mode 100644 index 000000000..6794387f4 --- /dev/null +++ b/analysis/tests/src/RecModules.res @@ -0,0 +1,22 @@ +module rec A: { + type t + + @send external child: t => B.t = "child" +} = A + +and B: { + type t + + @send external parent: t => A.t = "parent" +} = B + +module C = { + type t + + @send external createA: t => A.t = "createA" +} + +module MC = C +// ^hov +module MA = A +// ^hov diff --git a/analysis/tests/src/expected/RecModules.res.txt b/analysis/tests/src/expected/RecModules.res.txt new file mode 100644 index 000000000..80168487c --- /dev/null +++ b/analysis/tests/src/expected/RecModules.res.txt @@ -0,0 +1,6 @@ +Hover tests/src/RecModules.res 18:12 +{"contents": "```rescript\nmodule C = {\n type t\n let createA: t => A.t\n}\n```"} + +Hover tests/src/RecModules.res 20:12 +{"contents": "```rescript\nmodule A = {\n type t\n let child: t => B.t\n}\n```"} +