Skip to content

Commit fe91638

Browse files
committed
Add attribute to mark whether an identifier is generated by ppx_template
1 parent 5ff53d6 commit fe91638

File tree

13 files changed

+329
-14
lines changed

13 files changed

+329
-14
lines changed

src/analysis/completion.ml

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -244,10 +244,17 @@ let make_candidate ~get_doc ~attrs ~exact ~prefix_path name ?loc ?path ty =
244244
| _, _ -> `None)
245245
in
246246
let deprecated = Type_utils.is_deprecated attrs in
247-
{ name; kind; desc; info; deprecated }
247+
let ppx_template_generated = Type_utils.is_ppx_template_generated attrs in
248+
{ name; kind; desc; info; deprecated; ppx_template_generated }
248249

249250
let item_for_global_module name =
250-
{ name; kind = `Module; desc = `None; info = `None; deprecated = false }
251+
{ name;
252+
kind = `Module;
253+
desc = `None;
254+
info = `None;
255+
deprecated = false;
256+
ppx_template_generated = false
257+
}
251258

252259
let fold_variant_constructors ~env ~init ~f =
253260
let rec aux acc t =
@@ -537,7 +544,8 @@ let complete_methods ~env ~prefix obj =
537544
kind = `MethodCall;
538545
desc = `Type_scheme ty;
539546
info;
540-
deprecated = false
547+
deprecated = false;
548+
ppx_template_generated = false
541549
})
542550

543551
type is_label =
@@ -639,7 +647,8 @@ let complete_prefix ?get_doc ?target_type ?(kinds = []) ~keywords ~prefix
639647
kind = `Keyword;
640648
desc = `None;
641649
info = `None;
642-
deprecated = false
650+
deprecated = false;
651+
ppx_template_generated = false
643652
}
644653
:: candidates
645654
else candidates)
@@ -654,7 +663,8 @@ let complete_prefix ?get_doc ?target_type ?(kinds = []) ~keywords ~prefix
654663
kind = `Module;
655664
desc = `None;
656665
info = `None;
657-
deprecated = false
666+
deprecated = false;
667+
ppx_template_generated = false
658668
}
659669
in
660670
if name = prefix && uniq (`Mod, name) then

src/analysis/type_utils.ml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,3 +377,9 @@ let is_deprecated =
377377
match Ast_helper.Attr.as_tuple attr with
378378
| { Location.txt = "deprecated" | "ocaml.deprecated"; loc = _ }, _ -> true
379379
| _ -> false)
380+
381+
let is_ppx_template_generated =
382+
List.exists ~f:(fun (attr : Parsetree.attribute) ->
383+
match Ast_helper.Attr.as_tuple attr with
384+
| { Location.txt = "merlin.ppx_template_generated"; loc = _ }, _ -> true
385+
| _ -> false)

src/analysis/type_utils.mli

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ val read_doc_attributes : Parsetree.attributes -> (string * Location.t) option
8383

8484
val is_deprecated : Parsetree.attributes -> bool
8585

86+
val is_ppx_template_generated : Parsetree.attributes -> bool
87+
8688
val print_constr :
8789
verbosity:Mconfig.Verbosity.t ->
8890
Env.t ->

src/commands/query_json.ml

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -304,14 +304,18 @@ let json_of_error (error : Location.error) =
304304
in
305305
with_location ~skip_none:true loc content
306306

307-
let json_of_completion { Compl.name; kind; desc; info; deprecated } =
307+
let json_of_completion
308+
{ Compl.name; kind; desc; info; deprecated; ppx_template_generated } =
308309
`Assoc
309-
[ ("name", `String name);
310-
("kind", `String (string_of_completion_kind kind));
311-
("desc", `String desc);
312-
("info", `String info);
313-
("deprecated", `Bool deprecated)
314-
]
310+
([ ("name", `String name);
311+
("kind", `String (string_of_completion_kind kind));
312+
("desc", `String desc);
313+
("info", `String info);
314+
("deprecated", `Bool deprecated)
315+
]
316+
@
317+
if ppx_template_generated then [ ("ppx_template_generated", `Bool true) ]
318+
else [])
315319

316320
let json_of_completions { Compl.entries; context } =
317321
`Assoc

src/frontend/query_commands.ml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,13 @@ let dispatch pipeline (type a) : a Query_protocol.t -> a = function
491491
let name = Format.flush_str_formatter () in
492492
Printtyp.type_scheme env Format.str_formatter v.Types.val_type;
493493
let desc = Format.flush_str_formatter () in
494-
{ Compl.name; kind = `Value; desc; info = ""; deprecated = false })
494+
{ Compl.name;
495+
kind = `Value;
496+
desc;
497+
info = "";
498+
deprecated = false;
499+
ppx_template_generated = false
500+
})
495501
in
496502
{ Compl.entries; context = `Unknown }
497503
| Type_search (query, pos, limit, with_doc) ->

src/frontend/query_protocol.ml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@ module Compl = struct
4141
| `Keyword ];
4242
desc : 'desc;
4343
info : 'desc;
44-
deprecated : bool
44+
deprecated : bool;
45+
ppx_template_generated : bool
46+
(** [true] if the identifier was generated by ppx_template *)
4547
}
4648

4749
type entry = string raw_entry
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
module Module = struct end
2+
3+
module Module_gen = struct end [@@merlin.ppx_template_generated]
4+
5+
let value = ()
6+
let value_gen = () [@@merlin.ppx_template_generated]
7+
8+
let func () = ()
9+
let func_gen () = () [@@merlin.ppx_template_generated]
10+
11+
type t_abstract
12+
type t_abstract_gen [@@merlin.ppx_template_generated]
13+
14+
type t_concrete = int
15+
type t_concrete_gen = int [@@merlin.ppx_template_generated]
16+
17+
module Foo = Foo
18+
module Foo_gen = Foo
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module Module = struct end
2+
3+
module Module_gen = struct end
4+
5+
let value = ()
6+
let value_gen = ()
7+
8+
let func () = ()
9+
let func_gen () = ()
10+
11+
type t_abstract
12+
type t_abstract_gen
13+
14+
type t_concrete = int
15+
type t_concrete_gen = int
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
include Baz_intf.S
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
module type S = sig
2+
module Module : sig end
3+
4+
module Module_gen : sig end [@@merlin.ppx_template_generated]
5+
6+
val value : unit
7+
val value_gen : unit [@@merlin.ppx_template_generated]
8+
9+
val func : unit -> unit
10+
val func_gen : unit -> unit [@@merlin.ppx_template_generated]
11+
12+
type t_abstract
13+
type t_abstract_gen [@@merlin.ppx_template_generated]
14+
15+
type t_concrete = int
16+
type t_concrete_gen = int [@@merlin.ppx_template_generated]
17+
end

0 commit comments

Comments
 (0)