IDLGenerator: Use fully qualified type names for namespace conflicts

This commit is contained in:
Luke Wilde 2025-08-28 20:13:55 +01:00 committed by Andreas Kling
commit 36d5e814ef
Notes: github-actions[bot] 2025-09-01 19:12:09 +00:00

View file

@ -630,7 +630,24 @@ static void generate_to_cpp(SourceGenerator& generator, ParameterType& parameter
scoped_generator.set("js_name", js_name); scoped_generator.set("js_name", js_name);
scoped_generator.set("js_suffix", js_suffix); scoped_generator.set("js_suffix", js_suffix);
scoped_generator.set("legacy_null_to_empty_string", legacy_null_to_empty_string ? "true" : "false"); scoped_generator.set("legacy_null_to_empty_string", legacy_null_to_empty_string ? "true" : "false");
scoped_generator.set("parameter.type.name", parameter.type->name());
auto const& type = parameter.type;
scoped_generator.set("parameter.type.name", type->name());
if (!libweb_interface_namespaces.span().contains_slow(type->name())) {
if (is_javascript_builtin(type))
scoped_generator.set("parameter.type.name.normalized", ByteString::formatted("JS::{}", type->name()));
else
scoped_generator.set("parameter.type.name.normalized", type->name());
} else {
// e.g. Document.getSelection which returns Selection, which is in the Selection namespace.
StringBuilder builder;
builder.append(type->name());
builder.append("::"sv);
builder.append(type->name());
scoped_generator.set("parameter.type.name.normalized", builder.to_byte_string());
}
scoped_generator.set("parameter.name", parameter.name); scoped_generator.set("parameter.name", parameter.name);
if (explicit_null) { if (explicit_null) {
@ -685,41 +702,41 @@ static void generate_to_cpp(SourceGenerator& generator, ParameterType& parameter
if (!parameter.type->is_nullable()) { if (!parameter.type->is_nullable()) {
if (!optional) { if (!optional) {
scoped_generator.append(R"~~~( scoped_generator.append(R"~~~(
if (!@js_name@@js_suffix@.is_object() || !is<@parameter.type.name@>(@js_name@@js_suffix@.as_object())) if (!@js_name@@js_suffix@.is_object() || !is<@parameter.type.name.normalized@>(@js_name@@js_suffix@.as_object()))
return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotAnObjectOfType, "@parameter.type.name@"); return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotAnObjectOfType, "@parameter.type.name@");
auto& @cpp_name@ = static_cast<@parameter.type.name@&>(@js_name@@js_suffix@.as_object()); auto& @cpp_name@ = static_cast<@parameter.type.name.normalized@&>(@js_name@@js_suffix@.as_object());
)~~~"); )~~~");
} else { } else {
scoped_generator.append(R"~~~( scoped_generator.append(R"~~~(
GC::Ptr<@parameter.type.name@> @cpp_name@; GC::Ptr<@parameter.type.name.normalized@> @cpp_name@;
if (!@js_name@@js_suffix@.is_undefined()) { if (!@js_name@@js_suffix@.is_undefined()) {
if (!@js_name@@js_suffix@.is_object() || !is<@parameter.type.name@>(@js_name@@js_suffix@.as_object())) if (!@js_name@@js_suffix@.is_object() || !is<@parameter.type.name.normalized@>(@js_name@@js_suffix@.as_object()))
return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotAnObjectOfType, "@parameter.type.name@"); return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotAnObjectOfType, "@parameter.type.name@");
@cpp_name@ = static_cast<@parameter.type.name@&>(@js_name@@js_suffix@.as_object()); @cpp_name@ = static_cast<@parameter.type.name.normalized@&>(@js_name@@js_suffix@.as_object());
} }
)~~~"); )~~~");
} }
} else { } else {
if (explicit_null) { if (explicit_null) {
scoped_generator.append(R"~~~( scoped_generator.append(R"~~~(
Optional<GC::Ptr<@parameter.type.name@>> @cpp_name@; Optional<GC::Ptr<@parameter.type.name.normalized@>> @cpp_name@;
if (maybe_@js_name@@js_suffix@.has_value()) { if (maybe_@js_name@@js_suffix@.has_value()) {
auto @js_name@@js_suffix@ = maybe_@js_name@@js_suffix@.release_value(); auto @js_name@@js_suffix@ = maybe_@js_name@@js_suffix@.release_value();
)~~~"); )~~~");
} else { } else {
scoped_generator.append(R"~~~( scoped_generator.append(R"~~~(
GC::Ptr<@parameter.type.name@> @cpp_name@; GC::Ptr<@parameter.type.name.normalized@> @cpp_name@;
)~~~"); )~~~");
} }
scoped_generator.append(R"~~~( scoped_generator.append(R"~~~(
if (!@js_name@@js_suffix@.is_nullish()) { if (!@js_name@@js_suffix@.is_nullish()) {
if (!@js_name@@js_suffix@.is_object() || !is<@parameter.type.name@>(@js_name@@js_suffix@.as_object())) if (!@js_name@@js_suffix@.is_object() || !is<@parameter.type.name.normalized@>(@js_name@@js_suffix@.as_object()))
return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotAnObjectOfType, "@parameter.type.name@"); return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotAnObjectOfType, "@parameter.type.name@");
@cpp_name@ = &static_cast<@parameter.type.name@&>(@js_name@@js_suffix@.as_object()); @cpp_name@ = &static_cast<@parameter.type.name.normalized@&>(@js_name@@js_suffix@.as_object());
} }
)~~~"); )~~~");
@ -925,7 +942,7 @@ static void generate_to_cpp(SourceGenerator& generator, ParameterType& parameter
enum_generator.set("enum.default.cpp_value", *default_value_cpp_name); enum_generator.set("enum.default.cpp_value", *default_value_cpp_name);
enum_generator.set("js_name.as_string", ByteString::formatted("{}{}_string", enum_generator.get("js_name"sv), enum_generator.get("js_suffix"sv))); enum_generator.set("js_name.as_string", ByteString::formatted("{}{}_string", enum_generator.get("js_name"sv), enum_generator.get("js_suffix"sv)));
enum_generator.append(R"~~~( enum_generator.append(R"~~~(
@parameter.type.name@ @cpp_name@ { @parameter.type.name@::@enum.default.cpp_value@ }; @parameter.type.name.normalized@ @cpp_name@ { @parameter.type.name.normalized@::@enum.default.cpp_value@ };
)~~~"); )~~~");
if (optional) { if (optional) {
@ -947,7 +964,7 @@ static void generate_to_cpp(SourceGenerator& generator, ParameterType& parameter
enum_generator.append(R"~~~( enum_generator.append(R"~~~(
@else@if (@js_name.as_string@ == "@enum.alt.name@"sv) @else@if (@js_name.as_string@ == "@enum.alt.name@"sv)
@cpp_name@ = @parameter.type.name@::@enum.alt.value@; @cpp_name@ = @parameter.type.name.normalized@::@enum.alt.value@;
)~~~"); )~~~");
} }
@ -977,7 +994,7 @@ static void generate_to_cpp(SourceGenerator& generator, ParameterType& parameter
if (!@js_name@@js_suffix@.is_nullish() && !@js_name@@js_suffix@.is_object()) if (!@js_name@@js_suffix@.is_nullish() && !@js_name@@js_suffix@.is_object())
return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotAnObjectOfType, "@parameter.type.name@"); return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotAnObjectOfType, "@parameter.type.name@");
@parameter.type.name@ @cpp_name@ {}; @parameter.type.name.normalized@ @cpp_name@ {};
)~~~"); )~~~");
auto current_dictionary_name = parameter.type->name(); auto current_dictionary_name = parameter.type->name();
auto* current_dictionary = &interface.dictionaries.find(current_dictionary_name)->value; auto* current_dictionary = &interface.dictionaries.find(current_dictionary_name)->value;