| From 2667d8cd95a2a29c35c1bb8f4629c22fd0aa98e9 Mon Sep 17 00:00:00 2001 |
| From: Xavier Claessens <xavier.claessens@collabora.com> |
| Date: Thu, 2 Jan 2020 21:56:10 -0500 |
| Subject: [PATCH 1/3] Skip G_GNUC_(BEGIN|END)_IGNORE_DEPRECATIONS lines |
| |
| For some reason, glib has to put empty line before and after each of |
| these lines otherwise the symbol following it is undeclared. |
| --- |
| gtkdoc/scan.py | 5 +++++ |
| 1 file changed, 5 insertions(+) |
| |
| diff --git a/gtkdoc/scan.py b/gtkdoc/scan.py |
| index d04d4d4..7de08ad 100644 |
| --- a/gtkdoc/scan.py |
| +++ b/gtkdoc/scan.py |
| @@ -561,6 +561,11 @@ def ScanHeaderContent(input_lines, decl_list, get_types, options): |
| logging.info('Found start of comment: %s', line.strip()) |
| continue |
| |
| + # Skip begin/end deprecation macros. |
| + m = re.search(r'^\s*G_GNUC_(BEGIN|END)_IGNORE_DEPRECATIONS', line) |
| + if m: |
| + continue |
| + |
| logging.info('no decl: %s', line.strip()) |
| |
| cm = [m.match(line) for m in CLINE_MATCHER] |
| -- |
| 2.20.1 |
| |
| |
| From 9e58548688c9768cf41c59ccef531d438ffb2504 Mon Sep 17 00:00:00 2001 |
| From: Xavier Claessens <xavier.claessens@collabora.com> |
| Date: Fri, 3 Jan 2020 06:47:47 -0500 |
| Subject: [PATCH 2/3] typedef can be followed by decorator |
| |
| --- |
| gtkdoc/scan.py | 30 +++++++++++++++++------------- |
| 1 file changed, 17 insertions(+), 13 deletions(-) |
| |
| diff --git a/gtkdoc/scan.py b/gtkdoc/scan.py |
| index 7de08ad..5a5da92 100644 |
| --- a/gtkdoc/scan.py |
| +++ b/gtkdoc/scan.py |
| @@ -96,19 +96,8 @@ CLINE_MATCHER = [ |
| (struct|union)\s* |
| \w*\s*{""", re.VERBOSE), |
| # 12-14: OTHER TYPEDEFS |
| - re.compile( |
| - r"""^\s*typedef\s+ |
| - (?:struct|union)\s+\w+[\s\*]+ |
| - (\w+) # 1: name |
| - \s*;""", re.VERBOSE), |
| - re.compile( |
| - r"""^\s* |
| - (?:G_GNUC_EXTENSION\s+)? |
| - typedef\s+ |
| - (.+[\s\*]) # 1: e.g. 'unsigned int' |
| - (\w+) # 2: name |
| - (?:\s*\[[^\]]+\])* |
| - \s*;""", re.VERBOSE), |
| + None, # in InitScanner() |
| + None, # in InitScanner() |
| re.compile(r'^\s*typedef\s+'), |
| # 15: VARIABLES (extern'ed variables) |
| None, # in InitScanner() |
| @@ -267,6 +256,21 @@ def InitScanner(options): |
| %s # 3: optional decorator |
| \s*;""" % optional_decorators_regex, re.VERBOSE) |
| # OTHER TYPEDEFS |
| + CLINE_MATCHER[12] = re.compile( |
| + r"""^\s*typedef\s+ |
| + (?:struct|union)\s+\w+[\s\*]+ |
| + (\w+) # 1: name |
| + %s # 2: optional decorator |
| + \s*;""" % optional_decorators_regex, re.VERBOSE) |
| + CLINE_MATCHER[13] = re.compile( |
| + r"""^\s* |
| + (?:G_GNUC_EXTENSION\s+)? |
| + typedef\s+ |
| + (.+?[\s\*]) # 1: e.g. 'unsigned int' |
| + (\w+) # 2: name |
| + (?:\s*\[[^\]]+\])* |
| + %s # 3: optional decorator |
| + \s*;""" % optional_decorators_regex, re.VERBOSE) |
| CLINE_MATCHER[15] = re.compile( |
| r"""^\s* |
| (?:extern|[A-Za-z_]+VAR%s)\s+ |
| -- |
| 2.20.1 |
| |
| |
| From 5bfe23f0257e1b4c6c9a4e3a2dbb180455f753f2 Mon Sep 17 00:00:00 2001 |
| From: Jason Crain <jason@inspiresomeone.us> |
| Date: Mon, 6 Jan 2020 19:05:42 -0700 |
| Subject: [PATCH 3/3] scan: support deprecated struct members |
| |
| gcc allows deprecating members of structs. For example: |
| |
| struct data { |
| int x G_GNUC_DEPRECATED_FOR(replacement); |
| }; |
| |
| However, this currently causes the entire struct to be marked as |
| deprecated and confuses mkdb because it doesn't understand the |
| G_GNUC_DEPRECATED_FOR symbol. |
| |
| Fix this by having the whole struct only be marked as deprecated if the |
| '_DEPRECATED' is after the closing bracket of the struct, similar to how |
| it already does for enums, and having scan automatically remove all |
| G_GNUC_* decorators from struct members, similar to how it already does |
| for functions. |
| --- |
| gtkdoc/scan.py | 12 ++++++++++-- |
| tests/scan.py | 17 +++++++++++++++++ |
| 2 files changed, 27 insertions(+), 2 deletions(-) |
| |
| diff --git a/gtkdoc/scan.py b/gtkdoc/scan.py |
| index 5a5da92..6c6534a 100644 |
| --- a/gtkdoc/scan.py |
| +++ b/gtkdoc/scan.py |
| @@ -538,7 +538,7 @@ def ScanHeaderContent(input_lines, decl_list, get_types, options): |
| # section (#endif /* XXX_DEPRECATED */ |
| if deprecated_conditional_nest == 0 and '_DEPRECATED' in line: |
| m = re.search(r'^\s*#\s*(if*|define|endif)', line) |
| - if not (m or in_declaration == 'enum'): |
| + if not (m or in_declaration == 'enum' or in_declaration == 'struct'): |
| logging.info('Found deprecation annotation (decl: "%s"): "%s"', |
| in_declaration, line.strip()) |
| deprecated_conditional_nest += 0.1 |
| @@ -953,9 +953,17 @@ def ScanHeaderContent(input_lines, decl_list, get_types, options): |
| title = '<TITLE>%s</TITLE>' % objectname |
| |
| logging.info('Store struct: "%s"', symbol) |
| + # Structs could contain deprecated members and that doesn't |
| + # mean the whole struct is deprecated, so they are ignored when |
| + # setting deprecated_conditional_nest above. Here we can check |
| + # if the _DEPRECATED is between '}' and ';' which would mean |
| + # the struct as a whole is deprecated. |
| + if re.search(r'\n\s*\}.*_DEPRECATED.*;\s*$', decl): |
| + deprecated = '<DEPRECATED/>\n' |
| if AddSymbolToList(slist, symbol): |
| structsym = in_declaration.upper() |
| - stripped_decl = re.sub('(%s)' % optional_decorators_regex, '', decl) |
| + regex = r'(?:\s+(?:G_GNUC_\w+(?:\(\w*\))?%s))' % ignore_decorators |
| + stripped_decl = re.sub(regex, '', decl) |
| decl_list.append('<%s>\n<NAME>%s</NAME>\n%s%s</%s>\n' % |
| (structsym, symbol, deprecated, stripped_decl, structsym)) |
| if symbol in forward_decls: |
| diff --git a/tests/scan.py b/tests/scan.py |
| index ad63541..6d608b6 100755 |
| --- a/tests/scan.py |
| +++ b/tests/scan.py |
| @@ -552,6 +552,23 @@ class ScanHeaderContentStructs(ScanHeaderContentTestCase): |
| slist, doc_comments = self.scanHeaderContent([header]) |
| self.assertDecl('data', expected, slist) |
| |
| + def test_HandleDeprecatedMemberDecorator(self): |
| + """Struct with deprecated members.""" |
| + header = textwrap.dedent("""\ |
| + struct data { |
| + int x1 G_GNUC_DEPRECATED; |
| + int x2 G_GNUC_DEPRECATED_FOR(replacement); |
| + };""") |
| + expected = textwrap.dedent("""\ |
| + struct data { |
| + int x1; |
| + int x2; |
| + };""") |
| + scan.InitScanner(self.options) |
| + slist, doc_comments = self.scanHeaderContent( |
| + header.splitlines(keepends=True)) |
| + self.assertDecl('data', expected, slist) |
| + |
| |
| class ScanHeaderContentUnions(ScanHeaderContentTestCase): |
| """Test parsing of union declarations.""" |
| -- |
| 2.20.1 |
| |