blob: 92bf1393abb51aefd5c0446d716a85100651ad40 [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
Patrick Williamsaf93b2d2023-04-25 20:26:21 -050029 def cpp_includes(self, interface):
Patrick Williams9bf2b232023-05-12 15:39:41 -050030 return interface.error_includes(self.errors) + interface.enum_includes(
31 self.returns + self.parameters
32 )
Patrick Williamsaf93b2d2023-04-25 20:26:21 -050033
Ramin Izadpanahd2fc8cc2020-11-17 17:08:53 +000034 def returns_as_list(self, interface, full=False):
Patrick Williams6f5ffc62022-03-12 07:58:23 -060035 return ", ".join(
36 [r.cppTypeParam(interface.name, full=full) for r in self.returns]
37 )
Ramin Izadpanahd2fc8cc2020-11-17 17:08:53 +000038
39 def cpp_return_type(self, interface):
40 if len(self.returns) == 0:
41 return "void"
42 elif len(self.returns) == 1:
43 return self.returns[0].cppTypeParam(interface.name)
44 else:
Patrick Williams6f5ffc62022-03-12 07:58:23 -060045 return "std::tuple<" + self.returns_as_list(interface) + ">"
Ramin Izadpanahd2fc8cc2020-11-17 17:08:53 +000046
Patrick Williams0fc4aba2023-03-17 10:52:50 -050047 def parameter(self, interface, p, defaultValue=False, ref=""):
48 r = "%s%s %s" % (p.cppTypeParam(interface.name), ref, p.camelCase)
Ramin Izadpanahd2fc8cc2020-11-17 17:08:53 +000049 if defaultValue:
50 r += p.default_value()
51 return r
52
Patrick Williams0fc4aba2023-03-17 10:52:50 -050053 def parameters_as_list(
54 self, transform=lambda p: p.camelCase, join_str=", "
55 ):
56 return join_str.join([transform(p) for p in self.parameters])
57
58 def parameters_as_arg_list(self, interface):
59 return self.parameters_as_list(
60 lambda p: self.parameter(interface, p, ref="&&")
61 )
62
63 def parameter_types_as_list(self, interface):
64 return self.parameters_as_list(
65 lambda p: p.cppTypeParam(interface.name, full=True)
66 )
67
Patrick Williamsecfff5c2023-04-26 11:36:00 -050068 def get_parameters_str(
69 self, interface, defaultValue=False, join_str=",\n "
70 ):
Patrick Williams0fc4aba2023-03-17 10:52:50 -050071 return self.parameters_as_list(
72 lambda p: self.parameter(interface, p, defaultValue),
Patrick Williamsecfff5c2023-04-26 11:36:00 -050073 join_str,
Patrick Williams6f5ffc62022-03-12 07:58:23 -060074 )
Ramin Izadpanahd2fc8cc2020-11-17 17:08:53 +000075
Waqar Hameed3e3a6652020-06-04 10:51:18 +020076 def or_cpp_flags(self, flags):
77 """Return the corresponding ORed cpp flags."""
Patrick Williams6f5ffc62022-03-12 07:58:23 -060078 flags_dict = {
79 "deprecated": "vtable::common_::deprecated",
80 "hidden": "vtable::common_::hidden",
81 "unprivileged": "vtable::common_::unprivileged",
82 "no_reply": "vtable::method_::no_reply",
83 }
Waqar Hameed3e3a6652020-06-04 10:51:18 +020084
85 cpp_flags = []
86 for flag in flags:
87 try:
88 cpp_flags.append(flags_dict[flag])
89 except KeyError:
Patrick Williams6f5ffc62022-03-12 07:58:23 -060090 raise ValueError('Invalid flag "{}"'.format(flag))
Waqar Hameed3e3a6652020-06-04 10:51:18 +020091
92 return " | ".join(cpp_flags)