Eolian: Fix constructor generation
This commit is contained in:
parent
3ef8626ba4
commit
19ecd9af2e
|
@ -117,18 +117,21 @@ class Generator(object):
|
||||||
|
|
||||||
|
|
||||||
class PyxGenerator(Generator):
|
class PyxGenerator(Generator):
|
||||||
def method_header_write(self, name, params):
|
def method_header_write(self, name, params, clsm=False):
|
||||||
params2 = []
|
params2 = []
|
||||||
|
if clsm:
|
||||||
|
self.write("@classmethod")
|
||||||
|
params2.append("cls")
|
||||||
|
else:
|
||||||
|
params2.append("self")
|
||||||
|
|
||||||
for t, n in params:
|
for t, n in params:
|
||||||
t.replace("const ", "")
|
t.replace("const ", "")
|
||||||
t = param_type_mapping.get(t, ("", None))[0]
|
t = param_type_mapping.get(t, ("", None))[0]
|
||||||
params2.append(" ".join((t, n)).strip())
|
params2.append(" ".join((t, n)).strip())
|
||||||
|
|
||||||
params2 = ", ".join(params2)
|
params2 = ", ".join(params2)
|
||||||
define = "def %s(self" % (name)
|
define = "def %s(%s):" % (name, params2)
|
||||||
if params2:
|
|
||||||
define += ", "
|
|
||||||
define += "%s" % (params2)
|
|
||||||
define += "):"
|
|
||||||
self.write(define)
|
self.write(define)
|
||||||
|
|
||||||
def cdefs_write(self, cdefs):
|
def cdefs_write(self, cdefs):
|
||||||
|
@ -151,7 +154,6 @@ class PyxGenerator(Generator):
|
||||||
class Method(object):
|
class Method(object):
|
||||||
|
|
||||||
def __init__(self, eo_prefix):
|
def __init__(self, eo_prefix):
|
||||||
super(type(self), self).__init__()
|
|
||||||
self.params = []
|
self.params = []
|
||||||
self.py_params = []
|
self.py_params = []
|
||||||
self.c_params = []
|
self.c_params = []
|
||||||
|
@ -348,40 +350,21 @@ class Property(object):
|
||||||
|
|
||||||
class Constructor(Method):
|
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):
|
def pyx_generate(self, gen):
|
||||||
cls_get = self.eo_prefix + "_class_get()"
|
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.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("self = cls.__new__(cls)")
|
||||||
gen.write(
|
gen.write(
|
||||||
"eo_add_custom(%s, parent.obj, %s(%s))" % (
|
"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")
|
gen.write("return self")
|
||||||
|
@ -389,11 +372,9 @@ class Constructor(Method):
|
||||||
|
|
||||||
gen.write()
|
gen.write()
|
||||||
|
|
||||||
def cdef_generate(self, gen):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class DefaultConstructor(Constructor):
|
class DefaultConstructor(Constructor):
|
||||||
|
|
||||||
def pyx_generate(self, gen):
|
def pyx_generate(self, gen):
|
||||||
cls_get = self.eo_prefix + "_class_get()"
|
cls_get = self.eo_prefix + "_class_get()"
|
||||||
gen.write("def __init__(self, parent=None):")
|
gen.write("def __init__(self, parent=None):")
|
||||||
|
@ -406,17 +387,19 @@ class DefaultConstructor(Constructor):
|
||||||
gen.dedent()
|
gen.dedent()
|
||||||
gen.write()
|
gen.write()
|
||||||
|
|
||||||
|
def cdef_generate(self, gen):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class Class(object):
|
class Class(object):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(type(self), self).__init__()
|
|
||||||
self.docs = []
|
self.docs = []
|
||||||
self.inherits = []
|
self.inherits = []
|
||||||
|
|
||||||
self.ctors = []
|
self.ctors = []
|
||||||
self.methods = []
|
self.methods = []
|
||||||
self.props = []
|
self.props = []
|
||||||
self.default_ctor = False
|
self.default_ctor = None
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def parse(klass, cls):
|
def parse(klass, cls):
|
||||||
|
@ -476,8 +459,8 @@ class Class(object):
|
||||||
ctors = cls.functions_list_get(eolian.FunctionType.CTOR)
|
ctors = cls.functions_list_get(eolian.FunctionType.CTOR)
|
||||||
if ctors:
|
if ctors:
|
||||||
for ctor in ctors:
|
for ctor in ctors:
|
||||||
self.ctors.append(Constructor.parse(prefix, ctor))
|
self.ctors.append(Constructor.parse(ctor, prefix))
|
||||||
self.ctors.append(DefaultConstructor(prefix))
|
self.default_ctor = DefaultConstructor(prefix)
|
||||||
|
|
||||||
props = cls.functions_list_get(eolian.FunctionType.PROPERTY)
|
props = cls.functions_list_get(eolian.FunctionType.PROPERTY)
|
||||||
for prop in props:
|
for prop in props:
|
||||||
|
@ -503,11 +486,18 @@ class Class(object):
|
||||||
|
|
||||||
gen.docstring_write(self.docs)
|
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")
|
gen.write("pass")
|
||||||
else:
|
else:
|
||||||
for o in self.ctors + self.methods + self.props:
|
for o in (
|
||||||
o.pyx_generate(gen)
|
[self.default_ctor] +
|
||||||
|
self.ctors +
|
||||||
|
self.methods +
|
||||||
|
self.props
|
||||||
|
):
|
||||||
|
if o:
|
||||||
|
o.pyx_generate(gen)
|
||||||
|
|
||||||
gen.dedent()
|
gen.dedent()
|
||||||
gen.write()
|
gen.write()
|
||||||
|
|
Loading…
Reference in New Issue