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