* lisp/progmodes/python.el (python-indent-calculate-indentation): Fix
de-denters cornercase. * test/automated/python-tests.el (python-indent-dedenters-2): New test. Fixes: debbugs:15731
This commit is contained in:
parent
b55e11bf85
commit
bc9222c934
4 changed files with 56 additions and 13 deletions
|
@ -1,3 +1,8 @@
|
|||
2013-12-12 Fabián Ezequiel Gallina <fgallina@gnu.org>
|
||||
|
||||
* progmodes/python.el (python-indent-calculate-indentation): Fix
|
||||
de-denters cornercase. (Bug#15731)
|
||||
|
||||
2013-12-12 Stefan Monnier <monnier@iro.umontreal.ca>
|
||||
|
||||
* emacs-lisp/nadvice.el: Add `depth' property to manage ordering.
|
||||
|
|
|
@ -780,19 +780,31 @@ START is the buffer position where the sexp starts."
|
|||
;; indentation, in the case current line starts with a
|
||||
;; `python-indent-dedenters' de-indent one level.
|
||||
(`after-line
|
||||
(-
|
||||
(save-excursion
|
||||
(goto-char context-start)
|
||||
(current-indentation))
|
||||
(if (or (save-excursion
|
||||
(back-to-indentation)
|
||||
(looking-at (regexp-opt python-indent-dedenters)))
|
||||
(save-excursion
|
||||
(python-util-forward-comment -1)
|
||||
(python-nav-beginning-of-statement)
|
||||
(looking-at (regexp-opt python-indent-block-enders))))
|
||||
python-indent-offset
|
||||
0)))
|
||||
(let* ((pair (save-excursion
|
||||
(goto-char context-start)
|
||||
(cons
|
||||
(current-indentation)
|
||||
(python-info-beginning-of-block-p))))
|
||||
(context-indentation (car pair))
|
||||
(after-block-start-p (cdr pair))
|
||||
(adjustment
|
||||
(if (or (save-excursion
|
||||
(back-to-indentation)
|
||||
(and
|
||||
;; De-indent only when dedenters are not
|
||||
;; next to a block start. This allows
|
||||
;; one-liner constructs such as:
|
||||
;; if condition: print "yay"
|
||||
;; else: print "wry"
|
||||
(not after-block-start-p)
|
||||
(looking-at (regexp-opt python-indent-dedenters))))
|
||||
(save-excursion
|
||||
(python-util-forward-comment -1)
|
||||
(python-nav-beginning-of-statement)
|
||||
(looking-at (regexp-opt python-indent-block-enders))))
|
||||
python-indent-offset
|
||||
0)))
|
||||
(- context-indentation adjustment)))
|
||||
;; When inside of a string, do nothing. just use the current
|
||||
;; indentation. XXX: perhaps it would be a good idea to
|
||||
;; invoke standard text indentation here
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2013-12-12 Fabián Ezequiel Gallina <fgallina@gnu.org>
|
||||
|
||||
* automated/python-tests.el (python-indent-dedenters-2): New test.
|
||||
|
||||
2013-12-12 Fabián Ezequiel Gallina <fgallina@gnu.org>
|
||||
|
||||
* automated/python-tests.el (python-indent-after-comment-1)
|
||||
|
|
|
@ -458,6 +458,28 @@ def foo(a, b, c):
|
|||
(should (eq (car (python-indent-context)) 'after-beginning-of-block))
|
||||
(should (= (python-indent-calculate-indentation) 12))))
|
||||
|
||||
(ert-deftest python-indent-dedenters-2 ()
|
||||
"Check one-liner block special case.."
|
||||
(python-tests-with-temp-buffer
|
||||
"
|
||||
cond = True
|
||||
if cond:
|
||||
|
||||
if cond: print 'True'
|
||||
else: print 'False'
|
||||
|
||||
else:
|
||||
return
|
||||
"
|
||||
(python-tests-look-at "else: print 'False'")
|
||||
;; When a block has code after ":" it's just considered a simple
|
||||
;; line as that's a common thing to happen in one-liners.
|
||||
(should (eq (car (python-indent-context)) 'after-line))
|
||||
(should (= (python-indent-calculate-indentation) 4))
|
||||
(python-tests-look-at "else:")
|
||||
(should (eq (car (python-indent-context)) 'after-line))
|
||||
(should (= (python-indent-calculate-indentation) 0))))
|
||||
|
||||
(ert-deftest python-indent-after-backslash-1 ()
|
||||
"The most common case."
|
||||
(python-tests-with-temp-buffer
|
||||
|
|
Loading…
Add table
Reference in a new issue