Skip to content

Commit a429162

Browse files
committed
refactor(test): allow multiple extra members in diag assertions
Allow diagnostic assertions to contain multiple 'extra' members instead of at most one. For example: u8"Diag_Foo{.bar=asdf}{.baz=qwer}"_diag
1 parent d94bf5f commit a429162

File tree

1 file changed

+32
-23
lines changed

1 file changed

+32
-23
lines changed

test/quick-lint-js/diagnostic-assertion.cpp

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -181,8 +181,12 @@ Diagnostic_Assertion::parse(const Char8* specification) {
181181
Fixed_Vector<String8_View, 3> diag_members;
182182

183183
String8_View diag_type_span;
184-
String8_View extra_member_span;
185-
String8_View extra_member_value_span;
184+
185+
struct Extra_Member {
186+
String8_View name;
187+
String8_View value;
188+
};
189+
Fixed_Vector<Extra_Member, 3> extra_members;
186190

187191
for (Fixed_Vector_Size i = 0; i < 3; ++i) {
188192
Padded_String_Size leading_spaces = lexer.parse_leading_spaces();
@@ -230,29 +234,31 @@ Diagnostic_Assertion::parse(const Char8* specification) {
230234
++lexer.p;
231235
}
232236

233-
if (*lexer.p == u8'{' && (diag_members.empty() || !diag_members[0].empty())) {
237+
while (*lexer.p == u8'{' &&
238+
(diag_members.empty() || !diag_members[0].empty())) {
234239
++lexer.p;
235240
if (*lexer.p != u8'.') {
236241
goto done_unexpected;
237242
}
238243
++lexer.p;
239-
extra_member_span = lexer.parse_identifier();
240-
if (extra_member_span.empty()) {
244+
String8_View name = lexer.parse_identifier();
245+
if (name.empty()) {
241246
lexer.errors.push_back("expected member variable name after '{.'");
242247
}
243248

244249
if (*lexer.p != u8'=') {
245-
extra_member_span = String8_View();
246250
goto done_unexpected;
247251
}
248252
++lexer.p;
249253

250-
extra_member_value_span = lexer.parse_extra_member_value();
254+
String8_View value = lexer.parse_extra_member_value();
251255
if (*lexer.p == u8'}') {
252256
++lexer.p;
253257
} else {
254258
// parse_extra_member_value reported an error already.
255259
}
260+
261+
extra_members.push_back(Extra_Member{.name = name, .value = value});
256262
}
257263

258264
if (*lexer.p != u8'\0') {
@@ -313,37 +319,38 @@ Diagnostic_Assertion::parse(const Char8* specification) {
313319
out_member.type = member->type;
314320
}
315321

316-
if (!extra_member_span.empty()) {
322+
for (const Extra_Member& extra_member_assertion : extra_members) {
317323
const Diagnostic_Info_Variable_Debug* extra_member =
318-
diag_info.find(extra_member_span);
324+
diag_info.find(extra_member_assertion.name);
319325
QLJS_ALWAYS_ASSERT(extra_member != nullptr);
320326

321327
Member& out_member = out_assertion.members.emplace_back();
322328
switch (extra_member->type) {
323329
case Diagnostic_Arg_Type::char8:
324-
if (extra_member_value_span.size() != 1) {
330+
if (extra_member_assertion.value.size() != 1) {
325331
lexer.errors.push_back(
326-
concat("member {."sv, to_string_view(extra_member_span),
332+
concat("member {."sv, to_string_view(extra_member_assertion.name),
327333
"} is a Char8 but the given value is not one byte"sv));
328334
return failed_result(std::move(lexer.errors));
329335
}
330336
out_member.name = extra_member->name;
331337
out_member.offset = extra_member->offset;
332338
out_member.type = extra_member->type;
333-
out_member.character = extra_member_value_span[0];
339+
out_member.character = extra_member_assertion.value[0];
334340
break;
335341

336342
case Diagnostic_Arg_Type::enum_kind: {
337343
out_member.name = extra_member->name;
338344
out_member.offset = extra_member->offset;
339345
out_member.type = extra_member->type;
340346
std::optional<Enum_Kind> enum_kind =
341-
try_parse_enum_kind(extra_member_value_span);
347+
try_parse_enum_kind(extra_member_assertion.value);
342348
if (enum_kind.has_value()) {
343349
out_member.enum_kind = *enum_kind;
344350
} else {
345-
lexer.errors.push_back(concat("invalid Enum_Kind: "sv,
346-
to_string_view(extra_member_value_span)));
351+
lexer.errors.push_back(
352+
concat("invalid Enum_Kind: "sv,
353+
to_string_view(extra_member_assertion.value)));
347354
}
348355
break;
349356
}
@@ -352,20 +359,21 @@ Diagnostic_Assertion::parse(const Char8* specification) {
352359
out_member.name = extra_member->name;
353360
out_member.offset = extra_member->offset;
354361
out_member.type = extra_member->type;
355-
out_member.string = extra_member_value_span;
362+
out_member.string = extra_member_assertion.value;
356363
break;
357364

358365
case Diagnostic_Arg_Type::statement_kind: {
359366
out_member.name = extra_member->name;
360367
out_member.offset = extra_member->offset;
361368
out_member.type = extra_member->type;
362369
std::optional<Statement_Kind> statement_kind =
363-
try_parse_statement_kind(extra_member_value_span);
370+
try_parse_statement_kind(extra_member_assertion.value);
364371
if (statement_kind.has_value()) {
365372
out_member.statement_kind = *statement_kind;
366373
} else {
367-
lexer.errors.push_back(concat("invalid Statement_Kind: "sv,
368-
to_string_view(extra_member_value_span)));
374+
lexer.errors.push_back(
375+
concat("invalid Statement_Kind: "sv,
376+
to_string_view(extra_member_assertion.value)));
369377
}
370378
break;
371379
}
@@ -375,19 +383,20 @@ Diagnostic_Assertion::parse(const Char8* specification) {
375383
out_member.offset = extra_member->offset;
376384
out_member.type = extra_member->type;
377385
std::optional<Variable_Kind> variable_kind =
378-
try_parse_variable_kind(extra_member_value_span);
386+
try_parse_variable_kind(extra_member_assertion.value);
379387
if (variable_kind.has_value()) {
380388
out_member.variable_kind = *variable_kind;
381389
} else {
382-
lexer.errors.push_back(concat("invalid Variable_Kind: "sv,
383-
to_string_view(extra_member_value_span)));
390+
lexer.errors.push_back(
391+
concat("invalid Variable_Kind: "sv,
392+
to_string_view(extra_member_assertion.value)));
384393
}
385394
break;
386395
}
387396

388397
default:
389398
lexer.errors.push_back(concat("member {."sv,
390-
to_string_view(extra_member_span),
399+
to_string_view(extra_member_assertion.name),
391400
"} has unsupported type"sv));
392401
break;
393402
}

0 commit comments

Comments
 (0)