diff options
author | Lars Wirzenius <lars.wirzenius@codethink.co.uk> | 2013-09-04 16:13:21 +0000 |
---|---|---|
committer | Lars Wirzenius <lars.wirzenius@codethink.co.uk> | 2013-09-04 16:13:21 +0000 |
commit | a194122be492fbddd8748fe323a648434a866c36 (patch) | |
tree | f39293588b7922faa40f0c6b985a031f8f5cf0ae /giscanner/sectionparser.py | |
parent | 8a2a9f9db169eaaf2a7eede18e0ceba0af44345f (diff) | |
parent | 85d02d59f101f9eb37829b16a81890ef9801824a (diff) | |
download | gobject-introspection-baserock/jonathan/fix-giscanner.tar.gz |
merge with GOBJECT_INTROSPECTION_1_37_6baserock/jonathan/fix-giscanner
Diffstat (limited to 'giscanner/sectionparser.py')
-rw-r--r-- | giscanner/sectionparser.py | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/giscanner/sectionparser.py b/giscanner/sectionparser.py new file mode 100644 index 00000000..ffe41afc --- /dev/null +++ b/giscanner/sectionparser.py @@ -0,0 +1,152 @@ +# -*- Mode: Python -*- +# Copyright (C) 2013 Hat, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. +# + +import re +from . import ast +from .utils import to_underscores + + +class SectionsFile(object): + def __init__(self, sections): + self.sections = sections + + +class Section(object): + def __init__(self): + self.file = None + self.title = 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 + current_subsection = None + + for line in lines: + line = line.rstrip() + + if not line or line.isspace(): + continue + + if line == "<SECTION>": + current_section = Section() + sections.append(current_section) + current_subsection = Subsection(None) + current_section.subsections.append(current_subsection) + continue + + if line == "</SECTION>": + current_section = None + continue + + match = re.match(r"<FILE>(?P<contents>.*)</FILE>", line) + if match: + current_section.file = match.groupdict['contents'] + continue + + match = re.match(r"<TITLE>(?P<contents>.*)</TITLE>", line) + if match: + current_section.title = match.groupdict['contents'] + continue + + match = re.match(r"<INCLUDE>(?P<contents>.*)</INCLUDE>", line) + if match: + 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 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.itervalues(): + 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) |