[gtk-doc] mkdb: fix skipping of inline function bodies



commit f19b91f2ae25f0fc2881e7414316d89a0678c9fb
Author: Stefan Sauer <ensonic users sf net>
Date:   Wed Jul 24 19:12:36 2019 +0200

    mkdb: fix skipping of inline function bodies
    
    Add a bunch of tests for this.
    Fixes #90

 gtkdoc/scan.py | 19 ++++++++-----
 tests/scan.py  | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----
 2 files changed, 97 insertions(+), 12 deletions(-)
---
diff --git a/gtkdoc/scan.py b/gtkdoc/scan.py
index a031905..15d73b6 100644
--- a/gtkdoc/scan.py
+++ b/gtkdoc/scan.py
@@ -791,13 +791,20 @@ def ScanHeaderContent(input_lines, decl_list, get_types, options):
                 in_declaration = 'union'
                 logging.info('Union(_): "%s"', symbol)
         else:
-            logging.info('in decl: skip=%s %s', skip_block, line.strip())
+            logging.info('in decl %s: skip=%s %s', in_declaration, skip_block, line.strip())
             decl += line
 
-            if skip_block:
+            if skip_block and '{' in decl:
                 (skip_block, decl) = remove_braced_content(decl)
                 logging.info('in decl: skip=%s decl=[%s]', skip_block, decl)
 
+        pre_previous_line = previous_line
+        previous_line = line
+
+        if skip_block:
+            logging.info('skipping, in decl %s, decl=[%s]', in_declaration, decl)
+            continue
+
         if in_declaration == "g-declare":
             dm = re.search(r'\s*(\w+)\s*,\s*(\w+)\s*,\s*(\w+)\s*,\s*(\w+)\s*,\s*(\w+)\s*\).*$', decl)
             # FIXME the original code does s// stuff here and we don't. Is it necessary?
@@ -928,9 +935,6 @@ def ScanHeaderContent(input_lines, decl_list, get_types, options):
                 level -= line.count('}')
                 logging.info('struct/union level : %d', level)
 
-        pre_previous_line = previous_line
-        previous_line = line
-
     # here we want in_declaration=='', otherwise we have a partial declaration
     if in_declaration != '':
         raise RuntimeError('partial declaration (%s) : %s ' % (in_declaration, decl))
@@ -959,17 +963,18 @@ def remove_braced_content(decl):
 
     skip_block = True
     # Remove all nested pairs of curly braces.
-    brace_remover = r'{[^{]*}'
+    brace_remover = r'{[^{]*?}'
     bm = re.search(brace_remover, decl)
     while bm:
         decl = re.sub(brace_remover, '', decl)
+        logging.info('decl=[%s]' % decl)
         bm = re.search(brace_remover, decl)
 
     # If all '{' have been matched and removed, we're done
     bm = re.search(r'(.*?){', decl)
     if not bm:
         # this is a hack to detect the end of declaration
-        decl += ';'
+        decl = decl.rstrip() + ';'
         skip_block = False
         logging.info('skip_block done')
 
diff --git a/tests/scan.py b/tests/scan.py
index 98fddf7..77ddf3a 100755
--- a/tests/scan.py
+++ b/tests/scan.py
@@ -832,15 +832,95 @@ class SeparateSubSections(ScanHeaderContentTestCase):
             liststr.splitlines())
 
 
+class RemoveBracedContent(ScanHeaderContentTestCase):
+
+    def test_OneLineFunctionBodyIsRemoved(self):
+        decl = textwrap.dedent("""\
+            static inline int function(int a) { return a + a; }""")
+        (skip, decl) = scan.remove_braced_content(decl)
+        self.assertEqual("static inline int function(int a);", decl)
+        self.assertEqual(skip, False)
+
+    def test_SimpleFunctionBodyIsRemoved(self):
+        decl = textwrap.dedent("""\
+            static inline int function(int a) {
+              return a + a;
+            }""")
+        (skip, decl) = scan.remove_braced_content(decl)
+        self.assertEqual("static inline int function(int a);", decl)
+        self.assertEqual(skip, False)
+
+    def test_SimpleFunctionWithNewlineBodyIsRemoved(self):
+        decl = textwrap.dedent("""\
+            static inline int function(int a)
+            {
+              return a + a;
+            }""")
+        (skip, decl) = scan.remove_braced_content(decl)
+        self.assertEqual("static inline int function(int a);", decl)
+        self.assertEqual(skip, False)
+
+    def test_NestedFunctionBodyIsRemoved(self):
+        decl = textwrap.dedent("""\
+            static inline int function(int a) {
+              if (a > 0) {
+                return a + a;
+              } else {
+                return a - a;
+              }
+            }""")
+        (skip, decl) = scan.remove_braced_content(decl)
+        self.assertEqual("static inline int function(int a);", decl)
+        self.assertEqual(skip, False)
+
+    def test_NestedFunctionWithNewlinesBodyIsRemoved(self):
+        decl = textwrap.dedent("""\
+            static inline int function(int a)
+            {
+              if (a > 0)
+              {
+                return a + a;
+              }
+              else
+              {
+                return a - a;
+              }
+            }""")
+        (skip, decl) = scan.remove_braced_content(decl)
+        self.assertEqual("static inline int function(int a);", decl)
+        self.assertEqual(skip, False)
+
+    def test_SimpleFunctionWithParenthesisBodyIsRemoved(self):
+        decl = textwrap.dedent("""\
+            static inline int
+            (function) (int a)
+            {
+              return a + a;
+            }""")
+        (skip, decl) = scan.remove_braced_content(decl)
+        self.assertEqual("static inline int\n(function) (int a);", decl)
+        self.assertEqual(skip, False)
+
+    def test_FunctionWithMultilineParamsBodyIsRemoved(self):
+        decl = textwrap.dedent("""\
+            static inline int
+            function (int a,
+                      int b)
+            {
+              return a + b;
+            }""")
+        (skip, decl) = scan.remove_braced_content(decl)
+        self.assertEqual(
+            "static inline int\nfunction (int a,\n          int b);", decl)
+        self.assertEqual(skip, False)
+
+
 if __name__ == '__main__':
     from gtkdoc import common
     common.setup_logging()
 
     unittest.main()
 
-    # from gtkdoc import common
-    # common.setup_logging()
-    #
-    # t = ScanHeaderContentFunctions()
+    # t = RemoveBracedContent()
     # t.setUp()
-    # t.test_IgnoresInternalInlineFunction()
+    # t.test_NestedFunctionBodyIsRemoved()


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]