Eolian: Fix constructor generation

This commit is contained in:
Kai Huuhko 2014-06-17 10:14:05 +03:00
parent 3ef8626ba4
commit 19ecd9af2e
1 changed files with 35 additions and 45 deletions

View File

@ -117,18 +117,21 @@ class Generator(object):
class PyxGenerator(Generator):
def method_header_write(self, name, params):
def method_header_write(self, name, params, clsm=False):
params2 = []
if clsm:
self.write("@classmethod")
params2.append("cls")
else:
params2.append("self")
for t, n in params:
t.replace("const ", "")
t = param_type_mapping.get(t, ("", None))[0]
params2.append(" ".join((t, n)).strip())
params2 = ", ".join(params2)
define = "def %s(self" % (name)
if params2:
define += ", "
define += "%s" % (params2)
define += "):"
define = "def %s(%s):" % (name, params2)
self.write(define)
def cdefs_write(self, cdefs):
@ -151,7 +154,6 @@ class PyxGenerator(Generator):
class Method(object):
def __init__(self, eo_prefix):
super(type(self), self).__init__()
self.params = []
self.py_params = []
self.c_params = []
@ -348,40 +350,21 @@ class Property(object):
class Constructor(Method):
def __init__(self, eo_prefix):
self.c_params = []
self.py_params = []
self.method = None
self.eo_prefix = eo_prefix
@classmethod
def parse(cls, eo_prefix, method):
self = cls.__new__(cls)
self.__init__(eo_prefix)
self.method = method
self.c_name = "_".join((self.eo_prefix, method.name))
for p in self.method.parameters_list:
pdir, ptype, name, desc = p.information
self.c_params.append("%s" % (name))
self.py_params.append("%s %s" % (ptype, name))
self.c_params = ", ".join(self.c_params)
self.py_params.insert(0, "parent")
self.py_params.insert(0, "cls")
self.py_params = ", ".join(self.py_params)
return self
def pyx_generate(self, gen):
cls_get = self.eo_prefix + "_class_get()"
gen.write("@classmethod")
gen.write("def %s(%s):" % (self.method.name, self.py_params))
gen.method_header_write(
self.py_name, [("", "parent")] + self.py_params, clsm=True)
gen.indent()
gen.docstring_write(self.docs)
c_params = ", ".join([c[1] for c in self.c_params])
gen.write("self = cls.__new__(cls)")
gen.write(
"eo_add_custom(%s, parent.obj, %s(%s))" % (
cls_get, self.method.name, self.c_params
cls_get, self.c_name, c_params
)
)
gen.write("return self")
@ -389,11 +372,9 @@ class Constructor(Method):
gen.write()
def cdef_generate(self, gen):
pass
class DefaultConstructor(Constructor):
def pyx_generate(self, gen):
cls_get = self.eo_prefix + "_class_get()"
gen.write("def __init__(self, parent=None):")
@ -406,17 +387,19 @@ class DefaultConstructor(Constructor):
gen.dedent()
gen.write()
def cdef_generate(self, gen):
pass
class Class(object):
def __init__(self):
super(type(self), self).__init__()
self.docs = []
self.inherits = []
self.ctors = []
self.methods = []
self.props = []
self.default_ctor = False
self.default_ctor = None
@classmethod
def parse(klass, cls):
@ -476,8 +459,8 @@ class Class(object):
ctors = cls.functions_list_get(eolian.FunctionType.CTOR)
if ctors:
for ctor in ctors:
self.ctors.append(Constructor.parse(prefix, ctor))
self.ctors.append(DefaultConstructor(prefix))
self.ctors.append(Constructor.parse(ctor, prefix))
self.default_ctor = DefaultConstructor(prefix)
props = cls.functions_list_get(eolian.FunctionType.PROPERTY)
for prop in props:
@ -503,11 +486,18 @@ class Class(object):
gen.docstring_write(self.docs)
if not self.ctors and not self.props and not self.methods:
if not self.ctors and not self.props and not self.methods and \
not self.default_ctor:
gen.write("pass")
else:
for o in self.ctors + self.methods + self.props:
o.pyx_generate(gen)
for o in (
[self.default_ctor] +
self.ctors +
self.methods +
self.props
):
if o:
o.pyx_generate(gen)
gen.dedent()
gen.write()