From 6992133ad5a14dafc3f4464fb5a2616b3d1731ad Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Wed, 28 Apr 2021 15:40:05 +0200 Subject: [PATCH 01/10] Towards better treatment of modules and module types. Fixes https://github.com/rescript-lang/rescript-vscode/issues/178 --- analysis/src/Commands.ml | 3 +++ analysis/src/Hover.ml | 4 +++- analysis/src/ProcessCmt.ml | 8 ++++++-- analysis/src/References.ml | 3 ++- analysis/src/SharedTypes.ml | 5 ++++- analysis/tests/src/Hover.res | 9 +++++++++ analysis/tests/src/expected/A.res.txt | 3 +++ analysis/tests/src/expected/Hover.res.txt | 3 +++ 8 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 analysis/tests/src/expected/A.res.txt diff --git a/analysis/src/Commands.ml b/analysis/src/Commands.ml index 40dbac7d3..d77188a62 100644 --- a/analysis/src/Commands.ml +++ b/analysis/src/Commands.ml @@ -170,6 +170,9 @@ let documentSymbol ~path = | MValue v -> (v |> SharedTypes.variableKind, []) | MType (t, _) -> (t.decl |> SharedTypes.declarationKind, []) | Module (Structure contents) -> (Module, getItems contents) + | Module (Constraint (_, Structure contents)) -> + (Module, getItems contents) + | Module (Constraint _) -> (Module, []) | Module (Ident _) -> (Module, []) in if extentLoc.loc_ghost then siblings diff --git a/analysis/src/Hover.ml b/analysis/src/Hover.ml index 4903fe115..0ef1f4e43 100644 --- a/analysis/src/Hover.ml +++ b/analysis/src/Hover.ml @@ -45,7 +45,9 @@ let showModule ~docstring ~(file : SharedTypes.file) ~name | None -> showModuleTopLevel ~docstring ~name file.contents.topLevel | Some {item = Structure {topLevel}} -> showModuleTopLevel ~docstring ~name topLevel - | Some {item = Ident _} -> Some "Unable to resolve module reference" + | Some {item = Constraint(Structure {topLevel}, _)} -> + showModuleTopLevel ~docstring ~name topLevel + | Some _ -> Some "Unable to resolve module reference" let newHover ~(file : SharedTypes.file) ~package locItem = match locItem.SharedTypes.locType with diff --git a/analysis/src/ProcessCmt.ml b/analysis/src/ProcessCmt.ml index d840632a5..76d9a1849 100644 --- a/analysis/src/ProcessCmt.ml +++ b/analysis/src/ProcessCmt.ml @@ -375,6 +375,7 @@ let rec forItem ~env ~(exported : exported) item = | _ -> Types.Trec_next in decl |> forTypeDeclaration ~env ~exported ~recStatus) + | Tstr_modtype _ -> [] | _ -> [] and forModule env mod_desc moduleName = @@ -422,12 +423,14 @@ and forModule env mod_desc moduleName = (* e.g. when the same id is defined twice (e.g. make with @react.component) *) (* skip the constraint and use the original module definition *) forModule env expr.mod_desc moduleName - | Tmod_constraint (_expr, typ, _constraint, _coercion) -> + | Tmod_constraint (expr, typ, _constraint, _coercion) -> (* TODO do this better I think *) + let forMod = forModule env expr.mod_desc moduleName in let env = {env with modulePath = ExportedModule (moduleName, env.modulePath)} in - forModuleType env typ + let forModTyp = forModuleType env typ in + Constraint (forMod, forModTyp) and forStructure ~env items = let exported = initExported () in @@ -636,6 +639,7 @@ and findInModule ~env kind path = match kind with | Structure {exported} -> resolvePathInner ~env:{env with qExported = exported} ~path + | Constraint (_, k) -> findInModule ~env k path | Ident modulePath -> ( let stamp, moduleName, fullPath = joinPaths modulePath path in if stamp = 0 then Some (`Global (moduleName, fullPath)) diff --git a/analysis/src/References.ml b/analysis/src/References.ml index a92bdd6ac..f23628208 100644 --- a/analysis/src/References.ml +++ b/analysis/src/References.ml @@ -197,7 +197,8 @@ let alternateDeclared ~file ~package declared tip = let resolveModuleReference ~file ~package (declared : moduleKind declared) = match declared.item with | Structure _ -> Some (file, Some declared) - | Ident path -> ( + | Constraint ((Structure _ | Constraint _), _) -> Some (file, Some declared) + | Ident path | Constraint (Ident path, _) -> ( let env = ProcessCmt.fileEnv file in match ProcessCmt.fromCompilerPath ~env path with | `Not_found -> None diff --git a/analysis/src/SharedTypes.ml b/analysis/src/SharedTypes.ml index 05ccd4eaa..48e011075 100644 --- a/analysis/src/SharedTypes.ml +++ b/analysis/src/SharedTypes.ml @@ -117,7 +117,10 @@ and moduleContents = { topLevel : moduleItem declared list; } -and moduleKind = Ident of Path.t | Structure of moduleContents +and moduleKind = + | Ident of Path.t + | Structure of moduleContents + | Constraint of moduleKind * moduleKind type 't stampMap = (int, 't) Hashtbl.t diff --git a/analysis/tests/src/Hover.res b/analysis/tests/src/Hover.res index 5a6501f36..b5659ff4a 100644 --- a/analysis/tests/src/Hover.res +++ b/analysis/tests/src/Hover.res @@ -44,3 +44,12 @@ let make2 = (~name:string) => React.string(name) let num = 34 // ^hov + +module type Logger = { + let log: string => unit +} + +module JsLogger: Logger = { +// ^hov + let log = (msg: string) => Js.log(msg) +} \ No newline at end of file diff --git a/analysis/tests/src/expected/A.res.txt b/analysis/tests/src/expected/A.res.txt new file mode 100644 index 000000000..75bf4748b --- /dev/null +++ b/analysis/tests/src/expected/A.res.txt @@ -0,0 +1,3 @@ +Hover tests/src/A.res 4:7 +{"contents": "```rescript\nmodule JsLogger = {\n let log: string => unit\n}\n```"} + diff --git a/analysis/tests/src/expected/Hover.res.txt b/analysis/tests/src/expected/Hover.res.txt index 7a0e4f5fe..25da21654 100644 --- a/analysis/tests/src/expected/Hover.res.txt +++ b/analysis/tests/src/expected/Hover.res.txt @@ -28,3 +28,6 @@ Hover tests/src/Hover.res 41:13 Hover tests/src/Hover.res 44:10 {"contents": "```rescript\nint\n```"} +Hover tests/src/Hover.res 51:7 +{"contents": "```rescript\nmodule JsLogger = {\n let log: string => unit\n}\n```"} + From d2aef8941a54732a4a5937b3ab429b458c96a6d0 Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Wed, 28 Apr 2021 16:57:59 +0200 Subject: [PATCH 02/10] Add jump to definition test. --- analysis/tests/src/Hover.res | 5 ++++- analysis/tests/src/expected/Hover.res.txt | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/analysis/tests/src/Hover.res b/analysis/tests/src/Hover.res index b5659ff4a..8a0c83d34 100644 --- a/analysis/tests/src/Hover.res +++ b/analysis/tests/src/Hover.res @@ -52,4 +52,7 @@ module type Logger = { module JsLogger: Logger = { // ^hov let log = (msg: string) => Js.log(msg) -} \ No newline at end of file +} + +module JJ = JsLogger +// ^def diff --git a/analysis/tests/src/expected/Hover.res.txt b/analysis/tests/src/expected/Hover.res.txt index 25da21654..e6fdb5ad2 100644 --- a/analysis/tests/src/expected/Hover.res.txt +++ b/analysis/tests/src/expected/Hover.res.txt @@ -31,3 +31,6 @@ Hover tests/src/Hover.res 44:10 Hover tests/src/Hover.res 51:7 {"contents": "```rescript\nmodule JsLogger = {\n let log: string => unit\n}\n```"} +Definition tests/src/Hover.res 56:14 +{"uri": "Hover.res", "range": {"start": {"line": 51, "character": 7}, "end": {"line": 51, "character": 15}}} + From 0556a8f0e61950a6f653340010c77daefe11b5ea Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Thu, 29 Apr 2021 02:10:42 +0200 Subject: [PATCH 03/10] Teat modules more uniformly. --- analysis/src/Commands.ml | 18 ++++++++---------- analysis/src/Hover.ml | 10 ++++++---- analysis/src/ProcessCmt.ml | 6 +++--- analysis/tests/src/Hover.res | 1 + analysis/tests/src/expected/Hover.res.txt | 4 ++-- 5 files changed, 20 insertions(+), 19 deletions(-) diff --git a/analysis/src/Commands.ml b/analysis/src/Commands.ml index d77188a62..4a5c7da88 100644 --- a/analysis/src/Commands.ml +++ b/analysis/src/Commands.ml @@ -164,17 +164,15 @@ let documentSymbol ~path = | Ok (file, _extra) -> let open SharedTypes in let rec getItems {topLevel} = + let rec getItem = function + | MValue v -> (v |> SharedTypes.variableKind, []) + | MType (t, _) -> (t.decl |> SharedTypes.declarationKind, []) + | Module (Structure contents) -> (Module, getItems contents) + | Module (Constraint (_, modTypeItem)) -> getItem (Module modTypeItem) + | Module (Ident _) -> (Module, []) + in let fn {name = {txt}; extentLoc; item} = - let item, siblings = - match item with - | MValue v -> (v |> SharedTypes.variableKind, []) - | MType (t, _) -> (t.decl |> SharedTypes.declarationKind, []) - | Module (Structure contents) -> (Module, getItems contents) - | Module (Constraint (_, Structure contents)) -> - (Module, getItems contents) - | Module (Constraint _) -> (Module, []) - | Module (Ident _) -> (Module, []) - in + let item, siblings = getItem item in if extentLoc.loc_ghost then siblings else (txt, extentLoc, item) :: siblings in diff --git a/analysis/src/Hover.ml b/analysis/src/Hover.ml index 0ef1f4e43..fba9c2c09 100644 --- a/analysis/src/Hover.ml +++ b/analysis/src/Hover.ml @@ -39,15 +39,17 @@ let showModuleTopLevel ~docstring ~name in Some (doc ^ full) -let showModule ~docstring ~(file : SharedTypes.file) ~name +let rec showModule ~docstring ~(file : SharedTypes.file) ~name (declared : SharedTypes.moduleKind SharedTypes.declared option) = match declared with | None -> showModuleTopLevel ~docstring ~name file.contents.topLevel | Some {item = Structure {topLevel}} -> showModuleTopLevel ~docstring ~name topLevel - | Some {item = Constraint(Structure {topLevel}, _)} -> - showModuleTopLevel ~docstring ~name topLevel - | Some _ -> Some "Unable to resolve module reference" + | Some ({item = Constraint (_, moduleType)} as declared) -> + (* show the interface *) + showModule ~docstring ~file ~name (Some {declared with item = moduleType}) + | Some {item = Ident path} -> + Some ("Unable to resolve module reference " ^ Path.name path) let newHover ~(file : SharedTypes.file) ~package locItem = match locItem.SharedTypes.locType with diff --git a/analysis/src/ProcessCmt.ml b/analysis/src/ProcessCmt.ml index 76d9a1849..4d418869f 100644 --- a/analysis/src/ProcessCmt.ml +++ b/analysis/src/ProcessCmt.ml @@ -425,12 +425,12 @@ and forModule env mod_desc moduleName = forModule env expr.mod_desc moduleName | Tmod_constraint (expr, typ, _constraint, _coercion) -> (* TODO do this better I think *) - let forMod = forModule env expr.mod_desc moduleName in + let modKind = forModule env expr.mod_desc moduleName in let env = {env with modulePath = ExportedModule (moduleName, env.modulePath)} in - let forModTyp = forModuleType env typ in - Constraint (forMod, forModTyp) + let modTypeKind = forModuleType env typ in + Constraint (modKind, modTypeKind) and forStructure ~env items = let exported = initExported () in diff --git a/analysis/tests/src/Hover.res b/analysis/tests/src/Hover.res index 8a0c83d34..b86280aa5 100644 --- a/analysis/tests/src/Hover.res +++ b/analysis/tests/src/Hover.res @@ -52,6 +52,7 @@ module type Logger = { module JsLogger: Logger = { // ^hov let log = (msg: string) => Js.log(msg) + let _oneMore = 3 } module JJ = JsLogger diff --git a/analysis/tests/src/expected/Hover.res.txt b/analysis/tests/src/expected/Hover.res.txt index e6fdb5ad2..1bcc99002 100644 --- a/analysis/tests/src/expected/Hover.res.txt +++ b/analysis/tests/src/expected/Hover.res.txt @@ -29,8 +29,8 @@ Hover tests/src/Hover.res 44:10 {"contents": "```rescript\nint\n```"} Hover tests/src/Hover.res 51:7 -{"contents": "```rescript\nmodule JsLogger = {\n let log: string => unit\n}\n```"} +{"contents": "Unable to resolve module reference Logger"} -Definition tests/src/Hover.res 56:14 +Definition tests/src/Hover.res 57:14 {"uri": "Hover.res", "range": {"start": {"line": 51, "character": 7}, "end": {"line": 51, "character": 15}}} From a8c0de42bc6a02e9b57e941916f287ee4147aa06 Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Thu, 29 Apr 2021 02:11:14 +0200 Subject: [PATCH 04/10] Remove one constraint special case. --- analysis/src/ProcessCmt.ml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/analysis/src/ProcessCmt.ml b/analysis/src/ProcessCmt.ml index 4d418869f..6d3e08512 100644 --- a/analysis/src/ProcessCmt.ml +++ b/analysis/src/ProcessCmt.ml @@ -418,11 +418,6 @@ and forModule env mod_desc moduleName = {env with modulePath = ExportedModule (moduleName, env.modulePath)} in forModuleType env moduleType - | Tmod_constraint (expr, _typ, Tmodtype_implicit, Tcoerce_structure _) -> - (* implicit contraint synthesized during typechecking *) - (* e.g. when the same id is defined twice (e.g. make with @react.component) *) - (* skip the constraint and use the original module definition *) - forModule env expr.mod_desc moduleName | Tmod_constraint (expr, typ, _constraint, _coercion) -> (* TODO do this better I think *) let modKind = forModule env expr.mod_desc moduleName in From 66a31b7f966943815aeb77fa834a2a8a0b38cf5e Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Thu, 29 Apr 2021 02:15:21 +0200 Subject: [PATCH 05/10] Add example of id redefined. --- analysis/tests/src/Hover.res | 8 ++++++++ analysis/tests/src/expected/Hover.res.txt | 3 +++ 2 files changed, 11 insertions(+) diff --git a/analysis/tests/src/Hover.res b/analysis/tests/src/Hover.res index b86280aa5..c1f79da33 100644 --- a/analysis/tests/src/Hover.res +++ b/analysis/tests/src/Hover.res @@ -57,3 +57,11 @@ module JsLogger: Logger = { module JJ = JsLogger // ^def + + +module IdDefinedTwice = { +// ^hov + let x = 10 + let y = 20 + let x = 10 +} \ No newline at end of file diff --git a/analysis/tests/src/expected/Hover.res.txt b/analysis/tests/src/expected/Hover.res.txt index 1bcc99002..6dbf1e5f8 100644 --- a/analysis/tests/src/expected/Hover.res.txt +++ b/analysis/tests/src/expected/Hover.res.txt @@ -34,3 +34,6 @@ Hover tests/src/Hover.res 51:7 Definition tests/src/Hover.res 57:14 {"uri": "Hover.res", "range": {"start": {"line": 51, "character": 7}, "end": {"line": 51, "character": 15}}} +Hover tests/src/Hover.res 61:9 +{"contents": "```rescript\nmodule IdDefindeTwice = {\n let x: int\n let y: int\n let x: int\n}\n```"} + From 6e57d84132c6ac37a6328fdb74a0e9943f90aea3 Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Thu, 29 Apr 2021 02:23:30 +0200 Subject: [PATCH 06/10] Clean up module references. --- analysis/src/ProcessCmt.ml | 2 +- analysis/src/References.ml | 7 ++++--- analysis/tests/src/expected/Hover.res.txt | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/analysis/src/ProcessCmt.ml b/analysis/src/ProcessCmt.ml index 6d3e08512..867c66298 100644 --- a/analysis/src/ProcessCmt.ml +++ b/analysis/src/ProcessCmt.ml @@ -634,7 +634,7 @@ and findInModule ~env kind path = match kind with | Structure {exported} -> resolvePathInner ~env:{env with qExported = exported} ~path - | Constraint (_, k) -> findInModule ~env k path + | Constraint (_, moduleTypeKind) -> findInModule ~env moduleTypeKind path | Ident modulePath -> ( let stamp, moduleName, fullPath = joinPaths modulePath path in if stamp = 0 then Some (`Global (moduleName, fullPath)) diff --git a/analysis/src/References.ml b/analysis/src/References.ml index f23628208..8b8477101 100644 --- a/analysis/src/References.ml +++ b/analysis/src/References.ml @@ -194,11 +194,12 @@ let alternateDeclared ~file ~package declared tip = | Some declared -> Some (file, extra, declared))) | _ -> None) -let resolveModuleReference ~file ~package (declared : moduleKind declared) = +let rec resolveModuleReference ~file ~package (declared : moduleKind declared) = match declared.item with | Structure _ -> Some (file, Some declared) - | Constraint ((Structure _ | Constraint _), _) -> Some (file, Some declared) - | Ident path | Constraint (Ident path, _) -> ( + | Constraint (moduleItem, _moduleTypeItem) -> + resolveModuleReference ~file ~package {declared with item = moduleItem} + | Ident path -> ( let env = ProcessCmt.fileEnv file in match ProcessCmt.fromCompilerPath ~env path with | `Not_found -> None diff --git a/analysis/tests/src/expected/Hover.res.txt b/analysis/tests/src/expected/Hover.res.txt index 6dbf1e5f8..fd4a947b7 100644 --- a/analysis/tests/src/expected/Hover.res.txt +++ b/analysis/tests/src/expected/Hover.res.txt @@ -29,11 +29,11 @@ Hover tests/src/Hover.res 44:10 {"contents": "```rescript\nint\n```"} Hover tests/src/Hover.res 51:7 -{"contents": "Unable to resolve module reference Logger"} +{"contents": "```rescript\nmodule JsLogger = {\n let log: string => unit\n let _oneMore: int\n}\n```"} Definition tests/src/Hover.res 57:14 {"uri": "Hover.res", "range": {"start": {"line": 51, "character": 7}, "end": {"line": 51, "character": 15}}} Hover tests/src/Hover.res 61:9 -{"contents": "```rescript\nmodule IdDefindeTwice = {\n let x: int\n let y: int\n let x: int\n}\n```"} +{"contents": "```rescript\nmodule IdDefinedTwice = {\n let x: int\n let y: int\n let x: int\n}\n```"} From 84def2fa852698de1faf0193683662e145f613bd Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Thu, 29 Apr 2021 02:31:04 +0200 Subject: [PATCH 07/10] Add example showing transitive module resolution is missing. --- analysis/tests/src/Hover.res | 10 +++++++++- analysis/tests/src/expected/Hover.res.txt | 6 ++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/analysis/tests/src/Hover.res b/analysis/tests/src/Hover.res index c1f79da33..cbb1386c8 100644 --- a/analysis/tests/src/Hover.res +++ b/analysis/tests/src/Hover.res @@ -64,4 +64,12 @@ module IdDefinedTwice = { let x = 10 let y = 20 let x = 10 -} \ No newline at end of file +} + +module A = {let x=13} + +module B = A +// ^hov + +module C = B +// ^hov diff --git a/analysis/tests/src/expected/Hover.res.txt b/analysis/tests/src/expected/Hover.res.txt index fd4a947b7..d1adcca9d 100644 --- a/analysis/tests/src/expected/Hover.res.txt +++ b/analysis/tests/src/expected/Hover.res.txt @@ -37,3 +37,9 @@ Definition tests/src/Hover.res 57:14 Hover tests/src/Hover.res 61:9 {"contents": "```rescript\nmodule IdDefinedTwice = {\n let x: int\n let y: int\n let x: int\n}\n```"} +Hover tests/src/Hover.res 70:7 +{"contents": "```rescript\nmodule A = {\n let x: int\n}\n```"} + +Hover tests/src/Hover.res 73:7 +{"contents": "Unable to resolve module reference A"} + From f97f62d6cd02d8166e4d826908485beb73114b0c Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Thu, 29 Apr 2021 02:37:01 +0200 Subject: [PATCH 08/10] Example: currently no hover on module type. --- analysis/tests/src/Hover.res | 1 + analysis/tests/src/expected/Hover.res.txt | 15 +++++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/analysis/tests/src/Hover.res b/analysis/tests/src/Hover.res index cbb1386c8..500d51f82 100644 --- a/analysis/tests/src/Hover.res +++ b/analysis/tests/src/Hover.res @@ -46,6 +46,7 @@ let num = 34 // ^hov module type Logger = { +// ^hov let log: string => unit } diff --git a/analysis/tests/src/expected/Hover.res.txt b/analysis/tests/src/expected/Hover.res.txt index d1adcca9d..d3c74c631 100644 --- a/analysis/tests/src/expected/Hover.res.txt +++ b/analysis/tests/src/expected/Hover.res.txt @@ -28,18 +28,21 @@ Hover tests/src/Hover.res 41:13 Hover tests/src/Hover.res 44:10 {"contents": "```rescript\nint\n```"} -Hover tests/src/Hover.res 51:7 +Hover tests/src/Hover.res 47:13 +null + +Hover tests/src/Hover.res 52:7 {"contents": "```rescript\nmodule JsLogger = {\n let log: string => unit\n let _oneMore: int\n}\n```"} -Definition tests/src/Hover.res 57:14 -{"uri": "Hover.res", "range": {"start": {"line": 51, "character": 7}, "end": {"line": 51, "character": 15}}} +Definition tests/src/Hover.res 58:14 +{"uri": "Hover.res", "range": {"start": {"line": 52, "character": 7}, "end": {"line": 52, "character": 15}}} -Hover tests/src/Hover.res 61:9 +Hover tests/src/Hover.res 62:9 {"contents": "```rescript\nmodule IdDefinedTwice = {\n let x: int\n let y: int\n let x: int\n}\n```"} -Hover tests/src/Hover.res 70:7 +Hover tests/src/Hover.res 71:7 {"contents": "```rescript\nmodule A = {\n let x: int\n}\n```"} -Hover tests/src/Hover.res 73:7 +Hover tests/src/Hover.res 74:7 {"contents": "Unable to resolve module reference A"} From b4032df8b3f453acce4441dcf8390bfda6953d3d Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Thu, 29 Apr 2021 02:52:07 +0200 Subject: [PATCH 09/10] Handle mod type declarations. --- analysis/src/ProcessCmt.ml | 19 ++++++++++++++++++- analysis/tests/src/expected/Hover.res.txt | 2 +- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/analysis/src/ProcessCmt.ml b/analysis/src/ProcessCmt.ml index 867c66298..9c05b6e36 100644 --- a/analysis/src/ProcessCmt.ml +++ b/analysis/src/ProcessCmt.ml @@ -343,6 +343,24 @@ let rec forItem ~env ~(exported : exported) item = mb_attributes exported.modules env.stamps.modules in [{declared with item = Module declared.item}] + | Tstr_modtype + { + mtd_name = name; + mtd_id; + mtd_attributes; + mtd_type = Some {mty_type = modType}; + mtd_loc; + } -> + let env = + {env with modulePath = ExportedModule (name.txt, env.modulePath)} + in + let modTypeItem = forModuleType env modType in + let declared = + addItem ~item:modTypeItem ~name ~extent:mtd_loc + ~stamp:(Ident.binding_time mtd_id) + ~env mtd_attributes exported.modules env.stamps.modules + in + [{declared with item = Module modTypeItem}] | Tstr_include {incl_mod; incl_type} -> let env = match getModulePath incl_mod.mod_desc with @@ -375,7 +393,6 @@ let rec forItem ~env ~(exported : exported) item = | _ -> Types.Trec_next in decl |> forTypeDeclaration ~env ~exported ~recStatus) - | Tstr_modtype _ -> [] | _ -> [] and forModule env mod_desc moduleName = diff --git a/analysis/tests/src/expected/Hover.res.txt b/analysis/tests/src/expected/Hover.res.txt index d3c74c631..87f223e28 100644 --- a/analysis/tests/src/expected/Hover.res.txt +++ b/analysis/tests/src/expected/Hover.res.txt @@ -29,7 +29,7 @@ Hover tests/src/Hover.res 44:10 {"contents": "```rescript\nint\n```"} Hover tests/src/Hover.res 47:13 -null +{"contents": "```rescript\nmodule Logger = {\n let log: string => unit\n}\n```"} Hover tests/src/Hover.res 52:7 {"contents": "```rescript\nmodule JsLogger = {\n let log: string => unit\n let _oneMore: int\n}\n```"} From 7706e64df69b091bfe76474d5a8aa5828465101b Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Thu, 29 Apr 2021 02:55:18 +0200 Subject: [PATCH 10/10] Use module type to resolve references. --- analysis/src/Hover.ml | 5 +++-- analysis/src/References.ml | 4 ++-- analysis/tests/src/expected/Hover.res.txt | 6 +++--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/analysis/src/Hover.ml b/analysis/src/Hover.ml index fba9c2c09..c08f4f11f 100644 --- a/analysis/src/Hover.ml +++ b/analysis/src/Hover.ml @@ -45,9 +45,10 @@ let rec showModule ~docstring ~(file : SharedTypes.file) ~name | None -> showModuleTopLevel ~docstring ~name file.contents.topLevel | Some {item = Structure {topLevel}} -> showModuleTopLevel ~docstring ~name topLevel - | Some ({item = Constraint (_, moduleType)} as declared) -> + | Some ({item = Constraint (_moduleItem, moduleTypeItem)} as declared) -> (* show the interface *) - showModule ~docstring ~file ~name (Some {declared with item = moduleType}) + showModule ~docstring ~file ~name + (Some {declared with item = moduleTypeItem}) | Some {item = Ident path} -> Some ("Unable to resolve module reference " ^ Path.name path) diff --git a/analysis/src/References.ml b/analysis/src/References.ml index 8b8477101..c64199797 100644 --- a/analysis/src/References.ml +++ b/analysis/src/References.ml @@ -197,8 +197,8 @@ let alternateDeclared ~file ~package declared tip = let rec resolveModuleReference ~file ~package (declared : moduleKind declared) = match declared.item with | Structure _ -> Some (file, Some declared) - | Constraint (moduleItem, _moduleTypeItem) -> - resolveModuleReference ~file ~package {declared with item = moduleItem} + | Constraint (_moduleItem, moduleTypeItem) -> + resolveModuleReference ~file ~package {declared with item = moduleTypeItem} | Ident path -> ( let env = ProcessCmt.fileEnv file in match ProcessCmt.fromCompilerPath ~env path with diff --git a/analysis/tests/src/expected/Hover.res.txt b/analysis/tests/src/expected/Hover.res.txt index 87f223e28..4891f2bc0 100644 --- a/analysis/tests/src/expected/Hover.res.txt +++ b/analysis/tests/src/expected/Hover.res.txt @@ -32,13 +32,13 @@ Hover tests/src/Hover.res 47:13 {"contents": "```rescript\nmodule Logger = {\n let log: string => unit\n}\n```"} Hover tests/src/Hover.res 52:7 -{"contents": "```rescript\nmodule JsLogger = {\n let log: string => unit\n let _oneMore: int\n}\n```"} +{"contents": "```rescript\nmodule Logger = {\n let log: string => unit\n}\n```"} Definition tests/src/Hover.res 58:14 -{"uri": "Hover.res", "range": {"start": {"line": 52, "character": 7}, "end": {"line": 52, "character": 15}}} +{"uri": "Hover.res", "range": {"start": {"line": 47, "character": 12}, "end": {"line": 47, "character": 18}}} Hover tests/src/Hover.res 62:9 -{"contents": "```rescript\nmodule IdDefinedTwice = {\n let x: int\n let y: int\n let x: int\n}\n```"} +{"contents": "```rescript\nmodule IdDefinedTwice = {\n let y: int\n let x: int\n}\n```"} Hover tests/src/Hover.res 71:7 {"contents": "```rescript\nmodule A = {\n let x: int\n}\n```"}