Add support for custom names of template instantiation methods.
This commit is contained in:
1 parent
19aa06c8ed
commit
8f8f2bf7f5
3 files changed
+30
-8
No files matched your search
@@ -600,13 +600,12 @@ public:
|
||||
else:
|
||||
raise TypeError
|
||||
|
||||
mangled_name = utils.get_mangled_name(name, method.template_parameters)
|
||||
try:
|
||||
overload = self.methods[mangled_name]
|
||||
overload = self.methods[method.mangled_name]
|
||||
except KeyError:
|
||||
overload = CppOverloadedMethod(mangled_name)
|
||||
overload = CppOverloadedMethod(method.mangled_name)
|
||||
overload.pystruct = self.pystruct
|
||||
self.methods[mangled_name] = overload
|
||||
self.methods[method.mangled_name] = overload
|
||||
|
||||
method.class_ = self
|
||||
overload.add(method)
|
||||
|
||||
@@ -18,7 +18,8 @@ class CppMethod(ForwardWrapperBase):
|
||||
|
||||
def __init__(self, return_value, method_name, parameters, is_static=False,
|
||||
template_parameters=(), is_virtual=False, is_const=False,
|
||||
unblock_threads=None, is_pure_virtual=False):
|
||||
unblock_threads=None, is_pure_virtual=False,
|
||||
custom_template_method_name=None):
|
||||
"""
|
||||
return_value -- the method return value
|
||||
method_name -- name of the method
|
||||
@@ -37,7 +38,10 @@ class CppMethod(ForwardWrapperBase):
|
||||
self.is_pure_virtual = is_pure_virtual
|
||||
self.is_const = is_const
|
||||
self.template_parameters = template_parameters
|
||||
self.mangled_name = utils.get_mangled_name(self.method_name, self.template_parameters)
|
||||
if custom_template_method_name is None:
|
||||
self.mangled_name = utils.get_mangled_name(self.method_name, self.template_parameters)
|
||||
else:
|
||||
self.mangled_name = custom_template_method_name
|
||||
|
||||
self._class = None
|
||||
self.docstring = None
|
||||
|
||||
@@ -545,12 +545,22 @@ class ModuleParser(object):
|
||||
member.location.line)
|
||||
if 'ignore' in global_annotations:
|
||||
continue
|
||||
for key, val in global_annotations.iteritems():
|
||||
if key == 'ignore':
|
||||
pass
|
||||
elif key == 'template_instance_names' \
|
||||
and templates.is_instantiation(member.demangled_name):
|
||||
pass
|
||||
else:
|
||||
warnings.warn_explicit("Annotation '%s=%s' not used (used in %s)"
|
||||
% (key, val, member),
|
||||
Warning, member.location.file_name, member.location.line)
|
||||
|
||||
## ------------ method --------------------
|
||||
if isinstance(member, calldef.member_function_t):
|
||||
is_virtual = (member.virtuality != calldef.VIRTUALITY_TYPES.NOT_VIRTUAL)
|
||||
pure_virtual = (member.virtuality == calldef.VIRTUALITY_TYPES.PURE_VIRTUAL)
|
||||
|
||||
|
||||
try:
|
||||
return_type = type_registry.lookup_return(member.return_type,
|
||||
parameter_annotations.get('return', {}))
|
||||
@@ -580,8 +590,16 @@ class ModuleParser(object):
|
||||
if pure_virtual and not class_wrapper.allow_subclassing:
|
||||
class_wrapper.set_cannot_be_constructed(True)
|
||||
|
||||
custom_template_method_name = None
|
||||
if templates.is_instantiation(member.demangled_name):
|
||||
template_parameters = templates.args(member.demangled_name)
|
||||
template_instance_names = global_annotations.get('template_instance_names', '')
|
||||
for mapping in template_instance_names.split('|'):
|
||||
type_names, name = mapping.split('=>')
|
||||
instance_types = type_names.split(',')
|
||||
if instance_types == template_parameters:
|
||||
custom_template_method_name = name
|
||||
break
|
||||
else:
|
||||
template_parameters = ()
|
||||
|
||||
@@ -590,7 +608,8 @@ class ModuleParser(object):
|
||||
is_static=member.has_static,
|
||||
is_virtual=(is_virtual and class_wrapper.allow_subclassing),
|
||||
is_pure_virtual=pure_virtual,
|
||||
template_parameters=template_parameters)
|
||||
template_parameters=template_parameters,
|
||||
custom_template_method_name=custom_template_method_name)
|
||||
method_wrapper.gccxml_definition = member
|
||||
class_wrapper.add_method(method_wrapper)
|
||||
|
||||
|
||||
Reference in new issue
Block a user