From 408ee77bf56ee082e396c8bd39c0322799d0fe57 Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Wed, 7 Dec 2022 16:30:38 +0100 Subject: [PATCH 1/5] Fix issue with references to elements defined in an interface file Fixes https://github.com/rescript-lang/rescript-vscode/issues/645 --- CHANGELOG.md | 2 ++ analysis/src/Commands.ml | 8 +++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d972b6fbb..3d2c5c75f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,8 @@ - Fix issue with references to elements defined in an interface file https://github.com/rescript-lang/rescript-vscode/pull/646 +- Fix issue with references to elements defined in an interface file https://github.com/rescript-lang/rescript-vscode/issues/645 + ## v1.8.2 #### :rocket: New Feature diff --git a/analysis/src/Commands.ml b/analysis/src/Commands.ml index 756c6fb43..7baa0892e 100644 --- a/analysis/src/Commands.ml +++ b/analysis/src/Commands.ml @@ -172,9 +172,11 @@ let references ~path ~pos ~debug = | Some loc -> loc | None -> Uri.toTopLevelLoc uri2 in - Protocol.stringifyLocation - {uri = Uri.toString uri2; range = Utils.cmtLocToRange loc} - :: acc) + if loc.loc_ghost then acc + else + Protocol.stringifyLocation + {uri = Uri.toString uri2; range = Utils.cmtLocToRange loc} + :: acc) []) in print_endline From 8163532f8229830a37b90b6c17a3a0e828d85d57 Mon Sep 17 00:00:00 2001 From: Pedro Castro Date: Mon, 12 Dec 2022 19:45:46 -0300 Subject: [PATCH 2/5] testing references with interface --- analysis/tests/src/References.res | 3 ++- analysis/tests/src/inner/ComponentInner.res | 2 ++ analysis/tests/src/inner/ComponentInner.resi | 2 ++ analysis/tests/src/inner/MoreInnerReferences.res | 2 ++ analysis/tests/src/inner/ReferencesInner.res | 2 ++ analysis/tests/src/inner/ReferencesInner.resi | 2 ++ 6 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 analysis/tests/src/inner/ComponentInner.res create mode 100644 analysis/tests/src/inner/ComponentInner.resi create mode 100644 analysis/tests/src/inner/MoreInnerReferences.res create mode 100644 analysis/tests/src/inner/ReferencesInner.res create mode 100644 analysis/tests/src/inner/ReferencesInner.resi diff --git a/analysis/tests/src/References.res b/analysis/tests/src/References.res index 959a7b235..b3a20321b 100644 --- a/analysis/tests/src/References.res +++ b/analysis/tests/src/References.res @@ -19,4 +19,5 @@ module M: { let bb = M.aa let cc = bb let dd = M.aa -// ^ref \ No newline at end of file +// ^ref +let _ = \ No newline at end of file diff --git a/analysis/tests/src/inner/ComponentInner.res b/analysis/tests/src/inner/ComponentInner.res new file mode 100644 index 000000000..aa3f50cb0 --- /dev/null +++ b/analysis/tests/src/inner/ComponentInner.res @@ -0,0 +1,2 @@ +@react.component +let make = () => React.null diff --git a/analysis/tests/src/inner/ComponentInner.resi b/analysis/tests/src/inner/ComponentInner.resi new file mode 100644 index 000000000..1ca44ce26 --- /dev/null +++ b/analysis/tests/src/inner/ComponentInner.resi @@ -0,0 +1,2 @@ +@react.component +let make: unit => React.element diff --git a/analysis/tests/src/inner/MoreInnerReferences.res b/analysis/tests/src/inner/MoreInnerReferences.res new file mode 100644 index 000000000..9ebb2c53f --- /dev/null +++ b/analysis/tests/src/inner/MoreInnerReferences.res @@ -0,0 +1,2 @@ +let _ = +// ^ref \ No newline at end of file diff --git a/analysis/tests/src/inner/ReferencesInner.res b/analysis/tests/src/inner/ReferencesInner.res new file mode 100644 index 000000000..261d0b396 --- /dev/null +++ b/analysis/tests/src/inner/ReferencesInner.res @@ -0,0 +1,2 @@ +@react.component +let make = () => \ No newline at end of file diff --git a/analysis/tests/src/inner/ReferencesInner.resi b/analysis/tests/src/inner/ReferencesInner.resi new file mode 100644 index 000000000..1ca44ce26 --- /dev/null +++ b/analysis/tests/src/inner/ReferencesInner.resi @@ -0,0 +1,2 @@ +@react.component +let make: unit => React.element From b9a15a2093aa2e5b5b4c4e29683f093f2d27fd54 Mon Sep 17 00:00:00 2001 From: Pedro Castro Date: Mon, 12 Dec 2022 19:53:52 -0300 Subject: [PATCH 3/5] simplify testing references with interface --- analysis/tests/src/inner/MoreInnerReferences.res | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 analysis/tests/src/inner/MoreInnerReferences.res diff --git a/analysis/tests/src/inner/MoreInnerReferences.res b/analysis/tests/src/inner/MoreInnerReferences.res deleted file mode 100644 index 9ebb2c53f..000000000 --- a/analysis/tests/src/inner/MoreInnerReferences.res +++ /dev/null @@ -1,2 +0,0 @@ -let _ = -// ^ref \ No newline at end of file From 25e841112fb035eb1c96afefc7e8f3ef5ba336ff Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Tue, 13 Dec 2022 10:24:43 +0100 Subject: [PATCH 4/5] Find references in both .res and .resi files. --- analysis/src/Cmt.ml | 8 ++-- analysis/src/Commands.ml | 8 ++-- analysis/src/References.ml | 40 +++++++++---------- analysis/src/SharedTypes.ml | 6 +++ analysis/tests/src/References.res | 4 +- .../tests/src/expected/References.res.txt | 10 +++++ 6 files changed, 44 insertions(+), 32 deletions(-) diff --git a/analysis/src/Cmt.ml b/analysis/src/Cmt.ml index 5f5fc615d..be0e616a1 100644 --- a/analysis/src/Cmt.ml +++ b/analysis/src/Cmt.ml @@ -24,12 +24,12 @@ let fullFromUri ~uri = prerr_endline ("can't find module " ^ moduleName); None) -let fullFromModule ~package ~moduleName = +let fullsFromModule ~package ~moduleName = if Hashtbl.mem package.pathsForModule moduleName then let paths = Hashtbl.find package.pathsForModule moduleName in - let uri = getUri paths in - fullFromUri ~uri - else None + let uris = getUris paths in + uris |> List.filter_map (fun uri -> fullFromUri ~uri) + else [] let loadFullCmtFromPath ~path = let uri = Uri.fromPath path in diff --git a/analysis/src/Commands.ml b/analysis/src/Commands.ml index 7baa0892e..756c6fb43 100644 --- a/analysis/src/Commands.ml +++ b/analysis/src/Commands.ml @@ -172,11 +172,9 @@ let references ~path ~pos ~debug = | Some loc -> loc | None -> Uri.toTopLevelLoc uri2 in - if loc.loc_ghost then acc - else - Protocol.stringifyLocation - {uri = Uri.toString uri2; range = Utils.cmtLocToRange loc} - :: acc) + Protocol.stringifyLocation + {uri = Uri.toString uri2; range = Utils.cmtLocToRange loc} + :: acc) []) in print_endline diff --git a/analysis/src/References.ml b/analysis/src/References.ml index 649572499..fb730a83b 100644 --- a/analysis/src/References.ml +++ b/analysis/src/References.ml @@ -506,28 +506,24 @@ let forLocalStamp ~full:{file; extra; package} stamp (tip : Tip.t) = package.projectFiles |> FileSet.elements |> List.filter (fun name -> name <> file.moduleName) |> List.map (fun moduleName -> - match ProcessCmt.fileForModule ~package moduleName with - | None -> [] - | Some file -> ( - match Cmt.fullFromModule ~package ~moduleName with - | None -> [] - | Some {extra} -> ( - match - Hashtbl.find_opt extra.externalReferences - thisModuleName - with - | None -> [] - | Some refs -> - let locs = - refs - |> Utils.filterMap (fun (p, t, locs) -> - if p = path && t = tip then Some locs - else None) - in - locs - |> List.map (fun loc -> - {uri = file.uri; locOpt = Some loc})))) - |> List.concat + Cmt.fullsFromModule ~package ~moduleName + |> List.map (fun {file; extra} -> + match + Hashtbl.find_opt extra.externalReferences + thisModuleName + with + | None -> [] + | Some refs -> + let locs = + refs + |> Utils.filterMap (fun (p, t, locs) -> + if p = path && t = tip then Some locs + else None) + in + locs + |> List.map (fun loc -> + {uri = file.uri; locOpt = Some loc}))) + |> List.concat |> List.concat in alternativeReferences @ externals) else ( diff --git a/analysis/src/SharedTypes.ml b/analysis/src/SharedTypes.ml index 8ebe34b68..edf9f22af 100644 --- a/analysis/src/SharedTypes.ml +++ b/analysis/src/SharedTypes.ml @@ -295,6 +295,12 @@ let getUri p = | Namespace {cmt} -> Uri.fromPath cmt | IntfAndImpl {resi} -> Uri.fromPath resi +let getUris p = + match p with + | Impl {res} -> [Uri.fromPath res] + | Namespace {cmt} -> [Uri.fromPath cmt] + | IntfAndImpl {res; resi} -> [Uri.fromPath res; Uri.fromPath resi] + let getCmtPath ~uri p = match p with | Impl {cmt} -> cmt diff --git a/analysis/tests/src/References.res b/analysis/tests/src/References.res index b3a20321b..b3762e0b6 100644 --- a/analysis/tests/src/References.res +++ b/analysis/tests/src/References.res @@ -20,4 +20,6 @@ let bb = M.aa let cc = bb let dd = M.aa // ^ref -let _ = \ No newline at end of file + +let _ = +// ^ref \ No newline at end of file diff --git a/analysis/tests/src/expected/References.res.txt b/analysis/tests/src/expected/References.res.txt index ceaaeafb0..ea3108dae 100644 --- a/analysis/tests/src/expected/References.res.txt +++ b/analysis/tests/src/expected/References.res.txt @@ -21,3 +21,13 @@ References src/References.res 20:12 {"uri": "References.res", "range": {"start": {"line": 20, "character": 11}, "end": {"line": 20, "character": 13}}} ] +References src/References.res 23:15 +getLocItem #4: heuristic for within fragments: take make as makeProps does not work +the type is not great but jump to definition works +[ +{"uri": "ReferencesInner.res", "range": {"start": {"line": 1, "character": 28}, "end": {"line": 1, "character": 32}}}, +{"uri": "References.res", "range": {"start": {"line": 23, "character": 19}, "end": {"line": 23, "character": 23}}}, +{"uri": "ComponentInner.res", "range": {"start": {"line": 1, "character": 4}, "end": {"line": 1, "character": 8}}}, +{"uri": "ComponentInner.resi", "range": {"start": {"line": 1, "character": 4}, "end": {"line": 1, "character": 8}}} +] + From 13bc6a5b6ca4d8dac8b21e54bf718fe1f7081c95 Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Tue, 13 Dec 2022 19:31:44 +0100 Subject: [PATCH 5/5] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d2c5c75f..4a333dc50 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,7 +41,7 @@ - Fix issue with references to elements defined in an interface file https://github.com/rescript-lang/rescript-vscode/pull/646 -- Fix issue with references to elements defined in an interface file https://github.com/rescript-lang/rescript-vscode/issues/645 +- Fix issue with references from implementation files which also happen to have interface files https://github.com/rescript-lang/rescript-vscode/issues/645 ## v1.8.2