blob: 7dbb42173517d4e01802aebe49020bb7e9528fd2 [file] [log] [blame]
from .property import Property
from .namedelement import NamedElement
from .renderer import Renderer
class Method(NamedElement, Renderer):
def __init__(self, **kwargs):
self.parameters = \
[Property(**p) for p in kwargs.pop('parameters', [])]
self.returns = \
[Property(**r) for r in kwargs.pop('returns', [])]
self.flags = kwargs.pop('flags', [])
self.cpp_flags = self.or_cpp_flags(self.flags)
self.errors = kwargs.pop('errors', [])
super(Method, self).__init__(**kwargs)
def markdown(self, loader):
return self.render(loader, "method.md.mako", method=self)
def cpp_prototype(self, loader, interface, ptype):
return self.render(loader, "method.prototype.hpp.mako", method=self,
interface=interface, ptype=ptype, post=str.rstrip)
def returns_as_list(self, interface, full=False):
return ", ".join([r.cppTypeParam(interface.name, full=full)
for r in self.returns])
def cpp_return_type(self, interface):
if len(self.returns) == 0:
return "void"
elif len(self.returns) == 1:
return self.returns[0].cppTypeParam(interface.name)
else:
return "std::tuple<" + \
self.returns_as_list(interface) + \
">"
def parameter(self, interface, p, defaultValue=False):
r = "%s %s" % (p.cppTypeParam(interface.name), p.camelCase)
if defaultValue:
r += p.default_value()
return r
def get_parameters_str(self, interface, defaultValue=False):
return ",\n ".join(
[self.parameter(interface, p, defaultValue)
for p in self.parameters])
def or_cpp_flags(self, flags):
"""Return the corresponding ORed cpp flags."""
flags_dict = {"deprecated": "vtable::common_::deprecated",
"hidden": "vtable::common_::hidden",
"unprivileged": "vtable::common_::unprivileged",
"no_reply": "vtable::method_::no_reply"}
cpp_flags = []
for flag in flags:
try:
cpp_flags.append(flags_dict[flag])
except KeyError:
raise ValueError("Invalid flag \"{}\"".format(flag))
return " | ".join(cpp_flags)