From d5029e03561a1493470c43f8d2a08b90758baccf Mon Sep 17 00:00:00 2001 From: Dieter Verfaillie Date: Tue, 17 Jul 2012 17:19:14 +0200 Subject: [PATCH] giscanner: update annotationparser to most recent gtkdoc-mkdb bug fixes. This patch adds a test for and implements a more generic solution to GTK-Doc commit 47abcd53b8489ebceec9e394676512a181c1f1f6 https://bugzilla.gnome.org/show_bug.cgi?id=688897 --- giscanner/annotationparser.py | 32 ++++++++++++++-- .../annotationparser/gi/syntax_nested_tags.xml | 43 ++++++++++++++++++++++ .../annotationparser/gtkdoc/gobject/gtypes.h.xml | 27 ++++++++++++++ 3 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 tests/scanner/annotationparser/gi/syntax_nested_tags.xml diff --git a/giscanner/annotationparser.py b/giscanner/annotationparser.py index f1fbfda..8c48d0a 100644 --- a/giscanner/annotationparser.py +++ b/giscanner/annotationparser.py @@ -178,6 +178,19 @@ COMMENT_ASTERISK_RE = re.compile(r''' ''', re.VERBOSE) +# Program matching the indentation at the beginning of every +# line (stripped from the ' * ') inside a comment block. +# +# Results in 1 symbolic group: +# - group 1 = indentation +COMMENT_INDENTATION_RE = re.compile(r''' + ^ + (?P[^\S\n\r]*) # 0 or more whitespace characters + .* + $ + ''', + re.VERBOSE) + # Program matching an empty line. # # Results in 0 symbolic groups. @@ -726,13 +739,13 @@ class AnnotationParser(object): .. NOTE:: :class:`AnnotationParser` functionality is heavily based on gtkdoc-mkdb's `ScanSourceFile()`_ function and is currently in sync with GTK-Doc - commit `b41641b`_. + commit `47abcd5`_. .. _GTK-Doc's documentation: http://developer.gnome.org/gtk-doc-manual/1.18/documenting.html.en .. _ScanSourceFile(): http://git.gnome.org/browse/gtk-doc/tree/gtkdoc-mkdb.in#n3722 - .. _b41641b: b41641bd75f870afff7561ceed8a08456da57565 + .. _47abcd5: 47abcd53b8489ebceec9e394676512a181c1f1f6 """ def parse(self, comments): @@ -821,6 +834,8 @@ class AnnotationParser(object): http://git.gnome.org/browse/gtk-doc/tree/gtkdoc-mkdb.in#n3722 """ comment_block = None + part_indent = None + line_indent = None in_part = None identifier = None current_param = None @@ -841,6 +856,10 @@ class AnnotationParser(object): column_offset = result.end(0) line = line[result.end(0):] + # Store indentation level of the line. + result = COMMENT_INDENTATION_RE.match(line) + line_indent = len(result.group('indentation').replace('\t', ' ')) + #################################################################### # Check for GTK-Doc comment block identifier. #################################################################### @@ -877,6 +896,7 @@ class AnnotationParser(object): if identifier: in_part = PART_IDENTIFIER + part_indent = line_indent comment_block = DocBlock(identifier_name) comment_block.position = position @@ -923,6 +943,8 @@ class AnnotationParser(object): if in_part == PART_IDENTIFIER: in_part = PART_PARAMETERS + part_indent = line_indent + if in_part != PART_PARAMETERS: column = result.start('parameter_name') + column_offset marker = ' '*column + '^' @@ -970,13 +992,14 @@ class AnnotationParser(object): if (EMPTY_LINE_RE.match(line) and in_part in [PART_IDENTIFIER, PART_PARAMETERS]): in_part = PART_DESCRIPTION + part_indent = line_indent continue #################################################################### # Check for GTK-Doc comment block tags. #################################################################### result = TAG_RE.match(line) - if result: + if result and line_indent <= part_indent: tag_name = result.group('tag_name') tag_annotations = result.group('annotations') tag_description = result.group('description') @@ -990,6 +1013,7 @@ class AnnotationParser(object): position) in_part = PART_DESCRIPTION + part_indent = line_indent if not comment_block.comment: comment_block.comment = tag_description @@ -1001,6 +1025,8 @@ class AnnotationParser(object): if in_part == PART_DESCRIPTION: in_part = PART_TAGS + part_indent = line_indent + if in_part != PART_TAGS: column = result.start('tag_name') + column_offset marker = ' '*column + '^' diff --git a/tests/scanner/annotationparser/gi/syntax_nested_tags.xml b/tests/scanner/annotationparser/gi/syntax_nested_tags.xml new file mode 100644 index 0000000..d07b6f1 --- /dev/null +++ b/tests/scanner/annotationparser/gi/syntax_nested_tags.xml @@ -0,0 +1,43 @@ + + + + + + + /** + * GApplicationFlags: + * @G_APPLICATION_NON_UNIQUE: Make no attempts to do any of the typical + * single-instance application negotiation, even if the application + * ID is given. The application neither attempts to become the + * owner of the application ID nor does it check if an existing + * owner already exists. Everything occurs in the local process. + * Since: 2.30. + * + * Flags used to define the behaviour of a #GApplication. + * + * Since: 2.28 + **/ + + + GApplicationFlags + + + + G_APPLICATION_NON_UNIQUE + Make no attempts to do any of the typical single-instance application negotiation, even if the application ID is given. The application neither attempts to become the owner of the application ID nor does it check if an existing owner already exists. Everything occurs in the local process. Since: 2.30. + + + Flags used to define the behaviour of a #GApplication. + + + since + 2.28 + + + + + + diff --git a/tests/scanner/annotationparser/gtkdoc/gobject/gtypes.h.xml b/tests/scanner/annotationparser/gtkdoc/gobject/gtypes.h.xml index f4e76e5..1d18827 100644 --- a/tests/scanner/annotationparser/gtkdoc/gobject/gtypes.h.xml +++ b/tests/scanner/annotationparser/gtkdoc/gobject/gtypes.h.xml @@ -4,6 +4,33 @@ /** + * GtkdocEnum: + * @GTKDOC_ENUM_V1: first + * @GTKDOC_ENUM_V2: second + * Since: 0.10 + * + * Enum values for the #GtkdocEnum type. + */ + + + GtkdocEnum + + + + GTKDOC_ENUM_V1 + first + + + GTKDOC_ENUM_V2 + second Since: 0.10 + + + Enum values for the #GtkdocEnum type. + + + + + /** * GtkdocPlainOldData: * @n: Some integer member. * @x: Some floating point member. -- 2.7.4