[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master 35d0190b0b: Properly indent Python PEP634 match/case blocks
From: |
Lars Ingebrigtsen |
Subject: |
master 35d0190b0b: Properly indent Python PEP634 match/case blocks |
Date: |
Sun, 22 May 2022 07:24:00 -0400 (EDT) |
branch: master
commit 35d0190b0b91c085c73bbe6c2b8e93ea8288b589
Author: Lele Gaifax <lele@metapensiero.it>
Commit: Lars Ingebrigtsen <larsi@gnus.org>
Properly indent Python PEP634 match/case blocks
Python 3.10 introduced the "structural pattern matching" syntax, and
commit 139042eb8629e6fd49b2c3002a8fc4d1aabd174d 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).
---
lisp/progmodes/python.el | 2 ++
test/lisp/progmodes/python-tests.el | 25 +++++++++++++++++++++++++
2 files changed, 27 insertions(+)
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index 0761aaebdc..94297d4ea5 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -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")))
diff --git a/test/lisp/progmodes/python-tests.el
b/test/lisp/progmodes/python-tests.el
index ee7b66610a..a3f778bbbe 100644
--- a/test/lisp/progmodes/python-tests.el
+++ b/test/lisp/progmodes/python-tests.el
@@ -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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- master 35d0190b0b: Properly indent Python PEP634 match/case blocks,
Lars Ingebrigtsen <=