diff options
Diffstat (limited to 'components/script/dom/bindings/codegen/CodegenRust.py')
-rw-r--r-- | components/script/dom/bindings/codegen/CodegenRust.py | 51 |
1 files changed, 46 insertions, 5 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 2513b5b92eb..8360dfc322a 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -8,6 +8,7 @@ from collections import defaultdict from itertools import groupby import operator +import os import re import string import textwrap @@ -87,6 +88,11 @@ def stripTrailingWhitespace(text): return '\n'.join(lines) + tail +def innerSequenceType(type): + assert type.isSequence() + return type.inner.inner if type.nullable() else type.inner + + def MakeNativeName(name): return name[0].upper() + name[1:] @@ -713,7 +719,7 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None, raise TypeError("Can't handle array arguments yet") if type.isSequence(): - innerInfo = getJSToNativeConversionInfo(type.unroll(), descriptorProvider) + innerInfo = getJSToNativeConversionInfo(innerSequenceType(type), descriptorProvider) declType = CGWrapper(innerInfo.declType, pre="Vec<", post=">") config = getConversionConfigForType(type, isEnforceRange, isClamp, treatNullAs) @@ -1302,8 +1308,7 @@ def getRetvalDeclarationForType(returnType, descriptorProvider): if returnType.isObject() or returnType.isSpiderMonkeyInterface(): return CGGeneric("*mut JSObject") if returnType.isSequence(): - inner = returnType.unroll() - result = getRetvalDeclarationForType(inner, descriptorProvider) + result = getRetvalDeclarationForType(innerSequenceType(returnType), descriptorProvider) result = CGWrapper(result, pre="Vec<", post=">") if returnType.nullable(): result = CGWrapper(result, pre="Option<", post=">") @@ -2072,7 +2077,7 @@ def UnionTypes(descriptors, dictionaries, callbacks, config): 'dom::bindings::conversions::root_from_handlevalue', 'dom::bindings::error::throw_not_in_union', 'dom::bindings::js::Root', - 'dom::bindings::str::{DOMString, USVString}', + 'dom::bindings::str::{ByteString, DOMString, USVString}', 'dom::types::*', 'js::jsapi::JSContext', 'js::jsapi::{HandleValue, MutableHandleValue}', @@ -3743,12 +3748,15 @@ def getUnionTypeTemplateVars(type, descriptorProvider): typeName = name elif type.isSequence(): name = type.name - inner = getUnionTypeTemplateVars(type.unroll(), descriptorProvider) + inner = getUnionTypeTemplateVars(innerSequenceType(type), descriptorProvider) typeName = "Vec<" + inner["typeName"] + ">" elif type.isArray(): name = str(type) # XXXjdm dunno about typeName here typeName = "/*" + type.name + "*/" + elif type.isByteString(): + name = type.name + typeName = "ByteString" elif type.isDOMString(): name = type.name typeName = "DOMString" @@ -6437,3 +6445,36 @@ impl %(base)s { # Done. return curr + + @staticmethod + def SupportedDomApis(config): + descriptors = config.getDescriptors(isExposedConditionally=False) + + base_path = os.path.join('dom', 'bindings', 'codegen') + with open(os.path.join(base_path, 'apis.html.template')) as f: + base_template = f.read() + with open(os.path.join(base_path, 'api.html.template')) as f: + api_template = f.read() + with open(os.path.join(base_path, 'property.html.template')) as f: + property_template = f.read() + with open(os.path.join(base_path, 'interface.html.template')) as f: + interface_template = f.read() + + apis = [] + interfaces = [] + for descriptor in descriptors: + props = [] + for m in descriptor.interface.members: + if PropertyDefiner.getStringAttr(m, 'Pref') or \ + PropertyDefiner.getStringAttr(m, 'Func') or \ + (m.isMethod() and m.isIdentifierLess()): + continue + display = m.identifier.name + ('()' if m.isMethod() else '') + props += [property_template.replace('${name}', display)] + name = descriptor.interface.identifier.name + apis += [(api_template.replace('${interface}', name) + .replace('${properties}', '\n'.join(props)))] + interfaces += [interface_template.replace('${interface}', name)] + + return CGGeneric((base_template.replace('${apis}', '\n'.join(apis)) + .replace('${interfaces}', '\n'.join(interfaces)))) |