aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/bindings/codegen/CodegenRust.py
diff options
context:
space:
mode:
authorJosh Matthews <josh@joshmatthews.net>2020-07-09 20:03:03 -0400
committerJosh Matthews <josh@joshmatthews.net>2020-07-09 23:22:48 -0400
commit63528f6fdf192542cd811a2a3ef5f0cb2fecbc6b (patch)
treec5f8b49b5c754cf7c08467ace15e11c1ec4c64c4 /components/script/dom/bindings/codegen/CodegenRust.py
parentaa80f9139909b451d434093e0ef38266f56bda3e (diff)
downloadservo-63528f6fdf192542cd811a2a3ef5f0cb2fecbc6b.tar.gz
servo-63528f6fdf192542cd811a2a3ef5f0cb2fecbc6b.zip
dom: Generate iterator symbol for interfaces with indexed getters.
Diffstat (limited to 'components/script/dom/bindings/codegen/CodegenRust.py')
-rw-r--r--components/script/dom/bindings/codegen/CodegenRust.py23
1 files changed, 21 insertions, 2 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py
index c80fec57b5b..4d1a3972d7b 100644
--- a/components/script/dom/bindings/codegen/CodegenRust.py
+++ b/components/script/dom/bindings/codegen/CodegenRust.py
@@ -1672,8 +1672,27 @@ class MethodDefiner(PropertyDefiner):
"condition": PropertyDefiner.getControllingCondition(m, descriptor)}
for m in methods]
- # FIXME Check for an existing iterator on the interface first.
- if any(m.isGetter() and m.isIndexed() for m in methods):
+ # TODO: Once iterable is implemented, use tiebreak rules instead of
+ # failing. Also, may be more tiebreak rules to implement once spec bug
+ # is resolved.
+ # https://www.w3.org/Bugs/Public/show_bug.cgi?id=28592
+ def hasIterator(methods, regular):
+ return (any("@@iterator" in m.aliases for m in methods)
+ or any("@@iterator" == r["name"] for r in regular))
+
+ # Check whether we need to output an @@iterator due to having an indexed
+ # getter. We only do this while outputting non-static and
+ # non-unforgeable methods, since the @@iterator function will be
+ # neither.
+ if (not static
+ and not unforgeable
+ and descriptor.supportsIndexedProperties()): # noqa
+ if hasIterator(methods, self.regular): # noqa
+ raise TypeError("Cannot have indexed getter/attr on "
+ "interface %s with other members "
+ "that generate @@iterator, such as "
+ "maplike/setlike or aliased functions." %
+ self.descriptor.interface.identifier.name)
self.regular.append({"name": '@@iterator',
"methodInfo": False,
"selfHostedName": "$ArrayValues",