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

BindingsGenerator+LibIDL: Parse "inherit" attributes

An "inherit attribute" calls an ancestor's getter with the same name,
but defines its own setter. Since a parent class's public methods are
exposed to child classes, we don't have to do any special handling here
to call the parent's methods, it just works. :^)
This commit is contained in:
Sam Atkins 2022-04-05 16:09:42 +01:00 committed by Linus Groh
parent c30c6eb1c1
commit a6f0508f9f
3 changed files with 10 additions and 3 deletions

View file

@ -111,7 +111,8 @@ int main(int argc, char** argv)
if constexpr (BINDINGS_GENERATOR_DEBUG) {
dbgln("Attributes:");
for (auto& attribute : interface.attributes) {
dbgln(" {}{}{} {}",
dbgln(" {}{}{}{} {}",
attribute.inherit ? "inherit " : "",
attribute.readonly ? "readonly " : "",
attribute.type->name(),
attribute.type->is_nullable() ? "?" : "",

View file

@ -217,6 +217,10 @@ NonnullRefPtr<Type> Parser::parse_type()
void Parser::parse_attribute(HashMap<String, String>& extended_attributes, Interface& interface)
{
bool inherit = lexer.consume_specific("inherit");
if (inherit)
consume_whitespace();
bool readonly = lexer.consume_specific("readonly");
if (readonly)
consume_whitespace();
@ -236,6 +240,7 @@ void Parser::parse_attribute(HashMap<String, String>& extended_attributes, Inter
auto setter_callback_name = String::formatted("{}_setter", name_as_string.to_snakecase());
Attribute attribute {
inherit,
readonly,
move(type),
move(name_as_string),
@ -361,7 +366,7 @@ void Parser::parse_stringifier(HashMap<String, String>& extended_attributes, Int
assert_string("stringifier"sv);
consume_whitespace();
interface.has_stringifier = true;
if (lexer.next_is("readonly"sv) || lexer.next_is("attribute"sv)) {
if (lexer.next_is("attribute"sv) || lexer.next_is("inherit"sv) || lexer.next_is("readonly"sv)) {
parse_attribute(extended_attributes, interface);
interface.stringifier_attribute = interface.attributes.last().name;
} else {
@ -547,7 +552,7 @@ void Parser::parse_interface(Interface& interface)
continue;
}
if (lexer.next_is("readonly") || lexer.next_is("attribute")) {
if (lexer.next_is("inherit") || lexer.next_is("readonly") || lexer.next_is("attribute")) {
parse_attribute(extended_attributes, interface);
continue;
}

View file

@ -176,6 +176,7 @@ struct Constant {
};
struct Attribute {
bool inherit { false };
bool readonly { false };
NonnullRefPtr<Type> type;
String name;