diff --git a/scripts/eolian_generate.py b/scripts/eolian_generate.py index 5e01419..423f585 100755 --- a/scripts/eolian_generate.py +++ b/scripts/eolian_generate.py @@ -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()