diff options
author | Sam Atkins <atkinssj@serenityos.org> | 2022-04-05 16:09:42 +0100 |
---|---|---|
committer | Linus Groh <mail@linusgroh.de> | 2022-10-06 21:45:07 +0100 |
commit | a6f0508f9fb94b51ec522b5a8d9d133bc72e8f62 (patch) | |
tree | e33ed0667dd68347867ebc06233116bfb65355e4 /Userland/Libraries/LibIDL | |
parent | c30c6eb1c14ae7f72d05da6170e285d4bfc28c3f (diff) | |
download | serenity-a6f0508f9fb94b51ec522b5a8d9d133bc72e8f62.zip |
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. :^)
Diffstat (limited to 'Userland/Libraries/LibIDL')
-rw-r--r-- | Userland/Libraries/LibIDL/IDLParser.cpp | 9 | ||||
-rw-r--r-- | Userland/Libraries/LibIDL/Types.h | 1 |
2 files changed, 8 insertions, 2 deletions
diff --git a/Userland/Libraries/LibIDL/IDLParser.cpp b/Userland/Libraries/LibIDL/IDLParser.cpp index 4b89822e46..c576b0193d 100644 --- a/Userland/Libraries/LibIDL/IDLParser.cpp +++ b/Userland/Libraries/LibIDL/IDLParser.cpp @@ -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; } diff --git a/Userland/Libraries/LibIDL/Types.h b/Userland/Libraries/LibIDL/Types.h index e90af91074..e06c8f2a8f 100644 --- a/Userland/Libraries/LibIDL/Types.h +++ b/Userland/Libraries/LibIDL/Types.h @@ -176,6 +176,7 @@ struct Constant { }; struct Attribute { + bool inherit { false }; bool readonly { false }; NonnullRefPtr<Type> type; String name; |