From 6a69b80d1b1f3987fcec3300c5dc879c6e965079 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Tue, 19 Dec 2023 12:32:28 +0100 Subject: gh-112205: Require @getter and @setter to be methods (#113278) Co-authored-by: Alex Waygood --- Lib/test/test_clinic.py | 11 +++++++++++ Tools/clinic/clinic.py | 4 ++++ 2 files changed, 15 insertions(+) diff --git a/Lib/test/test_clinic.py b/Lib/test/test_clinic.py index d3dbde8..6c6bd4e 100644 --- a/Lib/test/test_clinic.py +++ b/Lib/test/test_clinic.py @@ -2249,6 +2249,17 @@ class ClinicParserTest(TestCase): expected_error = "Cannot apply both @getter and @setter to the same function!" self.expect_failure(block, expected_error, lineno=3) + def test_getset_no_class(self): + for annotation in "@getter", "@setter": + with self.subTest(annotation=annotation): + block = f""" + module m + {annotation} + m.func + """ + expected_error = "@getter and @setter must be methods" + self.expect_failure(block, expected_error, lineno=2) + def test_duplicate_coexist(self): err = "Called @coexist twice" block = """ diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index a9bf110..87feef1 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -5614,6 +5614,10 @@ class DSLParser: function_name = fields.pop() module, cls = self.clinic._module_and_class(fields) + if self.kind in {GETTER, SETTER}: + if not cls: + fail("@getter and @setter must be methods") + self.update_function_kind(full_name) if self.kind is METHOD_INIT and not return_converter: return_converter = init_return_converter() -- cgit v0.12