X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4e735ed6a6973429c5964c30825862a10949619c..0cbc1d02511500b8499a11939ef0c59309937fca:/docs/doxygen/scripts/sip_tools.py?ds=sidebyside diff --git a/docs/doxygen/scripts/sip_tools.py b/docs/doxygen/scripts/sip_tools.py new file mode 100644 index 0000000000..a187e81731 --- /dev/null +++ b/docs/doxygen/scripts/sip_tools.py @@ -0,0 +1,84 @@ +import os + +from common import * + +class SIPBuilder: + def __init__(self, doxyparse, outputdir): + self.doxyparser = doxyparse + self.output_dir = outputdir + + def make_bindings(self): + output_dir = os.path.abspath(os.path.join(self.output_dir, "sip")) + if not os.path.exists(output_dir): + os.makedirs(output_dir) + + for aclass in self.doxyparser.classes: + if aclass.name in excluded_classes: + print "Skipping %s" % aclass.name + continue + + header_name = aclass.name[2:].lower() + filename = os.path.join(output_dir, header_name + ".sip") + enums_text = make_enums(aclass) + method_text = self.make_sip_methods(aclass) + base_class = get_first_value(aclass.bases) + if base_class != "": + base_class = ": %s" % base_class + + text = """ +%s +class %s %s +{ +%%TypeHeaderCode +#include <%s> +%%End + +public: +%s +}; +""" % (enums_text, aclass.name, base_class, get_first_value(aclass.includes), method_text) + + afile = open(filename, "wb") + afile.write(text) + afile.close() + + + def make_sip_methods(self, aclass): + retval = "" + + for amethod in aclass.constructors + aclass.methods: + transfer = "" + + # FIXME: we need to come up with a way of filtering the methods out by various criteria + # including parameters and method name, and how to deal with overloads + if aclass.name in ignored_methods: + should_ignore = False + for method in ignored_methods[aclass.name]: + print "method = %s" % method + if method == amethod.name: + params = ignored_methods[aclass.name][method] + should_ignore = True + for i in xrange(len(params)): + if i >= len(amethod.params): + should_ignore = False + break + elif amethod.params[i]["type"] != params[i]: + print "param type = %s, amethod.param type = %s" % (params[i], amethod.params[i]["type"]) + should_ignore = False + break + + if should_ignore: + continue + + # We need to let SIP know when wx is responsible for deleting the object. + # We do this if the class is derived from wxWindow, since wxTLW manages child windows + # and wxApp deletes all wxTLWs on shutdown + if amethod in aclass.constructors and self.doxyparser.is_derived_from_base(aclass, "wxWindow"): + transfer = "/Transfer/" + + if amethod.name.startswith("operator"): + continue + + retval += " %s %s%s%s;\n\n" % (amethod.return_type.replace("virtual ", ""), amethod.name, amethod.argsstring, transfer) + + return retval