8000 gh-113317: Argument Clinic: don't use global state in warn() and fail… · python/cpython@7f074a7 · GitHub
[go: up one dir, main page]

Skip to content

Commit 7f074a7

Browse files
gh-113317: Argument Clinic: don't use global state in warn() and fail() (#115510)
1 parent 98ee4ec commit 7f074a7

File tree

2 files changed

+23
-16
lines changed

2 files changed

+23
-16
lines changed

Lib/test/test_clinic.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1900,7 +1900,7 @@ def test_parameters_no_more_than_one_vararg(self):
19001900
*vararg1: object
19011901
*vararg2: object
19021902
"""
1903-
self.expect_failure(block, err, lineno=0)
1903+
self.expect_failure(block, err, lineno=3)
19041904

19051905
def test_function_not_at_column_0(self):
19061906
function = self.parse_function("""
@@ -2286,10 +2286,10 @@ def test_non_ascii_character_in_docstring(self):
22862286
self.parse(block)
22872287
# The line numbers are off; this is a known limitation.
22882288
expected = dedent("""\
2289-
Warning in file 'clinic_tests' on line 0:
2289+
Warning:
22902290
Non-ascii characters are not allowed in docstrings: 'á'
22912291
2292-
Warning in file 'clinic_tests' on line 0:
2292+
Warning:
22932293
Non-ascii characters are not allowed in docstrings: 'ü', 'á', 'ß'
22942294
22952295
""")
@@ -2390,7 +2390,7 @@ def test_state_func_docstring_no_summary(self):
23902390
docstring1
23912391
docstring2
23922392
"""
2393-
self.expect_failure(block, err, lineno=0)
2393+
self.expect_failure(block, err, lineno=3)
23942394

23952395
def test_state_func_docstring_only_one_param_template(self):
23962396
err = "You may not specify {parameters} more than once in a docstring!"
@@ -2404,7 +2404,7 @@ def test_state_func_docstring_only_one_param_template(self):
24042404
these are the params again:
24052405
{parameters}
24062406
"""
2407-
self.expect_failure(block, err, lineno=0)
2407+
self.expect_failure(block, err, lineno=7)
24082408

24092409

24102410
class ClinicExternalTest(TestCase):

Tools/clinic/clinic.py

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -116,11 +116,6 @@ def warn_or_fail(
116116
line_number: int | None = None,
117117
) -> None:
118118
joined = " ".join([str(a) for a in args])
119-
if clinic:
120-
if filename is None:
121-
filename = clinic.filename
122-
if getattr(clinic, 'block_parser', None) and (line_number is None):
123-
line_number = clinic.block_parser.line_number
124119
error = ClinicError(joined, filename=filename, lineno=line_number)
125120
if fail:
126121
raise error
@@ -277,7 +272,7 @@ class Language(metaclass=abc.ABCMeta):
277272
checksum_line = ""
278273

279274
def __init__(self, filename: str) -> None:
280-
...
275+
self.filename = filename
281276

282277
@abc.abstractmethod
283278
def render(
@@ -833,8 +828,6 @@ def output_templates(
833828
if not p.is_optional():
834829
min_kw_only = i - max_pos
835830
elif p.is_vararg():
836-
if vararg != self.NO_VARARG:
837-
fail("Too many var args")
838831
pseudo_args += 1
839832
vararg = i - 1
840833
else:
@@ -1889,7 +1882,12 @@ def __next__(self) -> Block:
18891882
raise StopIteration
18901883

18911884
if self.dsl_name:
1892-
return_value = self.parse_clinic_block(self.dsl_name)
1885+
try:
1886+
return_value = self.parse_clinic_block(self.dsl_name)
1887+
except ClinicError as exc:
1888+
exc.filename = self.language.filename
1889+
exc.lineno = self.line_number
1890+
raise
18931891
self.dsl_name = None
18941892
self.first_block = False
18951893
return return_value
@@ -5071,14 +5069,16 @@ def parse(self, block: Block) -> None:
50715069
self.state(line)
50725070
except ClinicError as exc:
50735071
exc.lineno = line_number
5072+
exc.filename = self.clinic.filename
50745073
raise
50755074

50765075
self.do_post_block_processing_cleanup(line_number)
50775076
block.output.extend(self.clinic.language.render(self.clinic, block.signatures))
50785077

50795078
if self.preserve_output:
50805079
if block.output:
5081-
fail("'preserve' only works for blocks that don't produce any output!")
5080+
fail("'preserve' only works for blocks that don't produce any output!",
5081+
line_number=line_number)
50825082
block.output = self.saved_output
50835083

50845084
def in_docstring(self) -> bool:
@@ -5503,6 +5503,8 @@ def parse_parameter(self, line: str) -> None:
55035503
f"invalid parameter declaration (**kwargs?): {line!r}")
55045504

55055505
if function_args.vararg:
5506+
if any(p.is_vararg() for p in self.function.parameters.values()):
5507+
fail("Too many var args")
55065508
is_vararg = True
55075509
parameter = function_args.vararg
55085510
else:
@@ -6174,7 +6176,12 @@ def do_post_block_processing_cleanup(self, lineno: int) -> None:
61746176
return
61756177

61766178
self.check_remaining_star(lineno)
6177-
self.function.docstring = self.format_docstring()
6179+
try:
6180+
self.function.docstring = self.format_docstring()
6181+
except ClinicError as exc:
6182+
exc.lineno = lineno
6183+
exc.filename = self.clinic.filename
6184+
raise
61786185

61796186

61806187

0 commit comments

Comments
 (0)
0