Imported Upstream version 1.47.1
[platform/upstream/gobject-introspection.git] / giscanner / sectionparser.py
index 61763e4..e8e584d 100644 (file)
 # Boston, MA 02111-1307, USA.
 #
 
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+
 import re
+from . import ast
+from .utils import to_underscores
 
 
 class SectionsFile(object):
@@ -89,3 +96,62 @@ def parse_sections_file(lines):
         current_subsection.symbols.append(line)
 
     return SectionsFile(sections)
+
+
+def write_sections_file(f, sections_file):
+    for section in sections_file.sections:
+        f.write("\n<SECTION>\n")
+        if section.file is not None:
+            f.write("<FILE>%s</FILE>\n" % (section.file, ))
+        if section.title is not None:
+            f.write("<TITLE>%s</TITLE>\n" % (section.title, ))
+        if section.includes is not None:
+            f.write("<INCLUDE>%s</INCLUDE>\n" % (section.includes, ))
+
+        is_first_subsection = True
+        for subsection in section.subsections:
+            if subsection.name is not None:
+                f.write("<SUBSECTION %s>\n" % (subsection.name, ))
+            elif not is_first_subsection:
+                f.write("\n<SUBSECTION>\n")
+
+            is_first_subsection = False
+
+            for symbol in subsection.symbols:
+                f.write(symbol + "\n")
+
+
+def generate_sections_file(transformer):
+    ns = transformer.namespace
+
+    sections = []
+
+    def new_section(file_, title):
+        section = Section()
+        section.file = file_
+        section.title = title
+        section.subsections.append(Subsection(None))
+        sections.append(section)
+        return section
+
+    def append_symbol(section, sym):
+        section.subsections[0].symbols.append(sym)
+
+    general_section = new_section("main", "Main")
+
+    for node in ns.values():
+        if isinstance(node, ast.Function):
+            append_symbol(general_section, node.symbol)
+        elif isinstance(node, (ast.Class, ast.Interface)):
+            gtype_name = node.gtype_name
+            file_name = to_underscores(gtype_name).replace('_', '-').lower()
+            section = new_section(file_name, gtype_name)
+            append_symbol(section, gtype_name)
+            append_symbol(section, node.glib_type_struct.target_giname.replace('.', ''))
+
+            for meth in node.methods:
+                append_symbol(section, meth.symbol)
+            for meth in node.static_methods:
+                append_symbol(section, meth.symbol)
+
+    return SectionsFile(sections)