aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/bindings/codegen/CodegenRust.py
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/bindings/codegen/CodegenRust.py')
-rw-r--r--components/script/dom/bindings/codegen/CodegenRust.py51
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))))