diff --git a/CHANGELOG.md b/CHANGELOG.md
index d972b6fbb..4a333dc50 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 from implementation files which also happen to have interface files https://github.com/rescript-lang/rescript-vscode/issues/645
+
## v1.8.2
#### :rocket: New Feature
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/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 959a7b235..b3762e0b6 100644
--- a/analysis/tests/src/References.res
+++ b/analysis/tests/src/References.res
@@ -19,4 +19,7 @@ module M: {
let bb = M.aa
let cc = bb
let dd = M.aa
-// ^ref
\ No newline at end of file
+// ^ref
+
+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}}}
+]
+
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/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