;;; my-hiedb.el -- Extensions for hiedb -*- lexical-binding: t -*- ;; Copyright (C) 2023 Free Software Foundation. ;; Author: Yuchen Pei ;; Package-Requires: ((emacs "28.2")) ;; This file is part of dotfiles. ;; dotfiles is free software: you can redistribute it and/or modify it under ;; the terms of the GNU Affero General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; dotfiles is distributed in the hope that it will be useful, but WITHOUT ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General ;; Public License for more details. ;; You should have received a copy of the GNU Affero General Public ;; License along with dotfiles. If not, see . ;;; Commentary: ;; Extensions for hiedb. ;;; Code: ;;; to use, do for example: ;; (add-hook 'haskell-mode-hook ;; (lambda () ;; (add-hook 'xref-backend-functions ;; #'hiedb--xref-backend nil t))) (defun hiedb--xref-backend () 'hiedb) (cl-defmethod xref-backend-definitions ((_backend (eql hiedb)) _identifiers) (my-hiedb-call-point-defs buffer-file-name (1+ (current-line)) (1+ (current-column))) (my-hiedb-parse-point-defs-output (file-name-directory buffer-file-name) (with-current-buffer "*hiedb*" (goto-char (point-min)) (kill-line) (kill-line) (buffer-string)) )) (defun my-hiedb-call-point-defs (file line col) (let ((dir (file-name-directory file)) (module-name (file-name-base file))) (with-current-buffer (get-buffer-create "*hiedb*") (erase-buffer)) (call-process "hiedb" nil "*hiedb*" nil "-D" (format "%sdefault.hiedb" dir) "point-defs" module-name (number-to-string line) (number-to-string col)))) (defun my-hiedb-parse-point-defs-output (dir output) "module-name:line-begin:col-begin-line-end:col-end" (pcase-let ((`(,module-name ,line-beg ,col-beg, line-end, col-end) (split-string output "[:-]" (print output)))) (list (xref-make-match "" (xref-make-file-location (format "%s%s.hs" dir module-name) (string-to-number line-beg) (string-to-number col-beg)) (- (string-to-number col-end) (string-to-number col-beg)))))) (provide 'my-hiedb) ;;; my-hiedb.el ends here