1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-22 19:45:08 +00:00

JSSpecCompiler: Parse method headers

This commit is contained in:
Dan Klishch 2024-01-21 15:26:17 -05:00 committed by Andrew Kaster
parent a35a751f9e
commit 4d8f74c149
7 changed files with 85 additions and 12 deletions

View file

@ -722,23 +722,42 @@ TextParseErrorOr<ClauseHeader::Accessor> TextParser::parse_accessor_declaration(
return accessor;
}
TextParseErrorOr<ClauseHeader::Method> TextParser::parse_method_declaration()
{
auto rollback = rollback_point();
ClauseHeader::Method method;
method.qualified_name = TRY(parse_qualified_name());
method.arguments = TRY(parse_function_arguments_in_declaration());
TRY(expect_eof());
rollback.disarm();
return method;
}
// <clause_header> :== <section_number> <ao_declaration> | <accessor_declaration>
TextParseErrorOr<ClauseHeader> TextParser::parse_clause_header()
TextParseErrorOr<ClauseHeader> TextParser::parse_clause_header(ClauseHasAoidAttribute clause_has_aoid_attribute)
{
ClauseHeader result;
auto section_number_token = TRY(consume_token_with_type(TokenType::SectionNumber));
result.section_number = section_number_token.data;
if (auto ao_declaration = parse_abstract_operation_declaration(); !ao_declaration.is_error()) {
result.header = ao_declaration.release_value();
} else if (auto accessor = parse_accessor_declaration(); !accessor.is_error()) {
result.header = accessor.release_value();
if (clause_has_aoid_attribute == ClauseHasAoidAttribute::Yes) {
if (auto ao_declaration = parse_abstract_operation_declaration(); !ao_declaration.is_error()) {
result.header = ao_declaration.release_value();
return result;
}
} else {
return TextParseError {};
if (auto accessor = parse_accessor_declaration(); !accessor.is_error()) {
result.header = accessor.release_value();
return result;
} else if (auto method = parse_method_declaration(); !method.is_error()) {
result.header = method.release_value();
return result;
}
}
return result;
return TextParseError {};
}
FailedTextParseDiagnostic TextParser::get_diagnostic() const