aboutsummaryrefslogtreecommitdiffstats
path: root/components/script_bindings/codegen/CodegenRust.py
diff options
context:
space:
mode:
authorMukilan Thiyagarajan <mukilan@igalia.com>2025-02-27 12:34:11 +0530
committerGitHub <noreply@github.com>2025-02-27 07:04:11 +0000
commit3cf4ef61efce446d46634eecfee0383296d5a7b5 (patch)
tree4d42970e7da7bf51df5fbfe1aa1d7e4969f530da /components/script_bindings/codegen/CodegenRust.py
parent1d6277610258188da3cb29da896c6f134bcbaff8 (diff)
downloadservo-3cf4ef61efce446d46634eecfee0383296d5a7b5.tar.gz
servo-3cf4ef61efce446d46634eecfee0383296d5a7b5.zip
bindings: Fix support for interface members in setlike/maplike. (#35651)
#30151 added support for setlike and maplike declarations in WebIDL, but the tests only validated if generator code worked with 'DOMString' as the key type. The support for interface type as members was broken as `DomRoot<T>` didn't satify the bounds `Eq` and `Hash` needed by the `Key` and `Value` types in `Setlike` and `Maplike` traits respectively. In addition, the splitting of bindings into a separate 'script_bindings' crate had also broken support for this in CodegenRust.py, as the types used within the definition of `DomTraits` were not referenced using `Self::`. This patch fixes the WebIDL code generator by doing a simple string replacement on the return value of `getRetvalDeclarationForType` so that the proper `Self::` is used. I'm not not sure if there is a better approach to this as it seems most logic in CodegenRust.py uses the `D::` prefix that is expected to be available only when compiling `script` crate and not `script_bindings`. This patch also adds the missing trait implementations for `DomRoot` and ensures that the generated code works for both members of primitive and interface types by splitting the existing `TestBinding{Map,Set}Like` interfaces into `TestBinding{Map,Set}LikeWith{Primitive,Interface}` tests. Fixes #35542. Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
Diffstat (limited to 'components/script_bindings/codegen/CodegenRust.py')
-rw-r--r--components/script_bindings/codegen/CodegenRust.py22
1 files changed, 18 insertions, 4 deletions
diff --git a/components/script_bindings/codegen/CodegenRust.py b/components/script_bindings/codegen/CodegenRust.py
index 8ad55f4657e..ffd2589376a 100644
--- a/components/script_bindings/codegen/CodegenRust.py
+++ b/components/script_bindings/codegen/CodegenRust.py
@@ -2688,6 +2688,10 @@ def DomTypes(descriptors, descriptorProvider, dictionaries, callbacks, typedefs,
]
joinedTraits = ' + '.join(traits)
elements = [CGGeneric(f"pub(crate) trait DomTypes: {joinedTraits} where Self: 'static {{\n")]
+
+ def fixupInterfaceTypeReferences(typename):
+ return typename.replace("D::", "Self::")
+
for descriptor in descriptors:
iface_name = descriptor.interface.identifier.name
traits = []
@@ -2711,11 +2715,17 @@ def DomTypes(descriptors, descriptorProvider, dictionaries, callbacks, typedefs,
iterableDecl = descriptor.interface.maplikeOrSetlikeOrIterable
if iterableDecl:
if iterableDecl.isMaplike():
- keytype = getRetvalDeclarationForType(iterableDecl.keyType, None).define()
- valuetype = getRetvalDeclarationForType(iterableDecl.valueType, None).define()
+ keytype = fixupInterfaceTypeReferences(
+ getRetvalDeclarationForType(iterableDecl.keyType, descriptor).define()
+ )
+ valuetype = fixupInterfaceTypeReferences(
+ getRetvalDeclarationForType(iterableDecl.valueType, descriptor).define()
+ )
traits += [f"crate::dom::bindings::like::Maplike<Key={keytype}, Value={valuetype}>"]
if iterableDecl.isSetlike():
- keytype = getRetvalDeclarationForType(iterableDecl.keyType, None).define()
+ keytype = fixupInterfaceTypeReferences(
+ getRetvalDeclarationForType(iterableDecl.keyType, descriptor).define()
+ )
traits += [f"crate::dom::bindings::like::Setlike<Key={keytype}>"]
if iterableDecl.hasKeyType():
traits += [
@@ -2769,7 +2779,11 @@ def DomTypes(descriptors, descriptorProvider, dictionaries, callbacks, typedefs,
CGGeneric(f" type {firstCap(iface_name)}: {' + '.join(traits)};\n")
]
elements += [CGGeneric("}\n")]
- return CGList([CGGeneric("use crate::dom::bindings::str::DOMString;\n")] + elements)
+ imports = [
+ CGGeneric("use crate::dom::bindings::root::DomRoot;\n"),
+ CGGeneric("use crate::dom::bindings::str::DOMString;\n"),
+ ]
+ return CGList(imports + elements)
def DomTypeHolder(descriptors, descriptorProvider, dictionaries, callbacks, typedefs, config):