]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-107883: Argument Clinic: Handle full module/class path in Function.fulldisplayname...
authorErlend E. Aasland <erlend@python.org>
Sat, 12 Aug 2023 23:46:00 +0000 (01:46 +0200)
committerGitHub <noreply@github.com>
Sat, 12 Aug 2023 23:46:00 +0000 (23:46 +0000)
Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
Lib/test/test_clinic.py
Tools/clinic/clinic.py

index a649b5fe2201c8122caa516b2ce2c7d00c3aa68d..55251b516d2b2fae4f121bcefb47b5b63aab38e4 100644 (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
index 70b066cce82faecc00238067e3c8ef3061724002..2d23f9d12875fffe3f6d50360909726471c1c605 100755 (executable)
@@ -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]: