Properly indent Python PEP634 match/case blocks

Python 3.10 introduced the "structural pattern matching" syntax, and
commit 139042eb86 told font-lock about the
new keywords. This adds them also as block-start statements, to enable
proper indentation of such blocks.

* lisp/progmodes/python.el (python-rx): Add "match" and "case" as
block-start keywords.
* test/lisp/progmodes/python-tests.el (python-indent-after-match-block,
python-indent-after-case-block): New tests to verify indentation of
"match" and "case" blocks (bug#55572).
This commit is contained in:
Lele Gaifax 2022-05-22 10:44:31 +02:00 committed by Lars Ingebrigtsen
parent ae8b1b8fd4
commit 35d0190b0b
2 changed files with 27 additions and 0 deletions

View file

@ -362,6 +362,8 @@ This variant of `rx' supports common Python named REGEXPS."
`(rx-let ((block-start (seq symbol-start
(or "def" "class" "if" "elif" "else" "try"
"except" "finally" "for" "while" "with"
;; Python 3.10+ PEP634
"match" "case"
;; Python 3.5+ PEP492
(and "async" (+ space)
(or "def" "for" "with")))

View file

@ -1516,6 +1516,31 @@ this is an arbitrarily
(should (string= (buffer-substring-no-properties (point-min) (point-max))
expected)))))
(ert-deftest python-indent-after-match-block ()
"Test PEP634 match."
(python-tests-with-temp-buffer
"
match foo:
"
(should (eq (car (python-indent-context)) :no-indent))
(should (= (python-indent-calculate-indentation) 0))
(goto-char (point-max))
(should (eq (car (python-indent-context)) :after-block-start))
(should (= (python-indent-calculate-indentation) 4))))
(ert-deftest python-indent-after-case-block ()
"Test PEP634 case."
(python-tests-with-temp-buffer
"
match foo:
case 1:
"
(should (eq (car (python-indent-context)) :no-indent))
(should (= (python-indent-calculate-indentation) 0))
(goto-char (point-max))
(should (eq (car (python-indent-context)) :after-block-start))
(should (= (python-indent-calculate-indentation) 8))))
;;; Filling