summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibIDL
diff options
context:
space:
mode:
authorSam Atkins <atkinssj@serenityos.org>2022-04-05 16:09:42 +0100
committerLinus Groh <mail@linusgroh.de>2022-10-06 21:45:07 +0100
commita6f0508f9fb94b51ec522b5a8d9d133bc72e8f62 (patch)
treee33ed0667dd68347867ebc06233116bfb65355e4 /Userland/Libraries/LibIDL
parentc30c6eb1c14ae7f72d05da6170e285d4bfc28c3f (diff)
downloadserenity-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.cpp9
-rw-r--r--Userland/Libraries/LibIDL/Types.h1
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;