blob: bb8460c77344eb6961de85e501258beb17156a9a [file] [log] [blame]
Patrick Williams1695cdf2016-10-09 16:14:51 -05001from .namedelement import NamedElement
Patrick Williams6f5ffc62022-03-12 07:58:23 -06002from .property import Property
Patrick Williams52dd41e2016-10-14 18:41:27 -05003from .renderer import Renderer
Patrick Williams1695cdf2016-10-09 16:14:51 -05004
Patrick Williamsf5c3cde2016-10-21 11:49:01 -05005
Patrick Williams52dd41e2016-10-14 18:41:27 -05006class Method(NamedElement, Renderer):
Patrick Williams1695cdf2016-10-09 16:14:51 -05007 def __init__(self, **kwargs):
Patrick Williams6f5ffc62022-03-12 07:58:23 -06008 self.parameters = [Property(**p) for p in kwargs.pop("parameters", [])]
9 self.returns = [Property(**r) for r in kwargs.pop("returns", [])]
10 self.flags = kwargs.pop("flags", [])
Waqar Hameed3e3a6652020-06-04 10:51:18 +020011 self.cpp_flags = self.or_cpp_flags(self.flags)
Patrick Williams6f5ffc62022-03-12 07:58:23 -060012 self.errors = kwargs.pop("errors", [])
Patrick Williams1695cdf2016-10-09 16:14:51 -050013
14 super(Method, self).__init__(**kwargs)
Patrick Williams96683fa2016-10-09 16:22:49 -050015
16 def markdown(self, loader):
Patrick Williams56216242020-05-21 15:33:50 -050017 return self.render(loader, "method.md.mako", method=self)
Patrick Williams04e007f2016-10-15 07:15:12 -050018
19 def cpp_prototype(self, loader, interface, ptype):
Patrick Williams6f5ffc62022-03-12 07:58:23 -060020 return self.render(
21 loader,
22 "method.prototype.hpp.mako",
23 method=self,
24 interface=interface,
25 ptype=ptype,
26 post=str.rstrip,
27 )
Waqar Hameed3e3a6652020-06-04 10:51:18 +020028
Ramin Izadpanahd2fc8cc2020-11-17 17:08:53 +000029 def returns_as_list(self, interface, full=False):
Patrick Williams6f5ffc62022-03-12 07:58:23 -060030 return ", ".join(
31 [r.cppTypeParam(interface.name, full=full) for r in self.returns]
32 )
Ramin Izadpanahd2fc8cc2020-11-17 17:08:53 +000033
34 def cpp_return_type(self, interface):
35 if len(self.returns) == 0:
36 return "void"
37 elif len(self.returns) == 1:
38 return self.returns[0].cppTypeParam(interface.name)
39 else:
Patrick Williams6f5ffc62022-03-12 07:58:23 -060040 return "std::tuple<" + self.returns_as_list(interface) + ">"
Ramin Izadpanahd2fc8cc2020-11-17 17:08:53 +000041
Patrick Williams0fc4aba2023-03-17 10:52:50 -050042 def parameter(self, interface, p, defaultValue=False, ref=""):
43 r = "%s%s %s" % (p.cppTypeParam(interface.name), ref, p.camelCase)
Ramin Izadpanahd2fc8cc2020-11-17 17:08:53 +000044 if defaultValue:
45 r += p.default_value()
46 return r
47
Patrick Williams0fc4aba2023-03-17 10:52:50 -050048 def parameters_as_list(
49 self, transform=lambda p: p.camelCase, join_str=", "
50 ):
51 return join_str.join([transform(p) for p in self.parameters])
52
53 def parameters_as_arg_list(self, interface):
54 return self.parameters_as_list(
55 lambda p: self.parameter(interface, p, ref="&&")
56 )
57
58 def parameter_types_as_list(self, interface):
59 return self.parameters_as_list(
60 lambda p: p.cppTypeParam(interface.name, full=True)
61 )
62
Ramin Izadpanahd2fc8cc2020-11-17 17:08:53 +000063 def get_parameters_str(self, interface, defaultValue=False):
Patrick Williams0fc4aba2023-03-17 10:52:50 -050064 return self.parameters_as_list(
65 lambda p: self.parameter(interface, p, defaultValue),
66 ",\n ",
Patrick Williams6f5ffc62022-03-12 07:58:23 -060067 )
Ramin Izadpanahd2fc8cc2020-11-17 17:08:53 +000068
Waqar Hameed3e3a6652020-06-04 10:51:18 +020069 def or_cpp_flags(self, flags):
70 """Return the corresponding ORed cpp flags."""
Patrick Williams6f5ffc62022-03-12 07:58:23 -060071 flags_dict = {
72 "deprecated": "vtable::common_::deprecated",
73 "hidden": "vtable::common_::hidden",
74 "unprivileged": "vtable::common_::unprivileged",
75 "no_reply": "vtable::method_::no_reply",
76 }
Waqar Hameed3e3a6652020-06-04 10:51:18 +020077
78 cpp_flags = []
79 for flag in flags:
80 try:
81 cpp_flags.append(flags_dict[flag])
82 except KeyError:
Patrick Williams6f5ffc62022-03-12 07:58:23 -060083 raise ValueError('Invalid flag "{}"'.format(flag))
Waqar Hameed3e3a6652020-06-04 10:51:18 +020084
85 return " | ".join(cpp_flags)