--- codegen.py.ori 2008-11-15 22:30:54.000000000 +0100 +++ codegen.py 2009-02-20 23:03:07.000000000 +0100 @@ -67,7 +67,8 @@ params = [] for par in op[8] : # par : again fixed placement, see objects/UML/umlparameter.c:umlparameter_props - params.append((par[0], par[1])) + # name, type, value, comment, kind + params.append((par[0], par[1], par[2], par[3], par[4])) k.AddOperation (op[0], op[1], op[4], params, op[5], op[2], op[7]) #print o.properties["attributes"].value for attr in o.properties["attributes"].value : @@ -188,6 +189,98 @@ f.close() ObjRenderer.end_render(self) +class PascalRenderer(ObjRenderer) : + def __init__(self) : + ObjRenderer.__init__(self) + def end_render(self) : + f = open(self.filename, "w") + f.write("/* generated by dia/codegen.py */\n") + f.write("Type\n") + # declaration + for sk in self.klasses.keys() : + k = self.klasses[sk] + if k.inheritance_type == "abstract" : + f.write (" %s = interface" % (sk)) + else : + f.write (" %s = class %s" % (sk, k.inheritance_type)) + p = [] + if k.parents : + p.append(k.parents[0]) + if k.templates : + p.append(",".join(k.templates)) + if len(p) > 0 : + f.write("(%s)" % ",".join(p)) + f.write ("\n") + # first sort by visibility + ops = [[], [], [], [], [], []] + for so, (t, v, p, i, c, s) in k.operations : + ops[v].append((t,so,p,c,i)) + vars = [[], [], [], []] + for sa, (t, vi, va) in k.attributes.iteritems() : + vars[vi].append((t, sa)) + visibilities = ("public", "private", "protected", "/* implementation */") + for v in [1,2,0,3] : + if len(ops[v]) == 0 and len(vars[v]) == 0 : + continue + f.write (" %s\n" % visibilities[v]) + for op in ops[v] : + # detect ctor/dtor + if len(op[3]) > 0 : + f.write (" /// %s\n" % op[3]) + if len(op[0]) == 0 : + f.write (" Procedure %s" % op[1]) + else : + f.write (" Function %s" % op[1]) + if len(op[2]) > 0 : + f.write ("(") + i = 0 + m = len(op[2]) - 1 + for p in op[2] : + if p[4] == 2 : + f.write ("Out ") + elif p[4] == 3 : + f.write ("Var ") + f.write ("%s:%s" % (p[0], p[1])) + if len(p[2]) > 0 : + f.write (":=%s" % p[2]) + if i != m : + f.write(";") + i = i + 1 + f.write (")") + if len(op[0]) == 0 : + f.write(";") + else : + f.write (" : %s;" % op[0]) + # inheritance type + if op[4] == 0 : + f.write (" virtual; abstract;"); + elif op[4] == 1 : + f.write (" virtual;"); + f.write ("\n") + for var in vars[v] : + if var[1].endswith("]") : + i = var[1].find("[") + varname = var[1] + arraysize = varname[i+1:-1] + varname = varname[:i] + if len(arraysize) > 0 : + if arraysize.find("..") > 0 : + f.write(" %s : Array[%s] of %s;\n" % (varname, arraysize, var[0])) + elif arraysize.isdigit() : + arraysize = int(arraysize)-1 + f.write(" %s : Array[0..%d] of %s;\n" % (varname, arraysize, var[0])) + else : + f.write(" %s : Array[0..%s-1] of %s;\n" % (varname, arraysize, var[0])) + else : + f.write(" %s : Array of %s;\n" % (varname, var[0])) + else : + f.write(" %s : %s;\n" % (var[1], var[0])) + f.write (" End;\n\n") + # implementation + # ... + f.close() + ObjRenderer.end_render(self) + class JavaRenderer(ObjRenderer) : def __init__(self) : ObjRenderer.__init__(self) @@ -263,4 +356,5 @@ # dia-python keeps a reference to the renderer class and uses it on demand dia.register_export ("PyDia Code Generation (Python)", "py", PyRenderer()) dia.register_export ("PyDia Code Generation (C++)", "cxx", CxxRenderer()) +dia.register_export ("PyDia Code Generation (Pascal)", "pas", PascalRenderer()) dia.register_export ("PyDia Code Generation (Java)", "java", JavaRenderer())