From 74a7029c137a2a08d391146155a66346ffc3c3a9 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sun, 27 Aug 2023 23:57:29 +0200 Subject: [PATCH] gh-104683: Argument Clinic: Refactor the module and class resolver --- Lib/test/test_clinic.py | 4 ++-- Tools/clinic/clinic.py | 26 ++++++++++---------------- 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/Lib/test/test_clinic.py b/Lib/test/test_clinic.py index e7039d59070597..fcccf988d3a7dd 100644 --- a/Lib/test/test_clinic.py +++ b/Lib/test/test_clinic.py @@ -2324,10 +2324,10 @@ def test_invalid_legacy_converter(self): self.expect_failure(block, err, lineno=1) def test_parent_class_or_module_does_not_exist(self): - err = "Parent class or module 'z' does not exist" + err = "Parent class or module 'baz' does not exist" block = """ module m - z.func + baz.func """ self.expect_failure(block, err, lineno=1) diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index 70ec18f726e3f4..1fb53c3483123d 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -2554,7 +2554,7 @@ def parse(self, input: str) -> str: return printer.f.getvalue() def _module_and_class( - self, fields: Iterable[str] + self, fields: Sequence[str] ) -> tuple[Module | Clinic, Class | None]: """ fields should be an iterable of field names. @@ -2563,26 +2563,20 @@ def _module_and_class( this function is only ever used to find the parent of where a new class/module should go. """ - parent: Clinic | Module | Class - child: Module | Class | None - module: Clinic | Module + parent: Clinic | Module | Class = self + module: Clinic | Module = self cls: Class | None = None - so_far: list[str] = [] - parent = module = self - - for field in fields: - so_far.append(field) + for idx, field in enumerate(fields): if not isinstance(parent, Class): - child = parent.modules.get(field) - if child: - parent = module = child + if field in parent.modules: + parent = module = parent.modules[field] continue - child = parent.classes.get(field) - if not child: - fullname = ".".join(so_far) + if field in parent.classes: + parent = cls = parent.classes[field] + else: + fullname = ".".join(fields[idx:]) fail(f"Parent class or module {fullname!r} does not exist.") - cls = parent = child return module, cls