diff --git a/CHANGES.md b/CHANGES.md index 05fb185885..cc5c146c44 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,8 @@ unreleased + merlin binary - Update internal typer to match OCaml 4.14.1 release. (#1557) + - Improve type-enclosing behaviour when used on records' labels (#1565, + fixes #1564) merlin 4.7 ========== diff --git a/src/analysis/type_enclosing.ml b/src/analysis/type_enclosing.ml index a228241cd8..3f5a714aef 100644 --- a/src/analysis/type_enclosing.ml +++ b/src/analysis/type_enclosing.ml @@ -102,6 +102,11 @@ let from_reconstructed ~nodes ~cursor ~verbosity exprs = let ppf, to_string = Format.to_string () in Type_utils.print_constr ~verbosity env ppf cd; Some (loc, String (to_string ()), `No) + | Some (Context.Label { lbl_name; lbl_arg; _ }) -> + log ~title:"from_reconstructed" "ctx: label %s" lbl_name; + let ppf, to_string = Format.to_string () in + Type_utils.print_type_with_decl ~verbosity env ppf lbl_arg; + Some (loc, String (to_string ()), `No) | Some Context.Constant -> None | _ -> let context = Option.value ~default:Context.Expr context in diff --git a/tests/test-dirs/type-enclosing/issue1564.t b/tests/test-dirs/type-enclosing/issue1564.t new file mode 100644 index 0000000000..6d30cb7c16 --- /dev/null +++ b/tests/test-dirs/type-enclosing/issue1564.t @@ -0,0 +1,53 @@ + $ cat >main.ml < module Kind = struct + > type t = + > | A + > | B + > end + > type t = { kind : Kind.t } + > let x = { kind = A } + > let y = x.kind + > let z = { kind = B }.kind + > EOF + +On `let |y = x.kind` +Verbosity 0 stops at Kind.t + $ $MERLIN single type-enclosing -position 8:4 -verbosity 0 \ + > -filename ./main.ml < ./main.ml | tr '\r\n' ' ' | jq ".value[0].type" + "Kind.t" + +On `let |y = x.kind` +Verbosity 1 shows the actual type definition of Kind.t + $ $MERLIN single type-enclosing -position 8:4 -verbosity 1 \ + > -filename ./main.ml < ./main.ml | tr '\r\n' ' ' | jq ".value[0].type" + "type t = A | B" + +On `let y = x.k|ind` + $ $MERLIN single type-enclosing -position 8:11 -verbosity 0 \ + > -filename ./main.ml < ./main.ml | tr '\r\n' ' ' | jq ".value[0].type" + "Kind.t" + +On `let y = x.k|ind` + $ $MERLIN single type-enclosing -position 8:11 -verbosity 1 \ + > -filename ./main.ml < ./main.ml | tr '\r\n' ' ' | jq ".value[0].type" + "type t = A | B" + +On `let z = { kind = B }.k|ind` + $ $MERLIN single type-enclosing -position 9:22 -verbosity 0 \ + > -filename ./main.ml < ./main.ml | tr '\r\n' ' ' | jq ".value[0].type" + "Kind.t" + +On `let z = { kind = B }.k|ind` + $ $MERLIN single type-enclosing -position 9:22 -verbosity 1 \ + > -filename ./main.ml < ./main.ml | tr '\r\n' ' ' | jq ".value[0].type" + "type t = A | B" + +On `let x = { k|ind = A }` + $ $MERLIN single type-enclosing -position 7:12 -verbosity 0 \ + > -filename ./main.ml < ./main.ml | tr '\r\n' ' ' | jq ".value[0].type" + "Kind.t" + +On `let x = { k|ind = A }` + $ $MERLIN single type-enclosing -position 7:12 -verbosity 1 \ + > -filename ./main.ml < ./main.ml | tr '\r\n' ' ' | jq ".value[0].type" + "type t = A | B" diff --git a/tests/test-dirs/type-enclosing/record.t/run.t b/tests/test-dirs/type-enclosing/record.t/run.t index 56cafdf60e..aee28c9d48 100644 --- a/tests/test-dirs/type-enclosing/record.t/run.t +++ b/tests/test-dirs/type-enclosing/record.t/run.t @@ -231,7 +231,7 @@ FIXME: The following results are not entirely satisfying (`foo.Bar -> foo` could "line": 12, "col": 18 }, - "type": "unit", + "type": "type unit = ()", "tail": "no" }, {