Eolian: Fix constructor generation
This commit is contained in:
parent
3ef8626ba4
commit
19ecd9af2e
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue