Skip to content

Conversation

@liam923
Copy link
Contributor

@liam923 liam923 commented Jan 8, 2025

Currently Merlin's locate query uses a digest of the contents of a file to disambiguate files with the same name. If two files have the same digest, one is arbitrarily chosen. This can lead to Merlin confusing two files with identical contents. (See test case demonstrating the issue in the first commit.)

This PR resolves this issue by using a heuristic when multiple digests match. In a nutshell, it chooses the file whose path is most similar to the path of the build artifact it is trying to be matched to. See the comment in locate.ml for more detail.

@voodoos
Copy link
Collaborator

voodoos commented Jan 9, 2025

Thanks Liam, I will have a look.

Copy link
Collaborator

@voodoos voodoos left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks Liam, looks like a nice improvement for that corner case.
I am a bit worried about the leaking exception but apart from that the changes looks good to me.

@voodoos
Copy link
Collaborator

voodoos commented Feb 3, 2025

Thanks !

@voodoos voodoos merged commit 834821e into ocaml:main Feb 3, 2025
5 checks passed
@liam923 liam923 deleted the distinguish-files branch February 3, 2025 22:23
voodoos added a commit to voodoos/opam-repository that referenced this pull request Jun 24, 2025
CHANGES:

Tue Jun 24 16:10:42 CEST 2025

  + merlin library
    - Expose utilities to manipulate typed-holes in `Merlin_analysis.Typed_hole`
      (ocaml/merlin#1888)
    - `locate` can now disambiguate between files with identical names and contents
      (ocaml/merlin#1882)
    - `occurrences` now reports stale files (ocaml/merlin#1885)
    - `inlay-hints` fix inlay hints on function parameters (ocaml/merlin#1923)
    - Fix issues with ident validation and Lid comparison for occurrences (ocaml/merlin#1924)
    - Handle class type in outline (ocaml/merlin#1932)
    - Handle locally defined value in outline (ocaml/merlin#1936)
    - Fix a typer issue triggering assertions in the short-paths graph (ocaml/merlin#1935,
      fixes ocaml/merlin#1913)
    - Downstreamed a typer fix from 5.3.X that would trigger assertions linked
      to scopes bit masks when backtracking the typer cache (ocaml/merlin#1935)
    - Add a new selection field to outline results that contains the location of
      the symbol itself. (ocaml/merlin#1942)
    - Fix destruct hanging when printing patterns with (::). (ocaml/merlin#1944, fixes
      ocaml/ocaml-lsp#1489)
    - Reproduce and fix a handful of jump-to-definition (locate) issues  (ocaml/merlin#1930,
      fixes ocaml/merlin#1580 and ocaml/merlin#1588, workaround for ocaml/merlin#1934)
  + ocaml-index
    - Improve the granularity of index reading by segmenting the marshalization
      of the involved data-structures. (ocaml/merlin#1889)
  + test suite
    - Add a test case illustrating wrong open order proposed in issue ocaml/merlin#1900. (ocaml/merlin#1901)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Planned for backporting
Status: Planned for backporting

Development

Successfully merging this pull request may close these issues.

2 participants