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:
parent
c30c6eb1c1
commit
a6f0508f9f
3 changed files with 10 additions and 3 deletions
|
@ -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() ? "?" : "",
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -176,6 +176,7 @@ struct Constant {
|
|||
};
|
||||
|
||||
struct Attribute {
|
||||
bool inherit { false };
|
||||
bool readonly { false };
|
||||
NonnullRefPtr<Type> type;
|
||||
String name;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue