From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- xpcom/idl-parser/xpidl/rust_macros.py | 108 ++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 xpcom/idl-parser/xpidl/rust_macros.py (limited to 'xpcom/idl-parser/xpidl/rust_macros.py') diff --git a/xpcom/idl-parser/xpidl/rust_macros.py b/xpcom/idl-parser/xpidl/rust_macros.py new file mode 100644 index 0000000000..d610a08d31 --- /dev/null +++ b/xpcom/idl-parser/xpidl/rust_macros.py @@ -0,0 +1,108 @@ +# rust_macros.py - Generate rust_macros bindings from IDL. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +"""Generate rust bindings information for the IDL file specified""" + +from xpidl import rust, xpidl + +derive_method_tmpl = """\ +Method { + name: "%(name)s", + params: &[%(params)s], + ret: "%(ret)s", +}""" + + +def attrAsMethodStruct(iface, m, getter): + params = [ + 'Param { name: "%s", ty: "%s" }' % x + for x in rust.attributeRawParamList(iface, m, getter) + ] + return derive_method_tmpl % { + "name": rust.attributeNativeName(m, getter), + "params": ", ".join(params), + "ret": "::nserror::nsresult", + } + + +def methodAsMethodStruct(iface, m): + params = [ + 'Param { name: "%s", ty: "%s" }' % x for x in rust.methodRawParamList(iface, m) + ] + return derive_method_tmpl % { + "name": rust.methodNativeName(m), + "params": ", ".join(params), + "ret": rust.methodReturnType(m), + } + + +derive_iface_tmpl = """\ +Interface { + name: "%(name)s", + base: %(base)s, + methods: %(methods)s, +}, +""" + + +def write_interface(iface, fd): + if iface.namemap is None: + raise Exception("Interface was not resolved.") + + assert iface.base or (iface.name == "nsISupports") + + base = 'Some("%s")' % iface.base if iface.base is not None else "None" + try: + methods = "" + for member in iface.members: + if type(member) == xpidl.Attribute: + methods += "/* %s */\n" % member.toIDL() + methods += "%s,\n" % attrAsMethodStruct(iface, member, True) + if not member.readonly: + methods += "%s,\n" % attrAsMethodStruct(iface, member, False) + methods += "\n" + + elif type(member) == xpidl.Method: + methods += "/* %s */\n" % member.toIDL() + methods += "%s,\n\n" % methodAsMethodStruct(iface, member) + fd.write( + derive_iface_tmpl + % { + "name": iface.name, + "base": base, + "methods": "Ok(&[\n%s])" % methods, + } + ) + except xpidl.RustNoncompat as reason: + fd.write( + derive_iface_tmpl + % { + "name": iface.name, + "base": base, + "methods": 'Err("%s")' % reason, + } + ) + + +header = """\ +// +// DO NOT EDIT. THIS FILE IS GENERATED FROM $SRCDIR/%(relpath)s +// + +""" + + +def print_rust_macros_bindings(idl, fd, relpath): + fd = rust.AutoIndent(fd) + + fd.write(header % {"relpath": relpath}) + fd.write("{static D: &'static [Interface] = &[\n") + + for p in idl.productions: + if p.kind == "interface": + write_interface(p, fd) + + fd.write("]; D}\n") -- cgit v1.2.3