Fix problems with nested classes/enums and name clashes
This commit is contained in:
1 parent
8d81c6031a
commit
f7a0d46640
3 files changed
+54
-10
No files matched your search
+27
-6
@@ -345,35 +345,56 @@ class CppClass(object):
|
||||
|
||||
class ThisClassParameter(CppClassParameter):
|
||||
"""Register this C++ class as pass-by-value parameter"""
|
||||
CTYPES = [name]
|
||||
CTYPES = []
|
||||
cpp_class = self
|
||||
self.ThisClassParameter = ThisClassParameter
|
||||
try:
|
||||
param_type_matcher.register(name, self.ThisClassParameter)
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
|
||||
class ThisClassRefParameter(CppClassRefParameter):
|
||||
"""Register this C++ class as pass-by-reference parameter"""
|
||||
CTYPES = [name+'&']
|
||||
CTYPES = []
|
||||
cpp_class = self
|
||||
self.ThisClassRefParameter = ThisClassRefParameter
|
||||
try:
|
||||
param_type_matcher.register(name+'&', self.ThisClassRefParameter)
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
class ThisClassReturn(CppClassReturnValue):
|
||||
"""Register this C++ class as value return"""
|
||||
CTYPES = [name]
|
||||
CTYPES = []
|
||||
cpp_class = self
|
||||
|
||||
self.ThisClassReturn = ThisClassReturn
|
||||
self.ThisClassRefReturn = ThisClassReturn
|
||||
try:
|
||||
return_type_matcher.register(name, self.ThisClassReturn)
|
||||
return_type_matcher.register(name, self.ThisClassRefReturn)
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
class ThisClassPtrParameter(CppClassPtrParameter):
|
||||
"""Register this C++ class as pass-by-pointer parameter"""
|
||||
CTYPES = [name+'*']
|
||||
CTYPES = []
|
||||
cpp_class = self
|
||||
self.ThisClassPtrParameter = ThisClassPtrParameter
|
||||
try:
|
||||
param_type_matcher.register(name+'*', self.ThisClassPtrParameter)
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
class ThisClassPtrReturn(CppClassPtrReturnValue):
|
||||
"""Register this C++ class as pointer return"""
|
||||
CTYPES = [name+'*']
|
||||
CTYPES = []
|
||||
cpp_class = self
|
||||
self.ThisClassPtrReturn = ThisClassPtrReturn
|
||||
try:
|
||||
return_type_matcher.register(name+'*', self.ThisClassPtrReturn)
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
self._inherit_default_constructors()
|
||||
|
||||
|
||||
+22
-4
@@ -3,6 +3,7 @@ Wraps enumerations
|
||||
"""
|
||||
|
||||
from typehandlers import inttype
|
||||
from typehandlers.base import return_type_matcher, param_type_matcher
|
||||
from cppclass import CppClass
|
||||
|
||||
class Enum(object):
|
||||
@@ -31,12 +32,16 @@ class Enum(object):
|
||||
if not isinstance(val, str):
|
||||
raise TypeError
|
||||
|
||||
if not name:
|
||||
raise ValueError
|
||||
self.name = name
|
||||
self.full_name = None
|
||||
self.values = list(values)
|
||||
self.values_prefix = values_prefix
|
||||
self.cpp_namespace = cpp_namespace
|
||||
self._module = None
|
||||
self.ThisEnumParameter = None
|
||||
self.ThisEnumReturn = None
|
||||
|
||||
def get_module(self):
|
||||
"""Get the Module object this class belongs to"""
|
||||
@@ -60,19 +65,32 @@ class Enum(object):
|
||||
self.full_name = self.outer_class.full_name + '::' + self.name
|
||||
|
||||
## Register type handlers for the enum type
|
||||
assert self.name
|
||||
assert self.full_name
|
||||
class ThisEnumParameter(inttype.IntParam):
|
||||
CTYPES = [self.name, self.full_name]
|
||||
CTYPES = []
|
||||
full_type_name = self.full_name
|
||||
def __init__(self, ctype, name):
|
||||
super(ThisEnumParameter, self).__init__(self.full_type_name, name)
|
||||
self.ThisEnumParameter = ThisEnumParameter
|
||||
|
||||
class ThisEnumReturn(inttype.IntReturn):
|
||||
CTYPES = [self.name, self.full_name]
|
||||
CTYPES = []
|
||||
full_type_name = self.full_name
|
||||
def __init__(self, ctype):
|
||||
super(ThisEnumReturn, self).__init__(self.full_type_name)
|
||||
self.ThisEnumParameter = ThisEnumParameter
|
||||
self.ThisEnumReturn = ThisEnumReturn
|
||||
param_type_matcher.register(self.full_name, self.ThisEnumParameter)
|
||||
return_type_matcher.register(self.full_name, self.ThisEnumReturn)
|
||||
|
||||
if self.name != self.full_name:
|
||||
try:
|
||||
param_type_matcher.register(self.name, self.ThisEnumParameter)
|
||||
except ValueError:
|
||||
pass
|
||||
try:
|
||||
return_type_matcher.register(self.name, self.ThisEnumReturn)
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
|
||||
module = property(get_module, set_module)
|
||||
|
||||
@@ -376,6 +376,11 @@ class ModuleParser(object):
|
||||
for enum in enums:
|
||||
if enum.name.startswith('__'):
|
||||
continue
|
||||
if not enum.name:
|
||||
warnings.warn_explicit("Enum %s ignored because it has no name"
|
||||
% (enum, ),
|
||||
Warning, enum.location.file_name, enum.location.line)
|
||||
continue
|
||||
module.add_enum(Enum(enum.name, [name for name, dummy_val in enum.values],
|
||||
outer_class=outer_class))
|
||||
|
||||
|
||||
Reference in new issue
Block a user