From 8f31331e685db26a85b01cf3d0d12c7939b2370a Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 24 Jul 2020 13:23:47 +0200 Subject: LibWeb: Allow specifying a custom attribute name for [Reflect] Sometimes the IDL attribute and the DOM attribute don't have the same exact name. In those cases, we can now do this: [Reflect=foobar] attribute DOMString fooBar; --- .../LibWeb/CodeGenerators/WrapperGenerator.cpp | 23 ++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) (limited to 'Libraries/LibWeb') diff --git a/Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp b/Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp index 4e5da81a23..f414c0e85a 100644 --- a/Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp +++ b/Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp @@ -50,6 +50,17 @@ static String snake_name(const StringView& title_name) return builder.to_string(); } +static String add_underscore_to_cpp_keywords(const String& input) +{ + if (input == "class" || input == "template") { + StringBuilder builder; + builder.append(input); + builder.append('_'); + return builder.to_string(); + } + return input; +} + namespace IDL { struct Type { @@ -598,7 +609,11 @@ void generate_implementation(const IDL::Interface& interface) out() << " return {};"; if (attribute.extended_attributes.contains("Reflect")) { - out() << " auto retval = impl->attribute(HTML::AttributeNames::" << attribute.name << ");"; + auto attribute_name = attribute.extended_attributes.get("Reflect").value(); + if (attribute_name.is_null()) + attribute_name = attribute.name; + attribute_name = add_underscore_to_cpp_keywords(attribute_name); + out() << " auto retval = impl->attribute(HTML::AttributeNames::" << attribute_name << ");"; } else { out() << " auto retval = impl->" << snake_name(attribute.name) << "();"; } @@ -616,7 +631,11 @@ void generate_implementation(const IDL::Interface& interface) generate_to_cpp(attribute, "value", "", "cpp_value", true); if (attribute.extended_attributes.contains("Reflect")) { - out() << " impl->set_attribute(HTML::AttributeNames::" << attribute.name << ", cpp_value);"; + auto attribute_name = attribute.extended_attributes.get("Reflect").value(); + if (attribute_name.is_null()) + attribute_name = attribute.name; + attribute_name = add_underscore_to_cpp_keywords(attribute_name); + out() << " impl->set_attribute(HTML::AttributeNames::" << attribute_name << ", cpp_value);"; } else { out() << " impl->set_" << snake_name(attribute.name) << "(cpp_value);"; } -- cgit v1.2.3