Skip to content

Commit

Permalink
let merlin work only if syntax doc is activated
Browse files Browse the repository at this point in the history
lint

change from italics to code pill

Completion for `in` keyword (ocaml#1217)

feat(auto-completion): auto-complete `in` (in a hacky way) in .ml files

Prepare release 1.17.0 (ocaml#1219)

* chore: restore lost version number in changes
     (erased in c8c1096)

* chore: bump version number in changes before release

Add flag to disable dune diagnostics (ocaml#1221)

* add config to control dune diagnostics

lint

update changelog
  • Loading branch information
PizieDust committed Mar 8, 2024
1 parent ae226ba commit 0ae0caf
Show file tree
Hide file tree
Showing 13 changed files with 375 additions and 106 deletions.
16 changes: 16 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,17 @@
# Unreleased

## Features

- Introduce a configuration option to control dune diagnostics. The option is
called `duneDiganostics` and it may be set to `{ enable: false }` to disable
diagnostics. (#1221)

- Includes a new optional/configurable option to toggle syntax documentation. If
toggled on, allows display of sytax documentation on hover tooltips. Can be
controlled via environment variables and by GUI for VS code. (#1218)

# 1.17.0

## Fixes

- Fix missing super & subscripts in markdown documentation. (#1170)
Expand Down Expand Up @@ -28,6 +40,8 @@
match cases, rec, and constructors (#1141)
- Add inlay hints for types on let bindings (#1159)

- Offer auto-completion for the keyword `in` (#1217)

# 1.16.2

## Fixes
Expand Down Expand Up @@ -106,6 +120,8 @@
[#941](https://github.com/ocaml/ocaml-lsp/issues/941),
[#1003](https://github.com/ocaml/ocaml-lsp/issues/1003))

# 1.15.0

## Features

- Enable [semantic highlighting](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_semanticTokens)
Expand Down
7 changes: 7 additions & 0 deletions ocaml-lsp-server/docs/ocamllsp/config.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,13 @@ interface config {
*/
codelens: { enable : boolean }

/**
* Enable/Disable Dune diagnostics
* @default true
* @since 1.18
*/
duneDiagnostics: { enable : boolean }

/**
* Enable/Disable Syntax Documentation
* @default false
Expand Down
26 changes: 25 additions & 1 deletion ocaml-lsp-server/src/compl.ml
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,23 @@ module Complete_by_prefix = struct
completion_entries
~f:(completionItem_of_completion_entry ~deprecated ~range ~compl_params)

let complete_keywords completion_position prefix =
match prefix with
| "" | "i" | "in" ->
let ci_for_in =
CompletionItem.create
~label:"in"
~textEdit:
(`TextEdit
(TextEdit.create
~newText:"in"
~range:(range_prefix completion_position prefix)))
~kind:CompletionItemKind.Keyword
()
in
[ ci_for_in ]
| _ -> []

let complete doc prefix pos ~deprecated ~resolve =
let+ (completion : Query_protocol.completions) =
let logical_pos = Position.logical pos in
Expand All @@ -166,7 +183,14 @@ module Complete_by_prefix = struct
doc
(dispatch_cmd ~prefix logical_pos)
in
process_dispatch_resp ~deprecated ~resolve doc pos completion
let keyword_completionItems =
(* we complete only keyword 'in' for now *)
match Document.Merlin.kind doc with
| Intf -> []
| Impl -> complete_keywords pos prefix
in
keyword_completionItems
@ process_dispatch_resp ~deprecated ~resolve doc pos completion
end

module Complete_with_construct = struct
Expand Down
187 changes: 111 additions & 76 deletions ocaml-lsp-server/src/config_data.ml
Original file line number Diff line number Diff line change
Expand Up @@ -365,23 +365,95 @@ module SyntaxDocumentation = struct
| Ppx_yojson_conv_lib.Option.None -> false
| Ppx_yojson_conv_lib.Option.Some v -> v)
}))
| _ as yojson ->
Ppx_yojson_conv_lib.Yojson_conv_error.record_list_instead_atom
_tp_loc
yojson
| _ as yojson ->
Ppx_yojson_conv_lib.Yojson_conv_error.record_list_instead_atom
_tp_loc
yojson
: Ppx_yojson_conv_lib.Yojson.Safe.t -> t)

let _ = t_of_yojson
let _ = t_of_yojson

let yojson_of_t =
(function
| { enable = v_enable } ->
let bnds : (string * Ppx_yojson_conv_lib.Yojson.Safe.t) list = [] in
let bnds =
let arg = yojson_of_bool v_enable in
("enable", arg) :: bnds
in
`Assoc bnds
| { enable = v_enable } ->
let bnds : (string * Ppx_yojson_conv_lib.Yojson.Safe.t) list = [] in
let bnds =
let arg = yojson_of_bool v_enable in
("enable", arg) :: bnds
in
`Assoc bnds
: t -> Ppx_yojson_conv_lib.Yojson.Safe.t)

let _ = yojson_of_t

[@@@end]
end

module DuneDiagnostics = struct
type t = { enable : bool [@default true] }
[@@deriving_inline yojson] [@@yojson.allow_extra_fields]

let _ = fun (_ : t) -> ()

let t_of_yojson =
(let _tp_loc = "ocaml-lsp-server/src/config_data.ml.DuneDiagnostics.t" in
function
| `Assoc field_yojsons as yojson -> (
let enable_field = ref Ppx_yojson_conv_lib.Option.None
and duplicates = ref []
and extra = ref [] in
let rec iter = function
| (field_name, _field_yojson) :: tail ->
(match field_name with
| "enable" -> (
match Ppx_yojson_conv_lib.( ! ) enable_field with
| Ppx_yojson_conv_lib.Option.None ->
let fvalue = bool_of_yojson _field_yojson in
enable_field := Ppx_yojson_conv_lib.Option.Some fvalue
| Ppx_yojson_conv_lib.Option.Some _ ->
duplicates := field_name :: Ppx_yojson_conv_lib.( ! ) duplicates)
| _ -> ());
iter tail
| [] -> ()
in
iter field_yojsons;
match Ppx_yojson_conv_lib.( ! ) duplicates with
| _ :: _ ->
Ppx_yojson_conv_lib.Yojson_conv_error.record_duplicate_fields
_tp_loc
(Ppx_yojson_conv_lib.( ! ) duplicates)
yojson
| [] -> (
match Ppx_yojson_conv_lib.( ! ) extra with
| _ :: _ ->
Ppx_yojson_conv_lib.Yojson_conv_error.record_extra_fields
_tp_loc
(Ppx_yojson_conv_lib.( ! ) extra)
yojson
| [] ->
let enable_value = Ppx_yojson_conv_lib.( ! ) enable_field in
{ enable =
(match enable_value with
| Ppx_yojson_conv_lib.Option.None -> true
| Ppx_yojson_conv_lib.Option.Some v -> v)
}))
| _ as yojson ->
Ppx_yojson_conv_lib.Yojson_conv_error.record_list_instead_atom
_tp_loc
yojson
: Ppx_yojson_conv_lib.Yojson.Safe.t -> t)

let _ = t_of_yojson

let yojson_of_t =
(function
| { enable = v_enable } ->
let bnds : (string * Ppx_yojson_conv_lib.Yojson.Safe.t) list = [] in
let bnds =
let arg = yojson_of_bool v_enable in
("enable", arg) :: bnds
in
`Assoc bnds
: t -> Ppx_yojson_conv_lib.Yojson.Safe.t)

let _ = yojson_of_t
Expand All @@ -395,9 +467,10 @@ module SyntaxDocumentation = struct

let _ = fun (_ : t) -> ()

let t_of_yojson =
let t_of_yojson =
(let _tp_loc =
"ocaml-lsp-server/src/config_data.ml.SyntaxDocumentation.t"

in
function
| `Assoc field_yojsons as yojson -> (
Expand Down Expand Up @@ -485,6 +558,7 @@ let t_of_yojson =
| `Assoc field_yojsons as yojson -> (
let codelens_field = ref Ppx_yojson_conv_lib.Option.None
and extended_hover_field = ref Ppx_yojson_conv_lib.Option.None
and dune_diagnostics_field = ref Ppx_yojson_conv_lib.Option.None
and syntax_documentation_field = ref Ppx_yojson_conv_lib.Option.None
and inlay_hints_field = ref Ppx_yojson_conv_lib.Option.None
and duplicates = ref []
Expand Down Expand Up @@ -512,28 +586,6 @@ let t_of_yojson =
extended_hover_field := Ppx_yojson_conv_lib.Option.Some fvalue
| Ppx_yojson_conv_lib.Option.Some _ ->
duplicates := field_name :: Ppx_yojson_conv_lib.( ! ) duplicates)
| "syntaxDocumentation" -> (
match Ppx_yojson_conv_lib.( ! ) syntax_documentation_field with
| Ppx_yojson_conv_lib.Option.None ->
let fvalue =
Json.Nullable_option.t_of_yojson
SyntaxDocumentation.t_of_yojson
_field_yojson
in
syntax_documentation_field := Ppx_yojson_conv_lib.Option.Some fvalue
| Ppx_yojson_conv_lib.Option.Some _ ->
duplicates := field_name :: Ppx_yojson_conv_lib.( ! ) duplicates)
| "inlayHints" -> (
match Ppx_yojson_conv_lib.( ! ) inlay_hints_field with
| Ppx_yojson_conv_lib.Option.None ->
let fvalue =
Json.Nullable_option.t_of_yojson
InlayHints.t_of_yojson
_field_yojson
in
inlay_hints_field := Ppx_yojson_conv_lib.Option.Some fvalue
| Ppx_yojson_conv_lib.Option.Some _ ->
duplicates := field_name :: Ppx_yojson_conv_lib.( ! ) duplicates)
| "duneDiagnostics" -> (
match Ppx_yojson_conv_lib.( ! ) dune_diagnostics_field with
| Ppx_yojson_conv_lib.Option.None ->
Expand All @@ -557,7 +609,18 @@ let t_of_yojson =
Ppx_yojson_conv_lib.Option.Some fvalue
| Ppx_yojson_conv_lib.Option.Some _ ->
duplicates := field_name :: Ppx_yojson_conv_lib.( ! ) duplicates)
| _ -> ());
| "duneDiagnostics" -> (
match Ppx_yojson_conv_lib.( ! ) dune_diagnostics_field with
| Ppx_yojson_conv_lib.Option.None ->
let fvalue =
Json.Nullable_option.t_of_yojson
DuneDiagnostics.t_of_yojson
_field_yojson
in
dune_diagnostics_field := Ppx_yojson_conv_lib.Option.Some fvalue
| Ppx_yojson_conv_lib.Option.Some _ ->
duplicates := field_name :: Ppx_yojson_conv_lib.( ! ) duplicates)
| _ -> ());
iter tail
| [] -> ()
in
Expand All @@ -576,15 +639,12 @@ let t_of_yojson =
(Ppx_yojson_conv_lib.( ! ) extra)
yojson
| [] ->
let ( ( codelens_value
, extended_hover_value, syntax_documentation_value
, inlay_hints_value
let ( codelens_value
, extended_hover_value
, dune_diagnostics_value
, syntax_documentation_value ) ) =
, syntax_documentation_value ) =
( Ppx_yojson_conv_lib.( ! ) codelens_field
, Ppx_yojson_conv_lib.( ! ) extended_hover_field
, Ppx_yojson_conv_lib.( ! ) syntax_documentation_field
, Ppx_yojson_conv_lib.( ! ) inlay_hints_field
, Ppx_yojson_conv_lib.( ! ) dune_diagnostics_field
, Ppx_yojson_conv_lib.( ! ) syntax_documentation_field )
in
Expand All @@ -596,12 +656,12 @@ let t_of_yojson =
(match extended_hover_value with
| Ppx_yojson_conv_lib.Option.None -> None
| Ppx_yojson_conv_lib.Option.Some v -> v)
; syntax_documentation =
(match syntax_documentation_value with
| Ppx_yojson_conv_lib.Option.None -> None
| Ppx_yojson_conv_lib.Option.Some v -> v)
; inlay_hints =
(match inlay_hints_value with
; dune_diagnostics =
(match dune_diagnostics_value with
| Ppx_yojson_conv_lib.Option.None -> None
| Ppx_yojson_conv_lib.Option.Some v -> v)
; syntax_documentation =
(match syntax_documentation_value with
| Ppx_yojson_conv_lib.Option.None -> None
| Ppx_yojson_conv_lib.Option.Some v -> v)
}))
Expand All @@ -617,25 +677,13 @@ let yojson_of_t =
(function
| { codelens = v_codelens

; extended_hover = v_extended_hover; syntax_documentation =
v_syntax_documentation
; inlay_hints = v_inlay_hints
; extended_hover = v_extended_hover
; dune_diagnostics = v_dune_diagnostics


; dune_diagnostics = v_dune_diagnostics
; syntax_documentation = v_syntax_documentation
} ->
let bnds : (string * Ppx_yojson_conv_lib.Yojson.Safe.t) list = [] in
let bnds =
if None = v_syntax_documentation then bnds
else
let arg =
(Json.Nullable_option.yojson_of_t SyntaxDocumentation.yojson_of_t)
v_syntax_documentation
in
let bnd = ("syntaxDocumentation", arg) in
bnd :: bnds
in
let bnds =
if None = v_syntax_documentation then bnds
else
Expand All @@ -656,16 +704,6 @@ let yojson_of_t =
let bnd = ("duneDiagnostics", arg) in
bnd :: bnds
in
let bnds =
if None = v_inlay_hints then bnds
else
let arg =
(Json.Nullable_option.yojson_of_t InlayHints.yojson_of_t)
v_inlay_hints
in
let bnd = ("inlayHints", arg) in
bnd :: bnds
in
let bnds =
if None = v_syntax_documentation then bnds
else
Expand Down Expand Up @@ -705,9 +743,6 @@ let _ = yojson_of_t
let default =
{ codelens = Some { enable = false }
; extended_hover = Some { enable = false }
; syntax_documentation = Some { enable = false }
; inlay_hints =
Some { hint_pattern_variables = false; hint_let_bindings = false }
; dune_diagnostics = Some { enable = true }
; syntax_documentation = Some { enable = false }
}
5 changes: 5 additions & 0 deletions ocaml-lsp-server/src/configuration.ml
Original file line number Diff line number Diff line change
Expand Up @@ -47,3 +47,8 @@ let update t { DidChangeConfigurationParams.settings } =
in
let data = Config_data.t_of_yojson settings in
Fiber.return { wheel; data }

let report_dune_diagnostics t =
match t.data.dune_diagnostics with
| Some { enable = true } | None -> true
| Some { enable = false } -> false
2 changes: 2 additions & 0 deletions ocaml-lsp-server/src/configuration.mli
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,5 @@ val default : unit -> t Fiber.t
val wheel : t -> Lev_fiber.Timer.Wheel.t

val update : t -> DidChangeConfigurationParams.t -> t Fiber.t

val report_dune_diagnostics : t -> bool
Loading

0 comments on commit 0ae0caf

Please sign in to comment.