]> git.saurik.com Git - wxWidgets.git/blobdiff - docs/doxygen/scripts/sip_tools.py
Separate the parts of make_bindings.py out into common parts, and SWIG and SIP specif...
[wxWidgets.git] / docs / doxygen / scripts / sip_tools.py
diff --git a/docs/doxygen/scripts/sip_tools.py b/docs/doxygen/scripts/sip_tools.py
new file mode 100644 (file)
index 0000000..a187e81
--- /dev/null
@@ -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