gh-107883: Argument Clinic: Handle full module/class path in Function.fulldisplayname (#107884)

Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
This commit is contained in:
Erlend E. Aasland 2023-08-13 01:46:00 +02:00 committed by GitHub
parent bf707749e8
commit ee40b3e20d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 64 additions and 3 deletions

View file

@ -1513,6 +1513,60 @@ class ClinicParserTest(TestCase):
with self.subTest(block=block):
self.expect_failure(block, err)
def test_fulldisplayname_class(self):
dataset = (
("T", """
class T "void *" ""
T.__init__
"""),
("m.T", """
module m
class m.T "void *" ""
@classmethod
m.T.__new__
"""),
("m.T.C", """
module m
class m.T "void *" ""
class m.T.C "void *" ""
m.T.C.__init__
"""),
)
for name, code in dataset:
with self.subTest(name=name, code=code):
block = self.parse(code)
func = block.signatures[-1]
self.assertEqual(func.fulldisplayname, name)
def test_fulldisplayname_meth(self):
dataset = (
("func", "func"),
("m.func", """
module m
m.func
"""),
("T.meth", """
class T "void *" ""
T.meth
"""),
("m.T.meth", """
module m
class m.T "void *" ""
m.T.meth
"""),
("m.T.C.meth", """
module m
class m.T "void *" ""
class m.T.C "void *" ""
m.T.C.meth
"""),
)
for name, code in dataset:
with self.subTest(name=name, code=code):
block = self.parse(code)
func = block.signatures[-1]
self.assertEqual(func.fulldisplayname, name)
def test_depr_star_invalid_format_1(self):
block = """
module foo

View file

@ -2682,9 +2682,16 @@ class Function:
@functools.cached_property
def fulldisplayname(self) -> str:
if isinstance(self.module, Module):
return f"{self.module.name}.{self.displayname}"
return self.displayname
parent: Class | Module | Clinic | None
if self.kind.new_or_init:
parent = getattr(self.cls, "parent", None)
else:
parent = self.parent
name = self.displayname
while isinstance(parent, (Module, Class)):
name = f"{parent.name}.{name}"
parent = parent.parent
return name
@property
def render_parameters(self) -> list[Parameter]: