From f6fcbf0ebfc310304b17b7032df3374394833e73 Mon Sep 17 00:00:00 2001
From: "Erlend E. Aasland" <erlend.aasland@protonmail.com>
Date: Thu, 18 May 2023 23:50:35 +0200
Subject: [PATCH 1/2] gh-104050: Add more typing annotations to Argument Clinic

- class Class
- class Module
- class PythonParser
- function compute_checksum()
- function parse_file()
- variable unsupported_special_methods
---
 Tools/clinic/clinic.py | 50 ++++++++++++++++++++++++++++++------------
 1 file changed, 36 insertions(+), 14 deletions(-)

diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py
index 5fcf2bf485fc8a..8f608d4855a422 100755
--- a/Tools/clinic/clinic.py
+++ b/Tools/clinic/clinic.py
@@ -2227,7 +2227,12 @@ def _module_and_class(self, fields):
         return module, cls
 
 
-def parse_file(filename, *, verify=True, output=None):
+def parse_file(
+        filename: str,
+        *,
+        verify: bool = True,
+        output: str | None = None
+) -> None:
     if not output:
         output = filename
 
@@ -2259,7 +2264,7 @@ def parse_file(filename, *, verify=True, output=None):
             write_file(fn, data)
 
 
-def compute_checksum(input, length=None):
+def compute_checksum(input: str, length: int | None = None) -> str:
     input = input or ''
     s = hashlib.sha1(input.encode('utf-8')).hexdigest()
     if length:
@@ -2270,10 +2275,10 @@ def compute_checksum(input, length=None):
 
 
 class PythonParser:
-    def __init__(self, clinic):
+    def __init__(self, clinic: Clinic) -> None:
         pass
 
-    def parse(self, block):
+    def parse(self, block: Block) -> None:
         s = io.StringIO()
         with OverrideStdioWith(s):
             exec(block.input)
@@ -2281,19 +2286,33 @@ def parse(self, block):
 
 
 class Module:
-    def __init__(self, name, module=None):
+    def __init__(
+            self,
+            name: str,
+            module: Module | None = None
+    ) -> None:
         self.name = name
         self.module = self.parent = module
 
-        self.modules = collections.OrderedDict()
-        self.classes = collections.OrderedDict()
-        self.functions = []
+        self.modules: ModuleDict = collections.OrderedDict()
+        self.classes: ClassDict = collections.OrderedDict()
+        self.functions: list[Function] = []
 
-    def __repr__(self):
+    def __repr__(self) -> str:
         return "<clinic.Module " + repr(self.name) + " at " + str(id(self)) + ">"
 
+ModuleDict = dict[str, Module]
+
+
 class Class:
-    def __init__(self, name, module=None, cls=None, typedef=None, type_object=None):
+    def __init__(
+            self,
+            name: str,
+            module: Module | None = None,
+            cls: Class | None = None,
+            typedef: str | None = None,
+            type_object: str | None = None
+    ) -> None:
         self.name = name
         self.module = module
         self.cls = cls
@@ -2301,13 +2320,16 @@ def __init__(self, name, module=None, cls=None, typedef=None, type_object=None):
         self.type_object = type_object
         self.parent = cls or module
 
-        self.classes = collections.OrderedDict()
-        self.functions = []
+        self.classes: ClassDict = collections.OrderedDict()
+        self.functions: list[Function] = []
 
-    def __repr__(self):
+    def __repr__(self) -> str:
         return "<clinic.Class " + repr(self.name) + " at " + str(id(self)) + ">"
 
-unsupported_special_methods = set("""
+ClassDict = dict[str, Class]
+
+
+unsupported_special_methods: set[str] = set("""
 
 __abs__
 __add__

From 51078a6f3a452b77ed02ed3bd7df0446fc4cd8a6 Mon Sep 17 00:00:00 2001
From: "Erlend E. Aasland" <erlend.aasland@protonmail.com>
Date: Fri, 19 May 2023 00:30:07 +0200
Subject: [PATCH 2/2] Address review and remove some incorrect annotations

---
 Tools/clinic/clinic.py | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py
index 8019fd0f91448a..3d4961e6e7d7dd 100755
--- a/Tools/clinic/clinic.py
+++ b/Tools/clinic/clinic.py
@@ -2266,7 +2266,10 @@ def parse_file(
             write_file(fn, data)
 
 
-def compute_checksum(input: str, length: int | None = None) -> str:
+def compute_checksum(
+        input: str | None,
+        length: int | None = None
+) -> str:
     input = input or ''
     s = hashlib.sha1(input.encode('utf-8')).hexdigest()
     if length:
@@ -2287,11 +2290,13 @@ def parse(self, block: Block) -> None:
         block.output = s.getvalue()
 
 
+ModuleDict = dict[str, "Module"]
+
 class Module:
     def __init__(
             self,
             name: str,
-            module: Module | None = None
+            module = None
     ) -> None:
         self.name = name
         self.module = self.parent = module
@@ -2303,15 +2308,15 @@ def __init__(
     def __repr__(self) -> str:
         return "<clinic.Module " + repr(self.name) + " at " + str(id(self)) + ">"
 
-ModuleDict = dict[str, Module]
 
+ClassDict = dict[str, "Class"]
 
 class Class:
     def __init__(
             self,
             name: str,
             module: Module | None = None,
-            cls: Class | None = None,
+            cls = None,
             typedef: str | None = None,
             type_object: str | None = None
     ) -> None:
@@ -2328,8 +2333,6 @@ def __init__(
     def __repr__(self) -> str:
         return "<clinic.Class " + repr(self.name) + " at " + str(id(self)) + ">"
 
-ClassDict = dict[str, Class]
-
 
 unsupported_special_methods: set[str] = set("""