1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-15 04:34:59 +00:00

AK: Remove fallible SourceGenerator::try_append()

And fall back to the infallible append().
This commit is contained in:
Andreas Kling 2023-08-21 16:39:43 +02:00
parent a1d694ccdc
commit 244516142a
9 changed files with 293 additions and 297 deletions

View file

@ -43,7 +43,7 @@ ErrorOr<void> generate_header_file(JsonObject& functions_data, Core::File& file)
StringBuilder builder;
SourceGenerator generator { builder };
TRY(generator.try_append(R"~~~(
generator.append(R"~~~(
// This file is generated by GenerateCSSMathFunctions.cpp
#pragma once
@ -51,7 +51,7 @@ ErrorOr<void> generate_header_file(JsonObject& functions_data, Core::File& file)
namespace Web::CSS {
enum class MathFunction {
)~~~"));
)~~~");
TRY(functions_data.try_for_each_member([&](auto& name, auto&) -> ErrorOr<void> {
auto member_generator = TRY(generator.fork());
@ -60,11 +60,11 @@ enum class MathFunction {
return {};
}));
TRY(generator.try_append(R"~~~(
generator.append(R"~~~(
};
}
)~~~"));
)~~~");
TRY(file.write_until_depleted(generator.as_string_view().bytes()));
return {};
@ -77,7 +77,7 @@ ErrorOr<String> generate_calculation_type_check(StringView calculation_variable_
bool first_type_check = true;
for (auto const& allowed_type_name : allowed_types) {
if (!first_type_check)
TRY(builder.try_append(" || "sv));
builder.append(" || "sv);
first_type_check = false;
if (allowed_type_name == "<angle>"sv) {
@ -111,7 +111,7 @@ ErrorOr<void> generate_implementation_file(JsonObject& functions_data, Core::Fil
StringBuilder builder;
SourceGenerator generator { builder };
TRY(generator.try_append(R"~~~(
generator.append(R"~~~(
// This file is generated by GenerateCSSMathFunctions.cpp
#include <AK/Debug.h>
@ -148,7 +148,7 @@ OwnPtr<CalculationNode> Parser::parse_math_function(PropertyID property_id, Func
{
TokenStream stream { function.values() };
auto arguments = parse_a_comma_separated_list_of_component_values(stream);
)~~~"));
)~~~");
TRY(functions_data.try_for_each_member([&](auto& name, JsonValue const& value) -> ErrorOr<void> {
auto& function_data = value.as_object();
@ -160,7 +160,7 @@ OwnPtr<CalculationNode> Parser::parse_math_function(PropertyID property_id, Func
function_generator.appendln(" if (function.name().equals_ignoring_ascii_case(\"@name:lowercase@\"sv)) {");
if (function_data.get_bool("is-variadic"sv).value_or(false)) {
// Variadic function
TRY(function_generator.try_append(R"~~~(
function_generator.append(R"~~~(
CSSNumericType determined_argument_type;
Vector<NonnullOwnPtr<CalculationNode>> parsed_arguments;
parsed_arguments.ensure_capacity(arguments.size());
@ -179,13 +179,13 @@ OwnPtr<CalculationNode> Parser::parse_math_function(PropertyID property_id, Func
}
auto argument_type = maybe_argument_type.release_value();
)~~~"));
)~~~");
// Generate some type checks
VERIFY(parameters.size() == 1);
auto& parameter_data = parameters[0].as_object();
auto parameter_type_string = parameter_data.get_deprecated_string("type"sv).value();
function_generator.set("type_check", TRY(generate_calculation_type_check("argument_type"sv, parameter_type_string)));
TRY(function_generator.try_append(R"~~~(
function_generator.append(R"~~~(
if (!(@type_check@)) {
dbgln_if(CSS_PARSER_DEBUG, "@name:lowercase@() argument #{} type ({}) is not an accepted type", parsed_arguments.size(), MUST(argument_type.dump()));
return nullptr;
@ -205,7 +205,7 @@ OwnPtr<CalculationNode> Parser::parse_math_function(PropertyID property_id, Func
return @name:titlecase@CalculationNode::create(move(parsed_arguments));
}
)~~~"));
)~~~");
} else {
// Function with specified parameters.
@ -219,14 +219,14 @@ OwnPtr<CalculationNode> Parser::parse_math_function(PropertyID property_id, Func
function_generator.set("min_argument_count", TRY(String::number(min_argument_count)));
function_generator.set("max_argument_count", TRY(String::number(max_argument_count)));
TRY(function_generator.try_append(R"~~~(
function_generator.append(R"~~~(
if (arguments.size() < @min_argument_count@ || arguments.size() > @max_argument_count@) {
dbgln_if(CSS_PARSER_DEBUG, "@name:lowercase@() has wrong number of arguments {}, expected between @min_argument_count@ and @max_argument_count@ inclusive", arguments.size());
return nullptr;
}
size_t argument_index = 0;
[[maybe_unused]] CSSNumericType previous_argument_type;
)~~~"));
)~~~");
size_t parameter_index = 0;
StringView previous_parameter_type_string;
@ -268,45 +268,45 @@ OwnPtr<CalculationNode> Parser::parse_math_function(PropertyID property_id, Func
}
}
TRY(parameter_generator.try_append(R"~~~(
parameter_generator.append(R"~~~(
@parameter_type@ parameter_@parameter_index@@parameter_default@;
)~~~"));
)~~~");
if (parameter_required) {
TRY(parameter_generator.try_append(R"~~~(
parameter_generator.append(R"~~~(
if (argument_index >= arguments.size()) {
dbgln_if(CSS_PARSER_DEBUG, "@name:lowercase@() missing required argument '@parameter_name@'");
return nullptr;
} else {
)~~~"));
)~~~");
} else {
TRY(parameter_generator.try_append(R"~~~(
parameter_generator.append(R"~~~(
if (argument_index < arguments.size()) {
)~~~"));
)~~~");
}
TRY(parameter_generator.try_append(R"~~~(
parameter_generator.append(R"~~~(
auto maybe_parsed_argument_@parameter_index@ = @parse_function@;
if (maybe_parsed_argument_@parameter_index@@check_function@) {
parameter_@parameter_index@ = maybe_parsed_argument_@parameter_index@@release_function@;
argument_index++;
)~~~"));
)~~~");
if (parameter_required) {
TRY(parameter_generator.try_append(R"~~~(
parameter_generator.append(R"~~~(
} else {
dbgln_if(CSS_PARSER_DEBUG, "@name:lowercase@() required argument '@parameter_name@' failed to parse");
return nullptr;
)~~~"));
)~~~");
}
TRY(parameter_generator.try_append(R"~~~(
parameter_generator.append(R"~~~(
}
}
)~~~"));
)~~~");
if (parameter_is_calculation) {
auto parameter_type_variable = TRY(String::formatted("argument_type_{}", parameter_index));
parameter_generator.set("type_check", TRY(generate_calculation_type_check(parameter_type_variable, parameter_type_string)));
TRY(parameter_generator.try_append(R"~~~(
parameter_generator.append(R"~~~(
auto maybe_argument_type_@parameter_index@ = parameter_@parameter_index@->determine_type(property_id);
if (!maybe_argument_type_@parameter_index@.has_value()) {
dbgln_if(CSS_PARSER_DEBUG, "@name:lowercase@() argument '@parameter_name@' couldn't determine its type");
@ -318,21 +318,21 @@ OwnPtr<CalculationNode> Parser::parse_math_function(PropertyID property_id, Func
dbgln_if(CSS_PARSER_DEBUG, "@name:lowercase@() argument '@parameter_name@' type ({}) is not an accepted type", MUST(argument_type_@parameter_index@.dump()));
return nullptr;
}
)~~~"));
)~~~");
// NOTE: In all current cases, the parameters that take the same types must resolve to the same CSSNumericType.
// This is a bit of a hack, but serves our needs for now.
if (previous_parameter_type_string == parameter_type_string) {
TRY(parameter_generator.try_append(R"~~~(
parameter_generator.append(R"~~~(
if (argument_type_@parameter_index@ != previous_argument_type) {
dbgln_if(CSS_PARSER_DEBUG, "@name:lowercase@() argument '@parameter_name@' type ({}) doesn't match type of previous arguments ({})", MUST(argument_type_@parameter_index@.dump()), MUST(previous_argument_type.dump()));
return nullptr;
}
)~~~"));
)~~~");
}
TRY(parameter_generator.try_append(R"~~~(
parameter_generator.append(R"~~~(
previous_argument_type = argument_type_@parameter_index@;
)~~~"));
)~~~");
}
parameter_index++;
@ -341,7 +341,7 @@ OwnPtr<CalculationNode> Parser::parse_math_function(PropertyID property_id, Func
}));
// Generate the call to the constructor
TRY(function_generator.try_append(" return @name:titlecase@CalculationNode::create("sv));
function_generator.append(" return @name:titlecase@CalculationNode::create("sv);
parameter_index = 0;
TRY(parameters.try_for_each([&](JsonValue const& parameter_value) -> ErrorOr<void> {
auto& parameter = parameter_value.as_object();
@ -358,26 +358,26 @@ OwnPtr<CalculationNode> Parser::parse_math_function(PropertyID property_id, Func
}
if (parameter_index == 0) {
TRY(parameter_generator.try_append("parameter_@parameter_index@@release_value@"sv));
parameter_generator.append("parameter_@parameter_index@@release_value@"sv);
} else {
TRY(parameter_generator.try_append(", parameter_@parameter_index@@release_value@"sv));
parameter_generator.append(", parameter_@parameter_index@@release_value@"sv);
}
parameter_index++;
return {};
}));
TRY(function_generator.try_append(R"~~~();
function_generator.append(R"~~~();
}
)~~~"));
)~~~");
}
return {};
}));
TRY(generator.try_append(R"~~~(
generator.append(R"~~~(
return nullptr;
}
}
)~~~"));
)~~~");
TRY(file.write_until_depleted(generator.as_string_view().bytes()));
return {};