10000 gh-117431: Argument Clinic: copy forced text signature when cloning (… · python/cpython@0d42ac9 · GitHub
[go: up one dir, main page]

Skip to content

Commit 0d42ac9

Browse files
gh-117431: Argument Clinic: copy forced text signature when cloning (#117591)
1 parent 73906d5 commit 0d42ac9

File tree

4 files changed

+70
-10
lines changed

4 files changed

+70
-10
lines changed

Lib/test/test_clinic.py

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from functools import partial
66
from test import support, test_tools
77
from test.support import os_helper
8-
from test.support.os_helper import TESTFN, unlink
8+
from test.support.os_helper import TESTFN, unlink, rmtree
99
from textwrap import dedent
1010
from unittest import TestCase
1111
import inspect
@@ -662,6 +662,61 @@ class C "void *" ""
662662
err = "Illegal C basename: '.illegal.'"
663663
self.expect_failure(block 10000 , err, lineno=7)
664664

665+
def test_cloned_forced_text_signature(self):
666+
block = dedent("""
667+
/*[clinic input]
668+
@text_signature "($module, a[, b])"
669+
src
670+
a: object
671+
param a
672+
b: object = NULL
673+
/
674+
675+
docstring
676+
[clinic start generated code]*/
677+
678+
/*[clinic input]
679+
dst = src
680+
[clinic start generated code]*/
681+
""")
682+
self.clinic.parse(block)
683+
self.addCleanup(rmtree, "clinic")
684+
funcs = self.clinic.functions
685+
self.assertEqual(len(funcs), 2)
686+
687+
src_docstring_lines = funcs[0].docstring.split("\n")
688+
dst_docstring_lines = funcs[1].docstring.split("\n")
689+
690+
# Signatures are copied.
691+
self.assertEqual(src_docstring_lines[0], "src($module, a[, b])")
692+
self.assertEqual(dst_docstring_lines[0], "dst($module, a[, b])")
693+
694+
# Param docstrings are copied.
695+
self.assertIn(" param a", src_docstring_lines)
696+
self.assertIn(" param a", dst_docstring_lines)
697+
698+
# Docstrings are not copied.
699+
self.assertIn("docstring", src_docstring_lines)
700+
self.assertNotIn("docstring", dst_docstring_lines)
701+
702+
def test_cloned_forced_text_signature_illegal(self):
703+
block = """
704+
/*[clinic input]
705+
@text_signature "($module, a[, b])"
706+
src
707+
a: object
708+
b: object = NULL
709+
/
710+
[clinic start generated code]*/
711+
712+
/*[clinic input]
713+
@text_signature "($module, a_override[, b])"
714+
dst = src
715+
[clinic start generated code]*/
716+
"""
717+
err = "Cannot use @text_signature when cloning a function"
718+
self.expect_failure(block, err, lineno=11)
719+
665720

666721
class ParseFileUnitTest(TestCase):
667722
def expect_parsing_failure(

Objects/clinic/unicodeobject.c.h

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Tools/clinic/libclinic/dsl_parser.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -666,6 +666,8 @@ def state_modulename_name(self, line: str) -> None:
666666
if equals:
667667
existing = existing.strip()
668668
if libclinic.is_legal_py_identifier(existing):
669+
if self.forced_text_signature:
670+
fail("Cannot use @text_signature when cloning a function")
669671
# we're cloning!
670672
names = self.parse_function_names(before)
671673
return self.parse_cloned_function(names, existing)
@@ -689,7 +691,8 @@ def state_modulename_name(self, line: str) -> None:
689691
kind=self.kind,
690692
coexist=self.coexist,
691693
critical_section=self.critical_section,
692-
target_critical_section=self.target_critical_section
694+
target_critical_section=self.target_critical_section,
695+
forced_text_signature=self.forced_text_signature
693696
)
694697
self.add_function(func)
695698

@@ -1324,13 +1327,14 @@ def state_function_docstring(self, line: str) -> None:
13241327

13251328
self.docstring_append(self.function, line)
13261329

1330+
@staticmethod
13271331
def format_docstring_signature(
1328-
self, f: Function, parameters: list[Parameter]
1332+
f: Function, parameters: list[Parameter]
13291333
) -> str:
13301334
lines = []
13311335
lines.append(f.displayname)
1332-
if self.forced_text_signature:
1333-
lines.append(self.forced_text_signature)
1336+
if f.forced_text_signature:
1337+
lines.append(f.forced_text_signature)
13341338
elif f.kind in {GETTER, SETTER}:
13351339
# @getter and @setter do not need signatures like a method or a function.
13361340
return ''

Tools/clinic/libclinic/function.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ class Function:
107107
# functions with optional groups because we can't represent
108108
# those accurately with inspect.Signature in 3.4.
109109
docstring_only: bool = False
110+
forced_text_signature: str | None = None
110111
critical_section: bool = False
111112
target_critical_section: list[str] = dc.field(default_factory=list)
112113

0 commit comments

Comments
 (0)
0