[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#62031: 29.0.60; python-mode indentation after re.match
From: |
Dmitry Gutov |
Subject: |
bug#62031: 29.0.60; python-mode indentation after re.match |
Date: |
Wed, 8 Mar 2023 19:57:36 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.7.1 |
On 08/03/2023 09:53, Lele Gaifax wrote:
I had a quick glance at this, and while I can confirm the problem with
the following test
diff --git a/test/lisp/progmodes/python-tests.el
b/test/lisp/progmodes/python-tests.el
index 4f24c042c6a..9926c4b002f 100644
--- a/test/lisp/progmodes/python-tests.el
+++ b/test/lisp/progmodes/python-tests.el
@@ -1982,6 +1982,17 @@ python-virt-bin
(should (eq (car (python-indent-context)) :after-block-start))
(should (= (python-indent-calculate-indentation) 8))))
+(ert-deftest python-indent-after-re-match ()
+ "Test BUG 62031 regression."
+ (python-tests-with-temp-buffer
+ "
+def test_re(string):
+ if re.match('^[a-c]+$', string):
+ print('yes')
+ else:
+"
+ (python-tests-look-at "else:")
+ (should (= (python-indent-calculate-indentation) 4))))
I could not figure out how this can be fixed, with my current knowledge
on python.el.
There are several places where the regexp produced by `(python-rx
block-start)' is used, many within a `(looking-at ...)' form and several
others in a `(re-search-forward ...)': given that block starting
"keywords" are required to be at the beginning of a line, possibly
preceded by whitespace, I think that the problem may arise from those
usages which do not explicitly enforce the constraint, but unfortunately
all my attempts to do that a) didn't make the test above green and b)
broke one or more of the other tests.
Right, the problem is that we need some post-check for block-start searches.
python-rx (like rx in general) is just a syntax for Emacs regexp, and it
doesn't support lookbehind or etc.
After some edebug-ing, the patch below seems to fix this case. Maybe
other uses of (python-rx block-start) need this treatment as well, but
I'd like to leave that to someone who comes later. And a lot of them
happen after a (back-to-indentation) call, so those seem covered too.
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index 1f970633bfc..aff8dc206b4 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -5792,7 +5792,9 @@ python-info-dedenter-opening-block-positions
(catch 'exit
(while (python-nav--syntactically
(lambda ()
- (re-search-backward (python-rx block-start) nil t))
+ (cl-loop do (re-search-backward (python-rx
block-start) nil t)
+ until (memq (char-before) '(nil ?\s ?\t
?\n))
+ finally return (point)))
#'<)
(let ((indentation (current-indentation)))
(when (and (not (memq indentation collected-indentations))
- bug#62031: 29.0.60; python-mode indentation after re.match, Rob Moss, 2023/03/07
- bug#62031: 29.0.60; python-mode indentation after re.match, Dmitry Gutov, 2023/03/07
- bug#62031: 29.0.60; python-mode indentation after re.match, Lele Gaifax, 2023/03/07
- bug#62031: 29.0.60; python-mode indentation after re.match, Rob Moss, 2023/03/08
- bug#62031: 29.0.60; python-mode indentation after re.match, Lele Gaifax, 2023/03/08
- bug#62031: 29.0.60; python-mode indentation after re.match, Ruijie Yu, 2023/03/08
- bug#62031: 29.0.60; python-mode indentation after re.match, Dmitry Gutov, 2023/03/08
- bug#62031: 29.0.60; python-mode indentation after re.match, Rob Moss, 2023/03/08
- bug#62031: 29.0.60; python-mode indentation after re.match, Eli Zaretskii, 2023/03/08
- bug#62031: 29.0.60; python-mode indentation after re.match,
Dmitry Gutov <=
- bug#62031: 29.0.60; python-mode indentation after re.match, Lele Gaifax, 2023/03/08
- bug#62031: 29.0.60; python-mode indentation after re.match, Dmitry Gutov, 2023/03/08
- bug#62031: 29.0.60; python-mode indentation after re.match, Ruijie Yu, 2023/03/08
- bug#62031: 29.0.60; python-mode indentation after re.match, kobarity, 2023/03/09
- bug#62031: 29.0.60; python-mode indentation after re.match, Dmitry Gutov, 2023/03/09
- bug#62031: 29.0.60; python-mode indentation after re.match, Lele Gaifax, 2023/03/09
- bug#62031: 29.0.60; python-mode indentation after re.match, Dmitry Gutov, 2023/03/09
- bug#62031: 29.0.60; python-mode indentation after re.match, Dmitry Gutov, 2023/03/08