ladybird/Meta/Generators/libweb_bindings/callback_interfaces.py
Shannon Booth dba62aefc0 LibWeb/Bindings: Port IDL bindings generator to Python
Replace the Lagom C++ bindings generator invocation with the new Python
generator under Meta/Generators/libweb_bindings.

Fold the exposed-interface generation into the same generator entry
point, and keep generated overload metadata using the existing LibIDL
types for now.
2026-06-08 01:11:40 +02:00

65 lines
2 KiB
Python

# Copyright (c) 2026-present, the Ladybird developers.
#
# SPDX-License-Identifier: BSD-2-Clause
from typing import TextIO
from Generators.libweb_bindings.constants import define_the_constants
from Generators.libweb_bindings.context import GenerationContext
from Generators.libweb_bindings.includes import GeneratedIncludes
from Utils.webidl_parser import Interface
def write_callback_interface_declaration(
out: TextIO, includes: GeneratedIncludes, context: GenerationContext, interface: Interface
) -> None:
if not interface.constants:
return
includes.add("LibJS/Runtime/NativeFunction.h")
includes.add("LibJS/Runtime/Object.h")
out.write(f"""struct {interface.constructor_class} {{
public:
static void initialize(JS::Realm&, JS::NativeFunction&);
}};
struct {interface.prototype_class} {{
public:
static void initialize(JS::Realm&, JS::Object&);
}};
""")
def write_callback_interface_implementation(
out: TextIO, context: GenerationContext, includes: GeneratedIncludes, interface: Interface
) -> None:
if not interface.constants:
return
includes.add("LibJS/Runtime/Realm.h")
includes.add("LibJS/Runtime/ValueInlines.h")
includes.add("LibJS/Runtime/VM.h")
includes.add_binding(interface.implemented_name)
out.write(f"""void {interface.constructor_class}::initialize(JS::Realm& realm, JS::NativeFunction& object)
{{
auto& vm = realm.vm();
[[maybe_unused]] u8 default_attributes = JS::Attribute::Enumerable;
object.define_direct_property(vm.names.length, JS::Value(0), JS::Attribute::Configurable);
object.define_direct_property(vm.names.name, JS::PrimitiveString::create(vm, "{interface.name}"_string), JS::Attribute::Configurable);
""")
define_the_constants(out, context, includes, interface)
out.write(
f"""}}
void {interface.prototype_class}::initialize(JS::Realm& realm, JS::Object& object)
{{
object.set_prototype(realm.intrinsics().object_prototype());
}}
"""
)