branch: elpa/slime
commit 1e4b7417a1ade842ba4938f66445af68a93176b9
Author: Stas Boukarev <[email protected]>
Commit: Stas Boukarev <[email protected]>
slime-definition-at-point: consider non-top level definitions.
---
contrib/slime-autodoc.el | 2 +-
contrib/slime-parse.el | 40 ++++++++++++++++++++++++++++++----------
contrib/slime-repl.el | 3 ++-
3 files changed, 33 insertions(+), 12 deletions(-)
diff --git a/contrib/slime-autodoc.el b/contrib/slime-autodoc.el
index 3463b47f1f..2d727993f8 100644
--- a/contrib/slime-autodoc.el
+++ b/contrib/slime-autodoc.el
@@ -151,7 +151,7 @@ If it's not in the cache, the cache will be updated
asynchronously."
(defun slime-autodoc--async (context multilinep)
(slime-eval-async
- `(swank:autodoc ',context ;; FIXME: misuse of quote
+ `(swank:autodoc ',context
:print-right-margin ,(window-width (minibuffer-window)))
(slime-curry #'slime-autodoc--async% context multilinep)))
diff --git a/contrib/slime-parse.el b/contrib/slime-parse.el
index 98b03e034b..89ebc5b619 100644
--- a/contrib/slime-parse.el
+++ b/contrib/slime-parse.el
@@ -255,13 +255,30 @@ Point is placed before the first expression in the list."
(forward-list 1)
(down-list -1))
-(defun slime-parse-toplevel-form ()
+(defun slime-parse-toplevel-form (&optional match)
(ignore-errors ; (foo)
- (save-excursion
- (goto-char (car (slime-region-for-defun-at-point)))
- (down-list 1)
- (forward-sexp 1)
- (slime-parse-context (read (current-buffer))))))
+ (let ((start (car (slime-region-for-defun-at-point))))
+ (or (save-excursion
+ (goto-char start)
+ (down-list 1)
+ (forward-sexp 1)
+ (let ((context (slime-parse-context (read (current-buffer)))))
+ (when (or (not match)
+ (member (car context) match))
+ context)))
+ (when match
+ (save-excursion
+ (cl-loop while (> (point) start)
+ thereis
+ (progn
+ (backward-up-list)
+ (ignore-errors
+ (save-excursion
+ (down-list 1)
+ (forward-sexp 1)
+ (let ((context (slime-parse-context (read
(current-buffer)))))
+ (when (member (car context) match)
+ context))))))))))))
(defun slime-arglist-specializers (arglist)
(cond ((or (null arglist)
@@ -276,12 +293,15 @@ Point is placed before the first expression in the list."
(defun slime-definition-at-point (&optional only-functional)
"Return object corresponding to the definition at point."
- (let ((toplevel (slime-parse-toplevel-form)))
+ (let* ((functional '(:defun :defgeneric :defmethod :defmacro
:define-compiler-macro))
+ (all '(:defun :defgeneric :defmacro :define-modify-macro
:define-compiler-macro
+ :defmethod :defparameter :defvar :defconstant :defclass
:defstruct :defpackage))
+ (toplevel (slime-parse-toplevel-form (if only-functional
+ functional
+ all))))
(if (or (symbolp toplevel)
(and only-functional
- (not (member (car toplevel)
- '(:defun :defgeneric :defmethod
- :defmacro :define-compiler-macro)))))
+ (not (member (car toplevel) functional))))
(error "Not in a definition")
(slime-dcase toplevel
(((:defun :defgeneric) symbol)
diff --git a/contrib/slime-repl.el b/contrib/slime-repl.el
index a765195b7d..3d647739c4 100644
--- a/contrib/slime-repl.el
+++ b/contrib/slime-repl.el
@@ -1569,7 +1569,8 @@ expansion will be added to the REPL's history.)"
(save-excursion (insert ")"))))
(unless function
(goto-char slime-repl-input-start-mark)))))
- (let ((toplevel (slime-parse-toplevel-form)))
+ (let ((toplevel (slime-parse-toplevel-form '(:defun :defgeneric :defmacro
:define-compiler-macro
+ :defmethod :defparameter
:defvar :defconstant :defclass))))
(if (symbolp toplevel)
(error "Not in a function definition")
(slime-dcase toplevel