summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJose Antonio Ortega Ruiz <jao@Mac.home>2025-09-22 23:02:36 +0100
committerJose Antonio Ortega Ruiz <jao@Mac.home>2025-09-22 23:02:36 +0100
commit0a88bd27308e3ca3a62b6c933cdb97a4884237ea (patch)
treec1c423700788aec0ade82286c857254e0a2a134b
parentc8b862f00e208f2c09bf2a2b2436af0a466a2531 (diff)
downloadgeiser-0a88bd27308e3ca3a62b6c933cdb97a4884237ea.tar.gz
geiser-0a88bd27308e3ca3a62b6c933cdb97a4884237ea.tar.bz2
fix: returning proper locations for company
Should address issue #76. Thanks, Daniel.
-rw-r--r--elisp/geiser-capf.el14
-rw-r--r--elisp/geiser-edit.el48
2 files changed, 39 insertions, 23 deletions
diff --git a/elisp/geiser-capf.el b/elisp/geiser-capf.el
index a3c47a3..cf0b3dc 100644
--- a/elisp/geiser-capf.el
+++ b/elisp/geiser-capf.el
@@ -1,6 +1,6 @@
;;; geiser-capf.el --- Setup for Geiser's CAPFs -*- lexical-binding: t; -*-
-;; Copyright (c) 2022 Jose Antonio Ortega Ruiz
+;; Copyright (c) 2022, 2025 Jose Antonio Ortega Ruiz
;; This program is free software; you can redistribute it and/or
;; modify it under the terms of the Modified BSD License. You should
@@ -18,6 +18,7 @@
(require 'geiser-doc)
(require 'geiser-completion)
(require 'geiser-edit)
+(require 'geiser-syntax)
(defun geiser-capf--company-docsig (id)
(condition-case err
@@ -40,10 +41,13 @@
(defun geiser-capf--company-location (id)
(condition-case _err
(when (and geiser-impl--implementation (not (geiser-autodoc--inhibit)))
- (let ((id (make-symbol id)))
- (condition-case nil
- (geiser-edit-module id 'noselect)
- (error (geiser-edit-symbol id 'noselect)))))
+ (let ((id (if (stringp id) (geiser-syntax--form-from-string id) id)))
+ (if-let* ((mloc (geiser-edit-module-location id))
+ (f (geiser-edit--location-file mloc)))
+ (cons f 1)
+ (if-let* ((sloc (geiser-edit-symbol-location id))
+ (f (geiser-edit--location-file sloc)))
+ (cons f (or (geiser-edit--location-line sloc) 1))))))
(error (message "Location not found for %s" id))))
(defun geiser-capf--thing-at-point (module &optional _predicate)
diff --git a/elisp/geiser-edit.el b/elisp/geiser-edit.el
index 0d47cbe..0c6be2f 100644
--- a/elisp/geiser-edit.el
+++ b/elisp/geiser-edit.el
@@ -1,6 +1,6 @@
;;; geiser-edit.el --- Scheme edit locations -*- lexical-binding: t; -*-
-;; Copyright (C) 2009, 2010, 2012, 2013, 2019-2024 Jose Antonio Ortega Ruiz
+;; Copyright (C) 2009, 2010, 2012, 2013, 2019-2025 Jose Antonio Ortega Ruiz
;; This program is free software; you can redistribute it and/or
;; modify it under the terms of the Modified BSD License. You should
@@ -155,11 +155,10 @@ or following links in error buffers.")
(unless no-error
(error "Couldn't find location for '%s'" symbol)))))
-(defsubst geiser-edit--try-edit (symbol ret &optional method no-error)
- (let ((res (geiser-eval--retort-result ret)))
- (if (listp res)
- (geiser-edit--try-edit-location symbol res method no-error)
- (unless no-error (error "Couldn't find location for '%s'" symbol)))))
+(defsubst geiser-edit--try-edit (symbol res &optional method no-error)
+ (if (listp res)
+ (geiser-edit--try-edit-location symbol res method no-error)
+ (unless no-error (error "Couldn't find location for '%s'" symbol))))
;;; Links
@@ -257,26 +256,30 @@ or following links in error buffers.")
(defvar geiser-edit--symbol-history nil)
+(defun geiser-edit-symbol-location (&optional symbol)
+ (let* ((symbol (or symbol
+ (geiser--symbol-at-point)
+ (error "No symbol at point")))
+ (cmd `(:eval (:ge symbol-location ',symbol))))
+ (geiser-eval--retort-result (geiser-eval--send/wait cmd))))
+
(defun geiser-edit-symbol (symbol &optional method marker)
"Asks for a symbol to edit, with completion."
(interactive
(list (geiser-completion--read-symbol "Edit symbol: "
nil
geiser-edit--symbol-history)))
- (let ((cmd `(:eval (:ge symbol-location ',symbol))))
- (geiser-edit--try-edit symbol (geiser-eval--send/wait cmd) method)
- (when marker (xref-push-marker-stack))))
+ (geiser-edit--try-edit symbol (geiser-edit-symbol-location symbol) method)
+ (when marker (xref-push-marker-stack)))
(defun geiser-edit-symbol-at-point (&optional arg)
"Visit the definition of the symbol at point.
With prefix, asks for the symbol to locate."
(interactive "P")
- (let* ((symbol (or (and (not arg) (geiser--symbol-at-point))
- (geiser-completion--read-symbol "Edit symbol: ")))
- (cmd `(:eval (:ge symbol-location ',symbol)))
- (marker (point-marker))
- (ret (ignore-errors (geiser-eval--send/wait cmd))))
- (if (geiser-edit--try-edit symbol ret nil t)
+ (let ((symbol (or (and (not arg) (geiser--symbol-at-point))
+ (geiser-completion--read-symbol "Edit symbol: ")))
+ (marker (point-marker)))
+ (if (geiser-edit--try-edit symbol (geiser-edit-symbol-location symbol) nil t)
(when marker (xref-push-marker-stack marker))
(unless (geiser-edit-module-at-point t)
(error "Couldn't find location for '%s'" symbol)))
@@ -290,11 +293,20 @@ With prefix, asks for the symbol to locate."
(with-no-warnings
(xref-pop-marker-stack))))
-(defun geiser-edit-module (module &optional method no-error)
+(defun geiser-edit-module-location (&optional module)
+ (let* ((module (or module
+ (geiser-completion--module-at-point)
+ (error "No module at point")))
+ (cmd `(:eval (:ge module-location '(:module ,module)))))
+ (geiser-eval--retort-result (geiser-eval--send/wait cmd))))
+
+(defun geiser-edit-module (&optional module method no-error)
"Asks for a module and opens it in a new buffer."
(interactive (list (geiser-completion--read-module)))
- (let ((cmd `(:eval (:ge module-location '(:module ,module)))))
- (geiser-edit--try-edit module (geiser-eval--send/wait cmd) method no-error)))
+ (geiser-edit--try-edit module
+ (geiser-edit-module-location module)
+ method
+ no-error))
(defun geiser-edit-module-at-point (&optional no-error)
"Opens a new window visiting the module at point."