summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDieter Verfaillie <dieterv@optionexplicit.be>2012-04-17 20:58:53 +0200
committerDieter Verfaillie <dieterv@optionexplicit.be>2012-04-17 23:03:22 +0200
commitc3f14eeab9ae60a138f85212317f92b737e5ed70 (patch)
tree63b1b924b7ccd9b709dc4995d0c3c62bf3d46cb7
parent29ed1d64ee4e2e4a18f34734b0ceda3e629cf465 (diff)
downloadgobject-introspection-c3f14eeab9ae60a138f85212317f92b737e5ed70.tar.gz
Revert "annotationparser: indent _parse_comment_block gtkdoc code"
This reverts commit f41525d54f53edd9b0d665397f7c6c755ee3616b and adds a more complete solution as the original commit only handled empty lines between the GTK-Doc comment block start token "/**" and the identifier. https://bugzilla.gnome.org/show_bug.cgi?id=673806
-rw-r--r--giscanner/annotationparser.py190
-rw-r--r--tests/scanner/regress.h8
2 files changed, 95 insertions, 103 deletions
diff --git a/giscanner/annotationparser.py b/giscanner/annotationparser.py
index 97f25664..82fc9eef 100644
--- a/giscanner/annotationparser.py
+++ b/giscanner/annotationparser.py
@@ -610,95 +610,96 @@ class AnnotationParser(object):
for line_offset, line in comment_lines:
position = message.Position(filename, line_offset + lineno)
+ # Store the original line (without \n) and column offset
+ # so we can generate meaningful warnings later on.
+ original_line = line
+ column_offset = 0
+
+ # Get rid of ' * ' at start of the line.
result = COMMENT_STAR_RE.match(line)
if result:
- # Store the original line (without \n) and column offset
- # so we can generate meaningful warnings later on.
- original_line = line
column_offset = result.end(0)
-
- # Get rid of ' * ' at start of the line.
line = line[result.end(0):]
- ####################################################################
- # Check for GTK-Doc comment block identifier.
- ####################################################################
- if not comment_block:
- # The correct identifier name would have the colon at the end
- # but maintransformer.py does not expect us to do that. So
- # make sure to compute an identifier_name without the colon and
- # a real_identifier_name with the colon.
-
- if not identifier:
- result = SECTION_RE.search(line)
- if result:
- identifier = IDENTIFIER_SECTION
- real_identifier_name = 'SECTION:%s' % (result.group('section_name'))
- identifier_name = real_identifier_name
- column = result.start('section_name') + column_offset
-
- if not identifier:
- result = SYMBOL_RE.search(line)
- if result:
- identifier = IDENTIFIER_SYMBOL
- real_identifier_name = '%s:' % (result.group('symbol_name'))
- identifier_name = '%s' % (result.group('symbol_name'))
- column = result.start('symbol_name') + column_offset
-
- if not identifier:
- result = PROPERTY_RE.search(line)
- if result:
- identifier = IDENTIFIER_PROPERTY
- real_identifier_name = '%s:%s:' % (result.group('class_name'),
- result.group('property_name'))
- identifier_name = '%s:%s' % (result.group('class_name'),
- result.group('property_name'))
- column = result.start('property_name') + column_offset
-
- if not identifier:
- result = SIGNAL_RE.search(line)
- if result:
- identifier = IDENTIFIER_SIGNAL
- real_identifier_name = '%s::%s:' % (result.group('class_name'),
- result.group('signal_name'))
- identifier_name = '%s::%s' % (result.group('class_name'),
- result.group('signal_name'))
- column = result.start('signal_name') + column_offset
-
- if identifier:
- in_part = PART_IDENTIFIER
-
- comment_block = DocBlock(identifier_name)
- comment_block.set_position(position)
-
- if 'annotations' in result.groupdict():
- comment_block.options = self.parse_options(comment_block,
- result.group('annotations'))
-
- if 'colon' in result.groupdict() and result.group('colon') != ':':
- colon_start = result.start('colon')
- colon_column = column_offset + colon_start
- marker = ' '*colon_column + '^'
- message.warn("missing ':' at column %s:\n%s\n%s" %
- (colon_start, original_line, marker),
- position)
- continue
- else:
- # If we get here, the identifier was not recognized, so
- # ignore the rest of the block just like the old annotation
- # parser did. Doing this is a bit more strict than
- # gtkdoc-mkdb (which continues to search for the identifier
- # until either it is found or the end of the block is
- # reached). In practice, however, ignoring the block is the
- # right thing to do because sooner or later some long
- # descriptions will contain something matching an identifier
- # pattern by accident.
- marker = ' '*column_offset + '^'
- message.warn('ignoring unrecognized GTK-Doc comment block, identifier not '
- 'found:\n%s\n%s' % (original_line, marker),
- position)
-
- return None
+ ####################################################################
+ # Check for GTK-Doc comment block identifier.
+ ####################################################################
+ if not comment_block:
+ # The correct identifier name would have the colon at the end
+ # but maintransformer.py does not expect us to do that. So
+ # make sure to compute an identifier_name without the colon and
+ # a real_identifier_name with the colon.
+
+ if not identifier:
+ result = SECTION_RE.search(line)
+ if result:
+ identifier = IDENTIFIER_SECTION
+ real_identifier_name = 'SECTION:%s' % (result.group('section_name'))
+ identifier_name = real_identifier_name
+ column = result.start('section_name') + column_offset
+
+ if not identifier:
+ result = SYMBOL_RE.search(line)
+ if result:
+ identifier = IDENTIFIER_SYMBOL
+ real_identifier_name = '%s:' % (result.group('symbol_name'))
+ identifier_name = '%s' % (result.group('symbol_name'))
+ column = result.start('symbol_name') + column_offset
+
+ if not identifier:
+ result = PROPERTY_RE.search(line)
+ if result:
+ identifier = IDENTIFIER_PROPERTY
+ real_identifier_name = '%s:%s:' % (result.group('class_name'),
+ result.group('property_name'))
+ identifier_name = '%s:%s' % (result.group('class_name'),
+ result.group('property_name'))
+ column = result.start('property_name') + column_offset
+
+ if not identifier:
+ result = SIGNAL_RE.search(line)
+ if result:
+ identifier = IDENTIFIER_SIGNAL
+ real_identifier_name = '%s::%s:' % (result.group('class_name'),
+ result.group('signal_name'))
+ identifier_name = '%s::%s' % (result.group('class_name'),
+ result.group('signal_name'))
+ column = result.start('signal_name') + column_offset
+
+ if identifier:
+ in_part = PART_IDENTIFIER
+
+ comment_block = DocBlock(identifier_name)
+ comment_block.set_position(position)
+
+ if 'annotations' in result.groupdict():
+ comment_block.options = self.parse_options(comment_block,
+ result.group('annotations'))
+
+ if 'colon' in result.groupdict() and result.group('colon') != ':':
+ colon_start = result.start('colon')
+ colon_column = column_offset + colon_start
+ marker = ' '*colon_column + '^'
+ message.warn("missing ':' at column %s:\n%s\n%s" %
+ (colon_start, original_line, marker),
+ position)
+ continue
+ else:
+ # If we get here, the identifier was not recognized, so
+ # ignore the rest of the block just like the old annotation
+ # parser did. Doing this is a bit more strict than
+ # gtkdoc-mkdb (which continues to search for the identifier
+ # until either it is found or the end of the block is
+ # reached). In practice, however, ignoring the block is the
+ # right thing to do because sooner or later some long
+ # descriptions will contain something matching an identifier
+ # pattern by accident.
+ marker = ' '*column_offset + '^'
+ message.warn('ignoring unrecognized GTK-Doc comment block, identifier not '
+ 'found:\n%s\n%s' % (original_line, marker),
+ position)
+
+ return None
####################################################################
# Check for comment block parameters.
@@ -863,20 +864,19 @@ class AnnotationParser(object):
########################################################################
# We have picked up a couple of \n characters that where not
# intended. Strip those.
- if comment_block is not None:
- if comment_block.comment:
- comment_block.comment = comment_block.comment.strip()
- else:
- comment_block.comment = ''
+ if comment_block.comment:
+ comment_block.comment = comment_block.comment.strip()
+ else:
+ comment_block.comment = ''
- for tag in comment_block.tags.itervalues():
- self._clean_comment_block_part(tag)
+ for tag in comment_block.tags.itervalues():
+ self._clean_comment_block_part(tag)
- for param in comment_block.params.itervalues():
- self._clean_comment_block_part(param)
+ for param in comment_block.params.itervalues():
+ self._clean_comment_block_part(param)
- # Validate and store block.
- comment_block.validate()
+ # Validate and store block.
+ comment_block.validate()
return comment_block
def _clean_comment_block_part(self, part):
diff --git a/tests/scanner/regress.h b/tests/scanner/regress.h
index 43d9bd36..1740145f 100644
--- a/tests/scanner/regress.h
+++ b/tests/scanner/regress.h
@@ -786,12 +786,4 @@ void regress_test_struct_fixed_array_frob (RegressTestStructFixedArray *str);
void regress_has_parameter_named_attrs (int foo,
gpointer attributes);
-/**
-
- * regress_test_invalid_comment:
- * @foo: a param
- *
- * invalid comment with a line without
- * https://bugzilla.gnome.org/show_bug.cgi?id=673806
- */
#endif /* __GITESTTYPES_H__ */