Skip to content

Commit 58e249b

Browse files
SamChou19815meta-codesync[bot]
authored andcommitted
[flow] Basic implementation to incorporate information from jsdoc for custom errors
Summary: This diff implements the error printing infra for custom error explanations. The high level design is that the documentation should appear as an explanation for types with custom errors. The documentation is extracted from the jsdoc at the `custom_error_loc`. This diff implements the most basic form of extraction: if available, we will take the `description` part of jsdoc as the explanation. It's certainly not production ready (we probably want to include `example` as well), but it provides the technical viability of this approach. I will use this diff as the baseline to see how custom errors behaves in real code. Changelog: [internal] Reviewed By: panagosg7 Differential Revision: D86250573 fbshipit-source-id: 894cdb84c88fe6faf07b5691b788672390a4498c
1 parent 367e81d commit 58e249b

File tree

14 files changed

+136
-406
lines changed

14 files changed

+136
-406
lines changed

src/codemods/annotate_optional_properties.ml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,7 @@ let mapper ~max_type_size ~default_any (cctx : Codemod_context.Typed.t) =
223223
Options.unsuppressable_error_codes cctx.Codemod_context.Typed.options
224224
in
225225
let loc_of_aloc = Parsing_heaps.Reader_dispatcher.loc_of_aloc ~reader in
226+
let get_ast = Parsing_heaps.Reader_dispatcher.get_ast ~reader in
226227
let suppressions = Context.error_suppressions cx in
227228
let error_is_suppressed error =
228229
let (errors, _, _) =
@@ -231,6 +232,7 @@ let mapper ~max_type_size ~default_any (cctx : Codemod_context.Typed.t) =
231232
~file_options:None
232233
~unsuppressable_error_codes
233234
~loc_of_aloc
235+
~get_ast
234236
suppressions
235237
(Flow_error.ErrorSet.singleton error)
236238
~unused:suppressions

src/flow_dot_js.ml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ let error_of_parse_error source_file (loc, err) =
1515
Error_message.EParseError (ALoc.of_loc loc, err)
1616
|> Flow_error.error_of_msg ~source_file
1717
|> Flow_intermediate_error.make_intermediate_error ~loc_of_aloc
18-
|> Flow_intermediate_error.to_printable_error ~loc_of_aloc ~strip_root:None
18+
|> Flow_intermediate_error.to_printable_error
19+
~loc_of_aloc
20+
~get_ast:(fun _ -> None)
21+
~strip_root:None
1922

2023
let parse_content file content =
2124
let parse_options = Some Parser_env.permissive_parse_options in
@@ -333,6 +336,7 @@ let check_content ~filename ~content ~js_config_object =
333336
~file_options:None
334337
~unsuppressable_error_codes:SSet.empty
335338
~loc_of_aloc
339+
~get_ast:(fun _ -> None)
336340
suppressions
337341
errors
338342
~unused:suppressions
@@ -343,6 +347,7 @@ let check_content ~filename ~content ~js_config_object =
343347
~file_options:None
344348
~unsuppressable_error_codes:SSet.empty
345349
~loc_of_aloc
350+
~get_ast:(fun _ -> None)
346351
suppressions
347352
warnings
348353
~unused:suppressions

src/parser/jsdoc.mli

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,6 @@ val unrecognized_tags : t -> Unrecognized_tags.t
5353
(* parsing *)
5454
(***********)
5555

