Patrick Williams | 1695cdf | 2016-10-09 16:14:51 -0500 | [diff] [blame] | 1 | from .namedelement import NamedElement |
Patrick Williams | 6f5ffc6 | 2022-03-12 07:58:23 -0600 | [diff] [blame] | 2 | from .property import Property |
Patrick Williams | 52dd41e | 2016-10-14 18:41:27 -0500 | [diff] [blame] | 3 | from .renderer import Renderer |
Patrick Williams | 1695cdf | 2016-10-09 16:14:51 -0500 | [diff] [blame] | 4 | |
Patrick Williams | f5c3cde | 2016-10-21 11:49:01 -0500 | [diff] [blame] | 5 | |
Patrick Williams | 52dd41e | 2016-10-14 18:41:27 -0500 | [diff] [blame] | 6 | class Method(NamedElement, Renderer): |
Patrick Williams | 1695cdf | 2016-10-09 16:14:51 -0500 | [diff] [blame] | 7 | def __init__(self, **kwargs): |
Patrick Williams | 6f5ffc6 | 2022-03-12 07:58:23 -0600 | [diff] [blame] | 8 | 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 Hameed | 3e3a665 | 2020-06-04 10:51:18 +0200 | [diff] [blame] | 11 | self.cpp_flags = self.or_cpp_flags(self.flags) |
Patrick Williams | 6f5ffc6 | 2022-03-12 07:58:23 -0600 | [diff] [blame] | 12 | self.errors = kwargs.pop("errors", []) |
Patrick Williams | 1695cdf | 2016-10-09 16:14:51 -0500 | [diff] [blame] | 13 | |
| 14 | super(Method, self).__init__(**kwargs) |
Patrick Williams | 96683fa | 2016-10-09 16:22:49 -0500 | [diff] [blame] | 15 | |
| 16 | def markdown(self, loader): |
Patrick Williams | 5621624 | 2020-05-21 15:33:50 -0500 | [diff] [blame] | 17 | return self.render(loader, "method.md.mako", method=self) |
Patrick Williams | 04e007f | 2016-10-15 07:15:12 -0500 | [diff] [blame] | 18 | |
| 19 | def cpp_prototype(self, loader, interface, ptype): |
Patrick Williams | 6f5ffc6 | 2022-03-12 07:58:23 -0600 | [diff] [blame] | 20 | 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 Hameed | 3e3a665 | 2020-06-04 10:51:18 +0200 | [diff] [blame] | 28 | |
Patrick Williams | af93b2d | 2023-04-25 20:26:21 -0500 | [diff] [blame] | 29 | def cpp_includes(self, interface): |
Patrick Williams | 9bf2b23 | 2023-05-12 15:39:41 -0500 | [diff] [blame] | 30 | return interface.error_includes(self.errors) + interface.enum_includes( |
| 31 | self.returns + self.parameters |
| 32 | ) |
Patrick Williams | af93b2d | 2023-04-25 20:26:21 -0500 | [diff] [blame] | 33 | |
Ramin Izadpanah | d2fc8cc | 2020-11-17 17:08:53 +0000 | [diff] [blame] | 34 | def returns_as_list(self, interface, full=False): |
Patrick Williams | 6f5ffc6 | 2022-03-12 07:58:23 -0600 | [diff] [blame] | 35 | return ", ".join( |
| 36 | [r.cppTypeParam(interface.name, full=full) for r in self.returns] |
| 37 | ) |
Ramin Izadpanah | d2fc8cc | 2020-11-17 17:08:53 +0000 | [diff] [blame] | 38 | |
| 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 Williams | 6f5ffc6 | 2022-03-12 07:58:23 -0600 | [diff] [blame] | 45 | return "std::tuple<" + self.returns_as_list(interface) + ">" |
Ramin Izadpanah | d2fc8cc | 2020-11-17 17:08:53 +0000 | [diff] [blame] | 46 | |
Patrick Williams | 0fc4aba | 2023-03-17 10:52:50 -0500 | [diff] [blame] | 47 | def parameter(self, interface, p, defaultValue=False, ref=""): |
| 48 | r = "%s%s %s" % (p.cppTypeParam(interface.name), ref, p.camelCase) |
Ramin Izadpanah | d2fc8cc | 2020-11-17 17:08:53 +0000 | [diff] [blame] | 49 | if defaultValue: |
| 50 | r += p.default_value() |
| 51 | return r |
| 52 | |
Patrick Williams | 0fc4aba | 2023-03-17 10:52:50 -0500 | [diff] [blame] | 53 | 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 Williams | ecfff5c | 2023-04-26 11:36:00 -0500 | [diff] [blame] | 68 | def get_parameters_str( |
| 69 | self, interface, defaultValue=False, join_str=",\n " |
| 70 | ): |
Patrick Williams | 0fc4aba | 2023-03-17 10:52:50 -0500 | [diff] [blame] | 71 | return self.parameters_as_list( |
| 72 | lambda p: self.parameter(interface, p, defaultValue), |
Patrick Williams | ecfff5c | 2023-04-26 11:36:00 -0500 | [diff] [blame] | 73 | join_str, |
Patrick Williams | 6f5ffc6 | 2022-03-12 07:58:23 -0600 | [diff] [blame] | 74 | ) |
Ramin Izadpanah | d2fc8cc | 2020-11-17 17:08:53 +0000 | [diff] [blame] | 75 | |
Waqar Hameed | 3e3a665 | 2020-06-04 10:51:18 +0200 | [diff] [blame] | 76 | def or_cpp_flags(self, flags): |
| 77 | """Return the corresponding ORed cpp flags.""" |
Patrick Williams | 6f5ffc6 | 2022-03-12 07:58:23 -0600 | [diff] [blame] | 78 | 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 Hameed | 3e3a665 | 2020-06-04 10:51:18 +0200 | [diff] [blame] | 84 | |
| 85 | cpp_flags = [] |
| 86 | for flag in flags: |
| 87 | try: |
| 88 | cpp_flags.append(flags_dict[flag]) |
| 89 | except KeyError: |
Patrick Williams | 6f5ffc6 | 2022-03-12 07:58:23 -0600 | [diff] [blame] | 90 | raise ValueError('Invalid flag "{}"'.format(flag)) |
Waqar Hameed | 3e3a665 | 2020-06-04 10:51:18 +0200 | [diff] [blame] | 91 | |
| 92 | return " | ".join(cpp_flags) |