docs: kdoc: move the core dispatch into a state table
authorJonathan Corbet <corbet@lwn.net>
Fri, 6 Jun 2025 16:34:31 +0000 (10:34 -0600)
committerJonathan Corbet <corbet@lwn.net>
Mon, 9 Jun 2025 20:37:16 +0000 (14:37 -0600)
Since all of the handlers already nicely have the same prototype, put them
into a table and call them from there and take out the extended
if-then-else series.

Reviewed-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Signed-off-by: Jonathan Corbet <corbet@lwn.net>
Link: https://lore.kernel.org/r/20250606163438.229916-3-corbet@lwn.net
scripts/lib/kdoc/kdoc_parser.py

index 899d5446f95c3e77b063dfdeedefc95c7038c09c..1a6c6865b2c54582132ed9187d1056ae68449cc8 100644 (file)
@@ -1678,6 +1678,21 @@ class KernelDoc:
 
         return export_table
 
+    #
+    # The state/action table telling us which function to invoke in
+    # each state.
+    #
+    state_actions = {
+        state.NORMAL:                  process_normal,
+        state.NAME:                    process_name,
+        state.BODY:                    process_body,
+        state.BODY_MAYBE:              process_body,
+        state.BODY_WITH_BLANK_LINE:    process_body,
+        state.INLINE:                  process_inline,
+        state.PROTO:                   process_proto,
+        state.DOCBLOCK:                        process_docblock,
+        }
+
     def parse_kdoc(self):
         """
         Open and process each line of a C source file.
@@ -1729,19 +1744,8 @@ class KernelDoc:
                     self.process_export(export_table, line)
 
                     # Hand this line to the appropriate state handler
-                    if self.state == state.NORMAL:
-                        self.process_normal(ln, line)
-                    elif self.state == state.NAME:
-                        self.process_name(ln, line)
-                    elif self.state in [state.BODY, state.BODY_MAYBE,
-                                        state.BODY_WITH_BLANK_LINE]:
-                        self.process_body(ln, line)
-                    elif self.state == state.INLINE:  # scanning for inline parameters
-                        self.process_inline(ln, line)
-                    elif self.state == state.PROTO:
-                        self.process_proto(ln, line)
-                    elif self.state == state.DOCBLOCK:
-                        self.process_docblock(ln, line)
+                    self.state_actions[self.state](self, ln, line)
+
         except OSError:
             self.config.log.error(f"Error: Cannot open file {self.fname}")