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

Reply via email to