From: Fabián Ezequiel Gallina Date: Thu, 12 Dec 2013 05:37:09 +0000 (-0300) Subject: * lisp/progmodes/python.el (python-indent-context) X-Git-Tag: emacs-24.3.90~173^2^2~42^2~45^2~387^2~454 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=09faee72dd0743a5b46444b5e917ee1259843788;p=emacs.git * lisp/progmodes/python.el (python-indent-context) (python-indent-calculate-indentation): Fix auto-identation behavior for comment blocks. * test/automated/python-tests.el (python-indent-after-comment-1) (python-indent-after-comment-2): New tests. Fixes: debbugs:15916 --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index fc66ed607d4..52d4eff3eb6 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,9 @@ +2013-12-12 Fabián Ezequiel Gallina + + * progmodes/python.el (python-indent-context) + (python-indent-calculate-indentation): Fix auto-identation + behavior for comment blocks. (Bug#15916) + 2013-12-12 Nathan Trapuzzano (tiny change) * progmodes/python.el (python-indent-calculate-indentation): When diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 669da135644..33039a4d087 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -686,6 +686,8 @@ Context information is returned with a cons with the form: \(STATUS . START) Where status can be any of the following symbols: + + * after-comment: When current line might continue a comment block * inside-paren: If point in between (), {} or [] * inside-string: If point is inside a string * after-backslash: Previous line ends in a backslash @@ -704,6 +706,17 @@ START is the buffer position where the sexp starts." (goto-char (line-beginning-position)) (bobp)) 'no-indent) + ;; Comment continuation + ((save-excursion + (when (and + (or + (python-info-current-line-comment-p) + (python-info-current-line-empty-p)) + (progn + (forward-comment -1) + (python-info-current-line-comment-p))) + (setq start (point)) + 'after-comment))) ;; Inside string ((setq start (python-syntax-context 'string ppss)) 'inside-string) @@ -755,6 +768,9 @@ START is the buffer position where the sexp starts." (save-excursion (pcase context-status (`no-indent 0) + (`after-comment + (goto-char context-start) + (current-indentation)) ;; When point is after beginning of block just add one level ;; of indentation relative to the context-start (`after-beginning-of-block diff --git a/test/ChangeLog b/test/ChangeLog index ce7208db229..790725b6342 100644 --- a/test/ChangeLog +++ b/test/ChangeLog @@ -1,3 +1,8 @@ +2013-12-12 Fabián Ezequiel Gallina + + * automated/python-tests.el (python-indent-after-comment-1) + (python-indent-after-comment-2): New tests. + 2013-12-12 Nathan Trapuzzano * automated/python-test.el (python-indent-block-enders-1): Rename diff --git a/test/automated/python-tests.el b/test/automated/python-tests.el index 58a839a5500..84be598b6dd 100644 --- a/test/automated/python-tests.el +++ b/test/automated/python-tests.el @@ -199,6 +199,83 @@ foo = long_function_name( (should (eq (car (python-indent-context)) 'inside-paren)) (should (= (python-indent-calculate-indentation) 4)))) +(ert-deftest python-indent-after-comment-1 () + "The most simple after-comment case that shouldn't fail." + (python-tests-with-temp-buffer + "# Contents will be modified to correct indentation +class Blag(object): + def _on_child_complete(self, child_future): + if self.in_terminal_state(): + pass + # We only complete when all our async children have entered a + # terminal state. At that point, if any child failed, we fail +# with the exception with which the first child failed. +" + (python-tests-look-at "# We only complete") + (should (eq (car (python-indent-context)) 'after-line)) + (should (= (python-indent-calculate-indentation) 8)) + (python-tests-look-at "# terminal state") + (should (eq (car (python-indent-context)) 'after-comment)) + (should (= (python-indent-calculate-indentation) 8)) + (python-tests-look-at "# with the exception") + (should (eq (car (python-indent-context)) 'after-comment)) + ;; This one indents relative to previous block, even given the fact + ;; that it was under-indented. + (should (= (python-indent-calculate-indentation) 4)) + (python-tests-look-at "# terminal state" -1) + ;; It doesn't hurt to check again. + (should (eq (car (python-indent-context)) 'after-comment)) + (python-indent-line) + (should (= (current-indentation) 8)) + (python-tests-look-at "# with the exception") + (should (eq (car (python-indent-context)) 'after-comment)) + ;; Now everything should be lined up. + (should (= (python-indent-calculate-indentation) 8)))) + +(ert-deftest python-indent-after-comment-2 () + "Test after-comment in weird cases." + (python-tests-with-temp-buffer + "# Contents will be modified to correct indentation +def func(arg): + # I don't do much + return arg + # This comment is badly indented just because. + # But we won't mess with the user in this line. + +now_we_do_mess_cause_this_is_not_a_comment = 1 + +# yeah, that. +" + (python-tests-look-at "# I don't do much") + (should (eq (car (python-indent-context)) 'after-beginning-of-block)) + (should (= (python-indent-calculate-indentation) 4)) + (python-tests-look-at "return arg") + ;; Comment here just gets ignored, this line is not a comment so + ;; the rules won't apply here. + (should (eq (car (python-indent-context)) 'after-beginning-of-block)) + (should (= (python-indent-calculate-indentation) 4)) + (python-tests-look-at "# This comment is badly") + (should (eq (car (python-indent-context)) 'after-line)) + ;; The return keyword moves indentation backwards 4 spaces, but + ;; let's assume this comment was placed there because the user + ;; wanted to (manually adding spaces or whatever). + (should (= (python-indent-calculate-indentation) 0)) + (python-tests-look-at "# but we won't mess") + (should (eq (car (python-indent-context)) 'after-comment)) + (should (= (python-indent-calculate-indentation) 4)) + ;; Behave the same for blank lines: potentially a comment. + (forward-line 1) + (should (eq (car (python-indent-context)) 'after-comment)) + (should (= (python-indent-calculate-indentation) 4)) + (python-tests-look-at "now_we_do_mess") + ;; Here is where comment indentation starts to get ignored and + ;; where the user can't freely indent anymore. + (should (eq (car (python-indent-context)) 'after-line)) + (should (= (python-indent-calculate-indentation) 0)) + (python-tests-look-at "# yeah, that.") + (should (eq (car (python-indent-context)) 'after-line)) + (should (= (python-indent-calculate-indentation) 0)))) + (ert-deftest python-indent-inside-paren-1 () "The most simple inside-paren case that shouldn't fail." (python-tests-with-temp-buffer