Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

case-analysis fails to load module #1786

Open
liam923 opened this issue Jun 17, 2024 · 2 comments
Open

case-analysis fails to load module #1786

liam923 opened this issue Jun 17, 2024 · 2 comments
Assignees
Labels

Comments

@liam923
Copy link
Contributor

liam923 commented Jun 17, 2024

See the below cram test:

Create the types Box.t and Either.t, each of which are in their own module and file.
Box.t depends on Either.t.

  $ cat >either.ml <<EOF
  > type t = Left | Right
  > EOF

  $ cat >box.ml <<EOF
  > type t = Box of Either.t
  > EOF

  $ $OCAMLC either.ml box.ml

Create the file that we'll use to demonstrate the error

  $ touch foo.ml

In Persistent_env.find_pers_struct, the module Either fails to be found:

  $ $MERLIN single case-analysis -start 3:8 -end 3:8 -filename foo.ml <<EOF
  > let f (x : Box.t) =
  >   match x with
  >   | Box _ -> 10
  > EOF
  {
    "class": "exception",
    "value": "Not_found
  Raised at Ocaml_typing__Persistent_env.find_pers_struct in file \"src/ocaml/typing/persistent_env.ml\", line 259, characters 28-43
  Called from Ocaml_typing__Persistent_env.find in file \"src/ocaml/typing/persistent_env.ml\", line 309, characters 6-59
  Called from Ocaml_typing__Env.find_module_components in file \"src/ocaml/typing/env.ml\", line 1100, characters 17-43
  Called from Ocaml_typing__Env.find_structure_components in file \"src/ocaml/typing/env.ml\", line 1111, characters 23-56
  Called from Ocaml_typing__Env.find_type_data in file \"src/ocaml/typing/env.ml\", line 1211, characters 19-50
  Called from Ocaml_typing__Env.find_type_descrs in file \"src/ocaml/typing/env.ml\", line 1275, characters 2-24
  Called from Merlin_analysis__Destruct.gen_patterns in file \"src/analysis/destruct.ml\", line 102, characters 16-45
  Called from Merlin_analysis__Destruct.refine_complete_match in file \"src/analysis/destruct.ml\", line 675, characters 18-56
  Called from Merlin_utils__Misc.try_finally in file \"src/utils/misc.ml\", line 45, characters 8-15
  Re-raised at Merlin_utils__Misc.try_finally in file \"src/utils/misc.ml\", line 62, characters 10-24
  Called from Merlin_utils__Misc.protect_refs.(fun) in file \"src/utils/misc.ml\", line 82, characters 10-14
  Re-raised at Merlin_utils__Misc.protect_refs.(fun) in file \"src/utils/misc.ml\", line 84, characters 38-45
  Called from Ocaml_typing__Persistent_env.without_cmis in file \"src/ocaml/typing/persistent_env.ml\", lines 156-158, characters 10-27
  Called from Merlin_utils__Std.let_ref in file \"src/utils/std.ml\", line 695, characters 8-12
  Re-raised at Merlin_utils__Std.let_ref in file \"src/utils/std.ml\", line 697, characters 30-39
  Called from Merlin_commands__New_commands.run in file \"src/commands/new_commands.ml\", line 93, characters 15-53
  Called from Merlin_utils__Std.let_ref in file \"src/utils/std.ml\", line 695, characters 8-12
  Re-raised at Merlin_utils__Std.let_ref in file \"src/utils/std.ml\", line 697, characters 30-39
  Called from Merlin_utils__Misc.try_finally in file \"src/utils/misc.ml\", line 45, characters 8-15
  Re-raised at Merlin_utils__Misc.try_finally in file \"src/utils/misc.ml\", line 62, characters 10-24
  Called from Stdlib__Fun.protect in file \"fun.ml\", line 34, characters 8-15
  Re-raised at Stdlib__Fun.protect in file \"fun.ml\", line 39, characters 6-52
  Called from Merlin_kernel__Mocaml.with_state in file \"src/kernel/mocaml.ml\", line 18, characters 8-38
  Re-raised at Merlin_kernel__Mocaml.with_state in file \"src/kernel/mocaml.ml\", line 20, characters 42-53
  Called from Dune__exe__New_merlin.run.(fun) in file \"src/frontend/ocamlmerlin/new/new_merlin.ml\", lines 106-107, characters 14-50
  ",
    "notifications": []
  }

If we explicitly use Either (by opening it), we force it to load and the query works
as expected:

  $ $MERLIN single case-analysis -start 4:8 -end 4:8 -filename foo.ml <<EOF
  > open Either
  > let f (x : Box.t) =
  >   match x with
  >   | Box _ -> 10
  > EOF
  {
    "class": "return",
    "value": [
      {
        "start": {
          "line": 4,
          "col": 4
        },
        "end": {
          "line": 4,
          "col": 9
        }
      },
      "Box (Left) | Box (Right)"
    ],
    "notifications": []
  }

Merlin version: b602e95e (master)

@voodoos
Copy link
Collaborator

voodoos commented Jun 18, 2024

Thanks for the report and the reproduction @liam923
It's an interesting corner-case... cc @xvw since it concerns destruct (even if not the core of it's logic).

@xvw
Copy link
Collaborator

xvw commented Jun 18, 2024

Interesting ! Thanks ! I'll take a look soon!

@xvw xvw self-assigned this Jul 2, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants