Imported Upstream version 1.47.1
[platform/upstream/gobject-introspection.git] / giscanner / sectionparser.py
index caf6bf2..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
-import sys
+from . import ast
+from .utils import to_underscores
+
 
-class SectionFile(object):
+class SectionsFile(object):
     def __init__(self, sections):
         self.sections = sections
 
+
 class Section(object):
     def __init__(self):
         self.file = None
         self.title = None
-        self.main_subsection = Subsection(None)
+        self.includes = None
         self.subsections = []
 
+
 class Subsection(object):
     def __init__(self, name):
         self.name = name
         self.symbols = []
 
+
 def parse_sections_file(lines):
     sections = []
     current_section = None
@@ -50,29 +60,98 @@ def parse_sections_file(lines):
         if line == "<SECTION>":
             current_section = Section()
             sections.append(current_section)
-            current_subsection = current_section.main_subsection
+            current_subsection = Subsection(None)
+            current_section.subsections.append(current_subsection)
             continue
 
         if line == "</SECTION>":
             current_section = None
             continue
 
-        match = re.match(line, r"<FILE>(?P<contents>.*)</FILE>")
+        match = re.match(r"<FILE>(?P<contents>.*)</FILE>", line)
         if match:
             current_section.file = match.groupdict['contents']
             continue
 
-        match = re.match(line, r"<TITLE>(?P<contents>.*)</TITLE>")
+        match = re.match(r"<TITLE>(?P<contents>.*)</TITLE>", line)
         if match:
             current_section.title = match.groupdict['contents']
             continue
 
-        match = re.match(line, r"<SUBSECTION (?P<name>).*>")
+        match = re.match(r"<INCLUDE>(?P<contents>.*)</INCLUDE>", line)
         if match:
-            current_subsection = Section(match.groupdict['name'])
+            current_section.includes = match.groupdict['contents']
+            continue
+
+        match = re.match(r"<SUBSECTION(?: (?P<name>.*))?>", line)
+        if match:
+            current_subsection = Subsection(match.groupdict.get('name', None))
             current_section.subsections.append(current_subsection)
             continue
 
+        if line.startswith("<") and line.endswith(">"):
+            # Other directive to gtk-doc, not a symbol.
+            continue
+
         current_subsection.symbols.append(line)
 
-    return SectionFile(sections)
+    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)