4
4
#include < algorithm>
5
5
#include < quick-lint-js/char8.h>
6
6
#include < quick-lint-js/configuration.h>
7
+ #include < quick-lint-js/error.h>
7
8
#include < quick-lint-js/global-variables.h>
8
9
#include < quick-lint-js/lint.h>
9
10
#include < quick-lint-js/narrow-cast.h>
@@ -175,7 +176,8 @@ void configuration::remove_global_variable(string8_view name) {
175
176
this ->globals_to_remove_ .emplace_back (name);
176
177
}
177
178
178
- void configuration::load_from_json (padded_string_view json) {
179
+ void configuration::load_from_json (padded_string_view json,
180
+ error_reporter* reporter) {
179
181
::simdjson::ondemand::parser json_parser;
180
182
::simdjson::ondemand::document document;
181
183
::simdjson::error_code parse_error =
@@ -185,15 +187,15 @@ void configuration::load_from_json(padded_string_view json) {
185
187
narrow_cast<std::size_t >(json.padded_size ()))
186
188
.get (document);
187
189
if (parse_error != ::simdjson::error_code::SUCCESS) {
188
- this ->report_json_error (json);
190
+ this ->report_json_error (json, reporter );
189
191
return ;
190
192
}
191
193
192
194
::simdjson::ondemand::value global_groups_value;
193
195
switch (document[" global-groups" ].get (global_groups_value)) {
194
196
case ::simdjson::error_code::SUCCESS:
195
- if (!this ->load_global_groups_from_json (global_groups_value)) {
196
- this ->report_json_error (json);
197
+ if (!this ->load_global_groups_from_json (global_groups_value, reporter )) {
198
+ this ->report_json_error (json, reporter );
197
199
return ;
198
200
}
199
201
break ;
@@ -202,16 +204,16 @@ void configuration::load_from_json(padded_string_view json) {
202
204
break ;
203
205
204
206
default :
205
- this ->report_json_error (json);
207
+ this ->report_json_error (json, reporter );
206
208
return ;
207
209
}
208
210
209
211
auto globals = document[" globals" ];
210
212
::simdjson::ondemand::object globals_value;
211
213
switch (globals.get (globals_value)) {
212
214
case ::simdjson::error_code::SUCCESS:
213
- if (!this ->load_globals_from_json (globals_value)) {
214
- this ->report_json_error (json);
215
+ if (!this ->load_globals_from_json (globals_value, reporter )) {
216
+ this ->report_json_error (json, reporter );
215
217
return ;
216
218
}
217
219
break ;
@@ -222,11 +224,11 @@ void configuration::load_from_json(padded_string_view json) {
222
224
::simdjson::ondemand::value v;
223
225
if (globals.get (v) == ::simdjson::SUCCESS &&
224
226
v.type ().error () == ::simdjson::SUCCESS) {
225
- this -> errors_ . report (error_config_globals_type_mismatch{
227
+ reporter-> report (error_config_globals_type_mismatch{
226
228
.value = span_of_json_value (v),
227
229
});
228
230
} else {
229
- this ->report_json_error (json);
231
+ this ->report_json_error (json, reporter );
230
232
return ;
231
233
}
232
234
break ;
@@ -236,36 +238,23 @@ void configuration::load_from_json(padded_string_view json) {
236
238
break ;
237
239
238
240
default :
239
- this ->report_json_error (json);
241
+ this ->report_json_error (json, reporter );
240
242
return ;
241
243
}
242
244
}
243
245
244
- void configuration::report_errors (error_reporter* reporter) {
245
- this ->errors_ .copy_into (reporter);
246
- this ->errors_were_reported_ = true ;
247
- }
248
-
249
- bool configuration::have_errors () const noexcept {
250
- return !this ->errors_ .empty ();
251
- }
252
-
253
- bool configuration::errors_were_reported () const noexcept {
254
- return this ->errors_were_reported_ ;
255
- }
256
-
257
246
void configuration::reset () {
258
247
// TODO(strager): Make this more efficient by avoiding reallocations.
259
248
this ->globals_ = global_declared_variable_set ();
260
249
this ->globals_to_remove_ .clear ();
261
250
this ->add_global_group_node_js_ = true ;
262
251
this ->add_global_group_ecmascript_ = true ;
263
252
this ->string_allocator_ .memory_resource ()->release ();
264
- this ->errors_ .clear ();
265
253
}
266
254
267
255
bool configuration::load_global_groups_from_json (
268
- ::simdjson::ondemand::value& global_groups_value) {
256
+ ::simdjson::ondemand::value& global_groups_value,
257
+ error_reporter* reporter) {
269
258
::simdjson::fallback::ondemand::json_type global_groups_value_type;
270
259
if (global_groups_value.type ().get (global_groups_value_type) !=
271
260
::simdjson::SUCCESS) {
@@ -314,7 +303,7 @@ bool configuration::load_global_groups_from_json(
314
303
if (global_group_value.type ().error () != ::simdjson::SUCCESS) {
315
304
return false ;
316
305
}
317
- this -> errors_ . report (error_config_global_groups_group_type_mismatch{
306
+ reporter-> report (error_config_global_groups_group_type_mismatch{
318
307
.group = span_of_json_value (global_group_value),
319
308
});
320
309
break ;
@@ -330,7 +319,7 @@ bool configuration::load_global_groups_from_json(
330
319
case ::simdjson::fallback::ondemand::json_type::number:
331
320
case ::simdjson::fallback::ondemand::json_type::object:
332
321
case ::simdjson::fallback::ondemand::json_type::string:
333
- this -> errors_ . report (error_config_global_groups_type_mismatch{
322
+ reporter-> report (error_config_global_groups_type_mismatch{
334
323
.value = span_of_json_value (global_groups_value),
335
324
});
336
325
break ;
@@ -339,7 +328,7 @@ bool configuration::load_global_groups_from_json(
339
328
}
340
329
341
330
bool configuration::load_globals_from_json (
342
- ::simdjson::ondemand::object& globals_value) {
331
+ ::simdjson::ondemand::object& globals_value, error_reporter* reporter ) {
343
332
for (simdjson::simdjson_result<::simdjson::fallback::ondemand::field>
344
333
global_field : globals_value) {
345
334
std::string_view key;
@@ -379,20 +368,22 @@ bool configuration::load_globals_from_json(
379
368
global_declared_variable* var = add_global_variable (global_name);
380
369
if (!this ->get_bool_or_default <
381
370
error_config_globals_descriptor_shadowable_type_mismatch>(
382
- descriptor_object[" shadowable" ], &var->is_shadowable , true )) {
371
+ descriptor_object[" shadowable" ], &var->is_shadowable , true ,
372
+ reporter)) {
383
373
return false ;
384
374
}
385
375
if (!this ->get_bool_or_default <
386
376
error_config_globals_descriptor_writable_type_mismatch>(
387
- descriptor_object[" writable" ], &var->is_writable , true )) {
377
+ descriptor_object[" writable" ], &var->is_writable , true ,
378
+ reporter)) {
388
379
return false ;
389
380
}
390
381
391
382
break ;
392
383
}
393
384
394
385
default :
395
- this -> errors_ . report (error_config_globals_descriptor_type_mismatch{
386
+ reporter-> report (error_config_globals_descriptor_type_mismatch{
396
387
.descriptor = span_of_json_value (descriptor),
397
388
});
398
389
break ;
@@ -418,7 +409,7 @@ bool configuration::should_remove_global_variable(string8_view name) {
418
409
template <class Error >
419
410
bool configuration::get_bool_or_default (
420
411
::simdjson::simdjson_result<::simdjson::ondemand::value>&& value, bool * out,
421
- bool default_value) {
412
+ bool default_value, error_reporter* reporter ) {
422
413
::simdjson::fallback::ondemand::value v;
423
414
::simdjson::error_code error = value.get (v);
424
415
switch (error) {
@@ -428,7 +419,7 @@ bool configuration::get_bool_or_default(
428
419
return false ;
429
420
}
430
421
if (type != ::simdjson::fallback::ondemand::json_type::boolean) {
431
- this -> errors_ . report (Error{span_of_json_value (v)});
422
+ reporter-> report (Error{span_of_json_value (v)});
432
423
*out = default_value;
433
424
return true ;
434
425
}
@@ -447,11 +438,12 @@ bool configuration::get_bool_or_default(
447
438
}
448
439
}
449
440
450
- void configuration::report_json_error (padded_string_view json) {
441
+ void configuration::report_json_error (padded_string_view json,
442
+ error_reporter* reporter) {
451
443
// TODO(strager): Produce better error messages. simdjson provides no location
452
444
// information for errors:
453
445
// https://github.com/simdjson/simdjson/issues/237
454
- this -> errors_ . report (error_config_json_syntax_error{
446
+ reporter-> report (error_config_json_syntax_error{
455
447
.where = source_code_span (json.data (), json.data ()),
456
448
});
457
449
}
0 commit comments