@@ -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