From 224b70cbc50f55b8e9a65b9b8666ce2bff6d796b Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Tue, 18 May 2010 15:24:24 -0400 Subject: [PATCH] * emacs-lisp/smie.el (smie-next-sexp): Break inf-loop at BOB. (smie-backward-sexp, smie-forward-sexp): Remove boundary condition now handled in smie-next-sexp. (smie-indent-calculate): Provide a starting indentation (so the recursion is well-founded ;-). --- lisp/ChangeLog | 6 ++++++ lisp/emacs-lisp/smie.el | 18 +++++++++++------- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 91265a15bbf..cb0ca655188 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,11 @@ 2010-05-18 Stefan Monnier + * emacs-lisp/smie.el (smie-next-sexp): Break inf-loop at BOB. + (smie-backward-sexp, smie-forward-sexp): Remove boundary condition now + handled in smie-next-sexp. + (smie-indent-calculate): Provide a starting indentation (so the + recursion is well-founded ;-). + Fix handling of non-associative equal levels. * emacs-lisp/smie.el (smie-prec2-levels): Choose distinct levels even when it's not needed. diff --git a/lisp/emacs-lisp/smie.el b/lisp/emacs-lisp/smie.el index 0e7b0dc19ca..9ea2cf56890 100644 --- a/lisp/emacs-lisp/smie.el +++ b/lisp/emacs-lisp/smie.el @@ -348,10 +348,13 @@ Possible return values: (cond ((null toklevels) - (if (equal token "") + (when (equal token "") (condition-case err (progn (goto-char pos) (funcall next-sexp 1) nil) - (scan-error (throw 'return (list t (caddr err))))))) + (scan-error (throw 'return (list t (caddr err))))) + (if (eq pos (point)) + ;; We did not move, so let's abort the loop. + (throw 'return (list t (point)))))) ((null (funcall op-back toklevels)) ;; A token like a paren-close. (assert (funcall op-forw toklevels)) ;Otherwise, why mention it? @@ -401,15 +404,13 @@ Possible return values: (t POS TOKEN): same thing but for an open-paren or the beginning of buffer. (nil POS TOKEN): we skipped over a paren-like pair. nil: we skipped over an identifier, matched parentheses, ..." - (if (bobp) (list t (point)) (smie-next-sexp (lambda () (forward-comment (- (point-max))) (smie-backward-token)) (indirect-function 'backward-sexp) (indirect-function 'smie-op-left) (indirect-function 'smie-op-right) - halfsexp))) + halfsexp)) -;; Mirror image, not used for indentation. (defun smie-forward-sexp (&optional halfsexp) "Skip over one sexp. HALFSEXP if non-nil, means skip over a partial sexp if needed. I.e. if the @@ -421,13 +422,12 @@ Possible return values: (t POS TOKEN): same thing but for an open-paren or the beginning of buffer. (nil POS TOKEN): we skipped over a paren-like pair. nil: we skipped over an identifier, matched parentheses, ..." - (if (eobp) (list t (point)) (smie-next-sexp (lambda () (forward-comment (point-max)) (smie-forward-token)) (indirect-function 'forward-sexp) (indirect-function 'smie-op-right) (indirect-function 'smie-op-left) - halfsexp))) + halfsexp)) (defun smie-backward-sexp-command (&optional n) "Move backward through N logical elements." @@ -514,6 +514,10 @@ VIRTUAL can take two different non-nil values: (and virtual (if (eq virtual :hanging) (not (smie-indent-hanging-p)) (smie-bolp)) (current-column)) + ;; Start the file at column 0. + (save-excursion + (forward-comment (- (point-max))) + (if (bobp) 0)) ;; Align close paren with opening paren. (save-excursion ;; (forward-comment (point-max)) -- 2.39.5