Browse Source

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;
Andreas Kling 5 years ago
parent
commit
8f31331e68
1 changed files with 21 additions and 2 deletions
  1. 21 2
      Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp

+ 21 - 2
Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp

@@ -50,6 +50,17 @@ static String snake_name(const StringView& title_name)
     return builder.to_string();
     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 {
 namespace IDL {
 
 
 struct Type {
 struct Type {
@@ -598,7 +609,11 @@ void generate_implementation(const IDL::Interface& interface)
         out() << "        return {};";
         out() << "        return {};";
 
 
         if (attribute.extended_attributes.contains("Reflect")) {
         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 {
         } else {
             out() << "    auto retval = impl->" << snake_name(attribute.name) << "();";
             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);
             generate_to_cpp(attribute, "value", "", "cpp_value", true);
 
 
             if (attribute.extended_attributes.contains("Reflect")) {
             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 {
             } else {
                 out() << "    impl->set_" << snake_name(attribute.name) << "(cpp_value);";
                 out() << "    impl->set_" << snake_name(attribute.name) << "(cpp_value);";
             }
             }