1from .namedelement import NamedElement 2from .property import Property 3from .renderer import Renderer 4 5 6class Method(NamedElement, Renderer): 7 def __init__(self, **kwargs): 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", []) 11 self.cpp_flags = self.or_cpp_flags(self.flags) 12 self.errors = kwargs.pop("errors", []) 13 14 super(Method, self).__init__(**kwargs) 15 16 def markdown(self, loader): 17 return self.render(loader, "method.md.mako", method=self) 18 19 def cpp_prototype(self, loader, interface, ptype): 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 ) 28 29 def cpp_includes(self, interface): 30 return interface.error_includes(self.errors) + interface.enum_includes( 31 self.returns + self.parameters 32 ) 33 34 def returns_as_list(self, interface, full=False): 35 return ", ".join( 36 [r.cppTypeParam(interface.name, full=full) for r in self.returns] 37 ) 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: 45 return "std::tuple<" + self.returns_as_list(interface) + ">" 46 47 def parameter(self, interface, p, defaultValue=False, ref=""): 48 r = "%s%s %s" % (p.cppTypeParam(interface.name), ref, p.camelCase) 49 if defaultValue: 50 r += p.default_value() 51 return r 52 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 68 def get_parameters_str( 69 self, interface, defaultValue=False, join_str=",\n " 70 ): 71 return self.parameters_as_list( 72 lambda p: self.parameter(interface, p, defaultValue), 73 join_str, 74 ) 75 76 def or_cpp_flags(self, flags): 77 """Return the corresponding ORed cpp flags.""" 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 } 84 85 cpp_flags = [] 86 for flag in flags: 87 try: 88 cpp_flags.append(flags_dict[flag]) 89 except KeyError: 90 raise ValueError('Invalid flag "{}"'.format(flag)) 91 92 return " | ".join(cpp_flags) 93