diff options
author | yvt <i@yvt.jp> | 2021-07-27 01:31:08 +0900 |
---|---|---|
committer | yvt <i@yvt.jp> | 2021-07-27 01:31:08 +0900 |
commit | 2e0dd0816f8385fda04e69908916e0fe00fb6d39 (patch) | |
tree | d2e5b9504ba35d5b0fe033cb18644c502a6b94ac /components/script/dom/bindings/codegen/CodegenRust.py | |
parent | c28e98ec40e0950e77c60b32af023c6eb7da7366 (diff) | |
download | servo-2e0dd0816f8385fda04e69908916e0fe00fb6d39.tar.gz servo-2e0dd0816f8385fda04e69908916e0fe00fb6d39.zip |
refactor(script): refactor common code into `PropertyDefiner.generateUnguardedArray`
There are code fragments in `(Method|Attr)Definer.generateArray` that
are much alike. This commit refactors them into a new method of
`PropertyDefiner` named `generateUnguardedArray` (in contrast to the
existing method `generateGuardedArray`).
Diffstat (limited to 'components/script/dom/bindings/codegen/CodegenRust.py')
-rw-r--r-- | components/script/dom/bindings/codegen/CodegenRust.py | 58 |
1 files changed, 38 insertions, 20 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 1319dbab3a6..d1a32f9352d 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -1642,6 +1642,33 @@ class PropertyDefiner: + "];\n") % (name, specType) return specsArray + prefArray + def generateUnguardedArray(self, array, name, specTemplate, specTerminator, + specType, getCondition, getDataTuple): + """ + Takes the same set of parameters as generateGuardedArray but instead + generates a single, flat array of type `&[specType]` that contains all + provided members. The provided members' conditions shall be homogeneous, + or else this method will fail. + """ + + # this method can't handle heterogeneous condition + groups = groupby(array, lambda m: getCondition(m, self.descriptor)) + assert len(list(groups)) == 1 + + origTemplate = specTemplate + if isinstance(specTemplate, str): + specTemplate = lambda _: origTemplate # noqa + + specsArray = [specTemplate(m) % getDataTuple(m) for m in array] + specsArray.append(specTerminator) + + return dedent( + """ + const %s: &[%s] = &[ + %s + ]; + """) % (name, specType, ',\n'.join(specsArray)) + # The length of a method is the minimum of the lengths of the # argument lists of all its overloads. @@ -1829,16 +1856,11 @@ class MethodDefiner(PropertyDefiner): ' }') if self.crossorigin: - groups = groupby(array, lambda m: condition(m, self.descriptor)) - assert len(list(groups)) == 1 # can't handle mixed condition - elems = [specTemplate % specData(m) for m in array] - return dedent( - """ - const %s: &[JSFunctionSpec] = &[ - %s, - %s, - ]; - """) % (name, ',\n'.join(elems), specTerminator) + return self.generateUnguardedArray( + array, name, + specTemplate, specTerminator, + 'JSFunctionSpec', + condition, specData) else: return self.generateGuardedArray( array, name, @@ -1983,16 +2005,12 @@ class AttrDefiner(PropertyDefiner): """ if self.crossorigin: - groups = groupby(array, lambda m: condition(m, self.descriptor)) - assert len(list(groups)) == 1 # can't handle mixed condition - elems = [template(m) % specData(m) for m in array] - return dedent( - """ - const %s: &[JSPropertySpec] = &[ - %s, - JSPropertySpec::ZERO, - ]; - """) % (name, ',\n'.join(elems)) + return self.generateUnguardedArray( + array, name, + template, + ' JSPropertySpec::ZERO', + 'JSPropertySpec', + condition, specData) else: return self.generateGuardedArray( array, name, |