56+
val parse : string -> t option
57+
5658
val of_comments : ('M, 'T) Flow_ast.Syntax.t option -> ('M * t) option

src/server/command_handler/commandHandler.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,7 @@ let get_status ~options ~reader env =
324324
let to_printable =
325325
Flow_intermediate_error.to_printable_error
326326
~loc_of_aloc:(Parsing_heaps.Reader.loc_of_aloc ~reader)
327+
~get_ast:(Parsing_heaps.Reader.get_ast ~reader)
327328
~strip_root:(Base.Option.some_if (Options.should_strip_root options) (Options.root options))
328329
in
329330
let suppressed_errors =

src/server/error_collator/errorCollator.ml

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@ let add_suppression_warnings root checked unused warnings =
3333
let msg = Error_message.EUnusedSuppression loc in
3434
Flow_error.error_of_msg ~source_file msg
3535
|> Flow_intermediate_error.make_intermediate_error ~loc_of_aloc:Fun.id
36-
|> Flow_intermediate_error.to_printable_error ~loc_of_aloc:Fun.id ~strip_root:(Some root)
36+
|> Flow_intermediate_error.to_printable_error
37+
~loc_of_aloc:Fun.id
38+
~get_ast:(fun _ -> None)
39+
~strip_root:(Some root)
3740
in
3841
let file_warnings =
3942
FilenameMap.find_opt source_file warnings
@@ -56,7 +59,10 @@ let collate_duplicate_providers ~update root =
5659
Error_message.EDuplicateModuleProvider { module_name; provider; conflict }
5760
|> Flow_error.error_of_msg ~source_file:duplicate
5861
|> Flow_intermediate_error.make_intermediate_error ~loc_of_aloc:Fun.id
59-
|> Flow_intermediate_error.to_printable_error ~loc_of_aloc:Fun.id ~strip_root:(Some root)
62+
|> Flow_intermediate_error.to_printable_error
63+
~loc_of_aloc:Fun.id
64+
~get_ast:(fun _ -> None)
65+
~strip_root:(Some root)
6066
in
6167
update provider_file duplicate err acc
6268
in
@@ -70,6 +76,7 @@ let update_local_collated_errors ~reader ~options suppressions errors acc =
7076
let root = Options.root options in
7177
let unsuppressable_error_codes = Options.unsuppressable_error_codes options in
7278
let loc_of_aloc = Parsing_heaps.Reader_dispatcher.loc_of_aloc ~reader in
79+
let get_ast = Parsing_heaps.Reader_dispatcher.get_ast ~reader in
7380
let collated_local_errors =
7481
FilenameMap.fold
7582
(fun filename file_errs errors ->
@@ -82,6 +89,7 @@ let update_local_collated_errors ~reader ~options suppressions errors acc =
8289
~file_options
8390
~unsuppressable_error_codes
8491
~loc_of_aloc
92+
~get_ast
8593
suppressions
8694
file_errs
8795
~unused:Error_suppressions.empty
@@ -97,6 +105,7 @@ let update_collated_errors ~reader ~options ~checked_files ~all_suppressions err
97105
let unsuppressable_error_codes = Options.unsuppressable_error_codes options in
98106
let { local_errors; duplicate_providers; merge_errors; warnings; suppressions } = errors in
99107
let loc_of_aloc = Parsing_heaps.Reader_dispatcher.loc_of_aloc ~reader in
108+
let get_ast = Parsing_heaps.Reader_dispatcher.get_ast ~reader in
100109
let acc_fun filename file_errs (errors, suppressed, unused) =
101110
let file_options = Some (Options.file_options options) in
102111
let (file_errs, file_suppressed, unused) =
@@ -105,6 +114,7 @@ let update_collated_errors ~reader ~options ~checked_files ~all_suppressions err
105114
~file_options
106115
~unsuppressable_error_codes
107116
~loc_of_aloc
117+
~get_ast
108118
(* Use all_suppressions here to account for misplaced errors. *)
109119
all_suppressions
110120
file_errs

src/server/server.ml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -394,10 +394,11 @@ let check_once ~init_id ~shared_mem_config ~format_errors ?focus_targets options
394394
let to_printable =
395395
let reader = State_reader.create () in
396396
let loc_of_aloc = Parsing_heaps.Reader.loc_of_aloc ~reader in
397+
let get_ast = Parsing_heaps.Reader.get_ast ~reader in
397398
let strip_root =
398399
Base.Option.some_if (Options.should_strip_root options) (Options.root options)
399400
in
400-
Flow_intermediate_error.to_printable_error ~loc_of_aloc ~strip_root
401+
Flow_intermediate_error.to_printable_error ~loc_of_aloc ~get_ast ~strip_root
401402
in
402403
let suppressed_errors =
403404
if Options.include_suppressions options then

src/services/autocomplete/autocompleteService_js.ml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2135,7 +2135,10 @@ let applicable_error_codes ~loc_of_aloc ~cx comment_loc =
21352135
let err =
21362136
err
21372137
|> Flow_intermediate_error.make_intermediate_error ~loc_of_aloc
2138-
|> Flow_intermediate_error.to_printable_error ~loc_of_aloc ~strip_root
2138+
|> Flow_intermediate_error.to_printable_error
2139+
~loc_of_aloc
2140+
~get_ast:(fun _ -> None)
2141+
~strip_root
21392142
in
21402143
let loc = Flow_errors_utils.loc_of_printable_error err in
21412144
match Flow_errors_utils.code_of_printable_error err with

src/services/inference/type_contents.ml

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ let parse_contents ~options ~profiling contents filename =
7878
| Skipped -> (None, Flow_error.ErrorSet.empty)
7979
)
8080

81-
let errors_of_file_artifacts ~options ~env ~loc_of_aloc ~filename ~file_artifacts =
81+
let errors_of_file_artifacts ~options ~env ~loc_of_aloc ~get_ast ~filename ~file_artifacts =
8282
(* Callers have already had a chance to inspect parse errors, so they are not included here.
8383
* Typically, type errors in the face of parse errors are meaningless, so callers should probably
8484
* not call this function if parse errors have been found. *)
@@ -126,6 +126,7 @@ let errors_of_file_artifacts ~options ~env ~loc_of_aloc ~filename ~file_artifact
126126
~file_options
127127
~unsuppressable_error_codes
128128
~loc_of_aloc
129+
~get_ast
129130
suppressions
130131
errors
131132
~unused:Error_suppressions.empty
@@ -138,6 +139,7 @@ let errors_of_file_artifacts ~options ~env ~loc_of_aloc ~filename ~file_artifact
138139
~file_options
139140
~unsuppressable_error_codes
140141
~loc_of_aloc
142+
~get_ast
141143
suppressions
142144
warnings
143145
~unused:Error_suppressions.empty
@@ -155,15 +157,20 @@ let printable_errors_of_file_artifacts_result ~options ~env filename result =
155157
let root = Options.root options in
156158
let reader = State_reader.create () in
157159
let loc_of_aloc = Parsing_heaps.Reader.loc_of_aloc ~reader in
160+
let get_ast = Parsing_heaps.Reader.get_ast ~reader in
158161
match result with
159162
| Ok file_artifacts ->
160163
let (errors, warnings) =
161-
errors_of_file_artifacts ~options ~env ~loc_of_aloc ~filename ~file_artifacts
164+
errors_of_file_artifacts ~options ~env ~loc_of_aloc ~get_ast ~filename ~file_artifacts
162165
in
163166
(errors, warnings)
164167
| Error errors ->
165168
let errors =
166-
Flow_intermediate_error.make_errors_printable ~loc_of_aloc ~strip_root:(Some root) errors
169+
Flow_intermediate_error.make_errors_printable
170+
~loc_of_aloc
171+
~get_ast
172+
~strip_root:(Some root)
173+
errors
167174
in
168175
(errors, Flow_errors_utils.ConcreteLocPrintableErrorSet.empty)
169176

src/services/inference/types_js.ml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,7 @@ let run_merge_service
328328
let mk_intermediate_result_callback ~reader ~options ~persistent_connections suppressions () =
329329
let open Flow_errors_utils in
330330
let loc_of_aloc = Parsing_heaps.Mutator_reader.loc_of_aloc ~reader in
331+
let get_ast = Parsing_heaps.Mutator_reader.get_ast ~reader in
331332
let root = Options.root options in
332333
let file_options = Some (Options.file_options options) in
333334
let unsuppressable_error_codes = Options.unsuppressable_error_codes options in
@@ -342,6 +343,7 @@ let mk_intermediate_result_callback ~reader ~options ~persistent_connections sup
342343
~file_options
343344
~unsuppressable_error_codes
344345
~loc_of_aloc
346+
~get_ast
345347
suppressions
346348
errors
347349
~unused:Error_suppressions.empty
@@ -352,6 +354,7 @@ let mk_intermediate_result_callback ~reader ~options ~persistent_connections sup
352354
~file_options:None
353355
~unsuppressable_error_codes
354356
~loc_of_aloc
357+
~get_ast
355358
suppressions
356359
warnings
357360
~unused:Error_suppressions.empty
@@ -885,6 +888,7 @@ end = struct
885888
~files_to_force
886889
~env =
887890
let loc_of_aloc = Parsing_heaps.Mutator_reader.loc_of_aloc ~reader in
891+
let get_ast = Parsing_heaps.Mutator_reader.get_ast ~reader in
888892
let errors = env.ServerEnv.errors in
889893
let collated_errors = env.ServerEnv.collated_errors in
890894
(* files_to_force is a request to promote certain files to be checked as a dependency, dependent,
@@ -955,6 +959,7 @@ end = struct
955959
let errors =
956960
Flow_intermediate_error.make_errors_printable
957961
~loc_of_aloc
962+
~get_ast
958963
~strip_root:(Some (Options.root options))
959964
errors
960965
in

src/typing/errors/error_suppressions.ml

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,14 @@ let all_unused_locs map =
263263
LocSet.empty
264264

265265
let filter_suppressed_errors
266-
~root ~file_options ~unsuppressable_error_codes ~loc_of_aloc suppressions errors ~unused =
266+
~root
267+
~file_options
268+
~unsuppressable_error_codes
269+
~loc_of_aloc
270+
~get_ast
271+
suppressions
272+
errors
273+
~unused =
267274
(* Filter out suppressed errors. also track which suppressions are used. *)
268275
Flow_error.ErrorSet.fold
269276
(fun error ((errors, suppressed, unused) as acc) ->
@@ -283,7 +290,11 @@ let filter_suppressed_errors
283290
| _ -> error
284291
in
285292
let error =
286-
Flow_intermediate_error.to_printable_error ~loc_of_aloc ~strip_root:(Some root) error
293+
Flow_intermediate_error.to_printable_error
294+
~loc_of_aloc
295+
~get_ast
296+
~strip_root:(Some root)
297+
error
287298
in
288299
(Flow_errors_utils.ConcreteLocPrintableErrorSet.add error errors, suppressed, unused)))
289300
errors

0 commit comments

Comments
 (0)