gh-104683: Argument Clinic: Refactor the module and class resolver (#108552)

This commit is contained in:
Erlend E. Aasland 2023-08-28 14:41:05 +02:00 committed by GitHub
parent 0e8b3fc718
commit d90973340b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 12 additions and 18 deletions

View file

@ -2324,10 +2324,10 @@ class ClinicParserTest(TestCase):
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)

View file

@ -2554,7 +2554,7 @@ impl_definition block
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 @@ impl_definition block
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