Fix problems with nested classes/enums and name clashes

This commit is contained in:
Gustavo J. A. M. Carneiro committed 2007-12-30 13:56:06 +00:00
1 parent 8d81c6031a
commit f7a0d46640
3 files changed
+54 -10

No files matched your search

+27 -6
View File
@@ -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
View File
@@ -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)
+5
View File
@@ -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))