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 | |
Ramin Izadpanah | d2fc8cc | 2020-11-17 17:08:53 +0000 | [diff] [blame] | 29 | def returns_as_list(self, interface, full=False): |
Patrick Williams | 6f5ffc6 | 2022-03-12 07:58:23 -0600 | [diff] [blame] | 30 | return ", ".join( |
| 31 | [r.cppTypeParam(interface.name, full=full) for r in self.returns] |
| 32 | ) |
Ramin Izadpanah | d2fc8cc | 2020-11-17 17:08:53 +0000 | [diff] [blame] | 33 | |
| 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 Williams | 6f5ffc6 | 2022-03-12 07:58:23 -0600 | [diff] [blame] | 40 | return "std::tuple<" + self.returns_as_list(interface) + ">" |
Ramin Izadpanah | d2fc8cc | 2020-11-17 17:08:53 +0000 | [diff] [blame] | 41 | |
Patrick Williams | 0fc4aba | 2023-03-17 10:52:50 -0500 | [diff] [blame^] | 42 | def parameter(self, interface, p, defaultValue=False, ref=""): |
| 43 | r = "%s%s %s" % (p.cppTypeParam(interface.name), ref, p.camelCase) |
Ramin Izadpanah | d2fc8cc | 2020-11-17 17:08:53 +0000 | [diff] [blame] | 44 | if defaultValue: |
| 45 | r += p.default_value() |
| 46 | return r |
| 47 | |
Patrick Williams | 0fc4aba | 2023-03-17 10:52:50 -0500 | [diff] [blame^] | 48 | 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 Izadpanah | d2fc8cc | 2020-11-17 17:08:53 +0000 | [diff] [blame] | 63 | def get_parameters_str(self, interface, defaultValue=False): |
Patrick Williams | 0fc4aba | 2023-03-17 10:52:50 -0500 | [diff] [blame^] | 64 | return self.parameters_as_list( |
| 65 | lambda p: self.parameter(interface, p, defaultValue), |
| 66 | ",\n ", |
Patrick Williams | 6f5ffc6 | 2022-03-12 07:58:23 -0600 | [diff] [blame] | 67 | ) |
Ramin Izadpanah | d2fc8cc | 2020-11-17 17:08:53 +0000 | [diff] [blame] | 68 | |
Waqar Hameed | 3e3a665 | 2020-06-04 10:51:18 +0200 | [diff] [blame] | 69 | def or_cpp_flags(self, flags): |
| 70 | """Return the corresponding ORed cpp flags.""" |
Patrick Williams | 6f5ffc6 | 2022-03-12 07:58:23 -0600 | [diff] [blame] | 71 | 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 Hameed | 3e3a665 | 2020-06-04 10:51:18 +0200 | [diff] [blame] | 77 | |
| 78 | cpp_flags = [] |
| 79 | for flag in flags: |
| 80 | try: |
| 81 | cpp_flags.append(flags_dict[flag]) |
| 82 | except KeyError: |
Patrick Williams | 6f5ffc6 | 2022-03-12 07:58:23 -0600 | [diff] [blame] | 83 | raise ValueError('Invalid flag "{}"'.format(flag)) |
Waqar Hameed | 3e3a665 | 2020-06-04 10:51:18 +0200 | [diff] [blame] | 84 | |
| 85 | return " | ".join(cpp_flags) |