Mercurial > emacs
changeset 45573:54fb43cbbd73
(common-lisp-indent-function-1):
When recognizing a def... construct, make that indentation
tentative, so that it can be overridden if the list in question
is not actually an expression.
(common-lisp-indent-call-method): New subroutine.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Wed, 29 May 2002 16:40:34 +0000 |
parents | 26228dbfd782 |
children | a0ad5c5f6951 |
files | lisp/emacs-lisp/cl-indent.el |
diffstat | 1 files changed, 52 insertions(+), 25 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/emacs-lisp/cl-indent.el Wed May 29 16:38:46 2002 +0000 +++ b/lisp/emacs-lisp/cl-indent.el Wed May 29 16:40:34 2002 +0000 @@ -153,7 +153,10 @@ (path ()) ;; set non-nil when somebody works out the indentation to use calculated - (last-point indent-point) + ;; If non-nil, this is an indentation to use + ;; if nothing else specifies it more firmly. + tentative-calculated + (last-point indent-point) ;; the position of the open-paren of the innermost containing list (containing-form-start (elt state 1)) ;; the column of the above @@ -169,7 +172,7 @@ (forward-char 1) (parse-partial-sexp (point) indent-point 1 t) ;; Move to the car of the relevant containing form - (let (tem function method) + (let (tem function method tentative-defun) (if (not (looking-at "\\sw\\|\\s_")) ;; This form doesn't seem to start with a symbol (setq function nil method nil) @@ -209,13 +212,13 @@ (cond ((null function)) ((null method) (when (null (cdr path)) - ;; (package prefix was stripped off above) - (setq method (cond ((string-match "\\`def" - function) - lisp-indent-defun-method) - ((string-match "\\`\\(with\\|do\\)-" - function) - '(&lambda &body)))))) + ;; (package prefix was stripped off above) + (cond ((string-match "\\`def" + function) + (setq tentative-defun t)) + ((string-match "\\`\\(with\\|do\\)-" + function) + (setq method '(&lambda &body)))))) ;; backwards compatibility. Bletch. ((eq method 'defun) (setq method lisp-indent-defun-method))) @@ -234,7 +237,26 @@ ((eq (char-after (1- containing-sexp)) ?\#) ;; "#(...)" (setq calculated (1+ sexp-column))) - ((null method)) + ((null method) + ;; If this looks like a call to a `def...' form, + ;; think about indenting it as one, but do it + ;; tentatively for cases like + ;; (flet ((defunp () + ;; nil))) + ;; Set both normal-indent and tentative-calculated. + ;; The latter ensures this value gets used + ;; if there are no relevant containing constructs. + ;; The former ensures this value gets used + ;; if there is a relevant containing construct + ;; but we are nested within the structure levels + ;; that it specifies indentation for. + (if tentative-defun + (setq tentative-calculated + (common-lisp-indent-call-method + function lisp-indent-defun-method + path state indent-point + sexp-column normal-indent) + normal-indent tentative-calculated))) ((integerp method) ;; convenient top-level hack. ;; (also compatible with lisp-indent-function) @@ -253,25 +275,30 @@ (t ;; other body form normal-indent)))) - ((symbolp method) - (let ((lisp-indent-error-function function)) - (setq calculated (funcall method - path state indent-point - sexp-column normal-indent)))) - (t - (let ((lisp-indent-error-function function)) - (setq calculated (lisp-indent-259 - method path state indent-point - sexp-column normal-indent)))))) + (t + (setq calculated + (common-lisp-indent-call-method + function method path state indent-point + sexp-column normal-indent))))) (goto-char containing-sexp) (setq last-point containing-sexp) (unless calculated - (condition-case () - (progn (backward-up-list 1) - (setq depth (1+ depth))) - (error (setq depth lisp-indent-maximum-backtracking)))))) - calculated))) + (condition-case () + (progn (backward-up-list 1) + (setq depth (1+ depth))) + (error (setq depth lisp-indent-maximum-backtracking)))))) + (or calculated tentative-calculated)))) + +(defun common-lisp-indent-call-method (function method path state indent-point + sexp-column normal-indent) + (let ((lisp-indent-error-function function)) + (if (symbolp method) + (funcall method + path state indent-point + sexp-column normal-indent) + (lisp-indent-259 method path state indent-point + sexp-column normal-indent)))) (defun lisp-indent-report-bad-format (m) (error "%s has a badly-formed %s property: %s"