Skip to content

Commit

Permalink
Merge pull request #82 from justinbarclay/fix-recursion
Browse files Browse the repository at this point in the history
Fix bug where parifner-rust-mode can recur into itself when in a deferral state
Fix bug where parinfer-rust was trying to enable itself in the minibuffer when it was in a deferred state
  • Loading branch information
justinbarclay authored Apr 15, 2024
2 parents 39f588e + bca579b commit 75ab470
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 45 deletions.
31 changes: 17 additions & 14 deletions parinfer-rust-helper.el
Original file line number Diff line number Diff line change
Expand Up @@ -68,17 +68,18 @@ download LIB-NAME for the user. Automatically downloads if
AUTO-DOWNLOAD is supplied or parinfer-rust runs in test mode,
otherwise will promt user. Return non-nil if the parinfer-rust
library was downloaded."
(when (and (not (file-exists-p library-location))
(or
auto-download
(parinfer-rust--test-p)
(yes-or-no-p parinfer-rust--ask-to-download)))
(parinfer-rust--download-from-github (car supported-versions)
;; This is a hold over because I am lazy. I've stuctured
;; this data such that my version is the first one in the
;; list
library-location lib-name)
t))
(if (file-exists-p library-location)
t
(when (or
auto-download
(parinfer-rust--test-p)
(yes-or-no-p parinfer-rust--ask-to-download))
(parinfer-rust--download-from-github (car supported-versions)
;; This is a hold over because I am lazy. I've stuctured
;; this data such that my version is the first one in the
;; list
library-location lib-name)
t)))
;; This function has a problem: Emacs can't reload dynamic libraries. This means that if we download
;; a new library the user has to restart Emacs.
(defun parinfer-rust--check-version (supported-versions current-version library-location lib-name)
Expand Down Expand Up @@ -237,10 +238,12 @@ mode to better emulate users."
(t num))))
(defun parinfer-rust--defer-loading (&rest _)
"Defer loading of `parinfer-rust-mode' until the buffer is in focus."
(when (eq (current-buffer)
(window-buffer (selected-window)))
;; This is a parinfer enabled buffer that started in the background and has now been moved to the foreground
(when (and parinfer-rust-enabled
(eq (current-buffer)
(window-buffer (selected-window))))
(remove-hook 'window-selection-change-functions #'parinfer-rust--defer-loading t)
(parinfer-rust-mode)))
(parinfer-rust-mode-enable)))
;; Disable fill column warning only for this buffer to enable long strings of text without
;; having to do a weird mapconcat.
;; Local Variables:
Expand Down
68 changes: 40 additions & 28 deletions parinfer-rust-mode.el
Original file line number Diff line number Diff line change
Expand Up @@ -503,7 +503,7 @@ Checks if MODE is a valid Parinfer mode, and uses
(parinfer-rust--set-default-state)
(parinfer-rust--dim-parens))

(defun parinfer-rust-mode-enable ()
(defun parinfer-rust-mode-setup ()
"Enable Parinfer."
(setq-local parinfer-rust-enabled t)
(parinfer-rust--detect-troublesome-modes)
Expand Down Expand Up @@ -535,6 +535,39 @@ This includes stopping tracking of all changes."
(setq-local parinfer-rust--disable nil)
(setq-local parinfer-rust--disable t)))

(defun parinfer-rust-mode-enable ()
"Enable Parinfer."
;; Make sure the library is installed at the appropriate location or offer to download it
(if (parinfer-rust--check-for-library parinfer-rust-supported-versions
parinfer-rust-library
parinfer-rust--lib-name
parinfer-rust-auto-download)
(progn
(require 'parinfer-rust parinfer-rust-library t)
;; Check version and prompt to download latest version if out of date Problem: Emacs can't
;; reload dynamic libraries, which means that if we download a new library the user has to
;; restart Emacs for changes to take effect.
(parinfer-rust--check-version parinfer-rust-supported-versions
(parinfer-rust-version)
parinfer-rust-library
parinfer-rust--lib-name)
(parinfer-rust-mode-setup)
(cond ((or (eq 'defer parinfer-rust-check-before-enable)
buffer-read-only)
;; Defer checking for changes until a user changes the buffer
(setq-local parinfer-rust--disable t)
(add-hook 'before-change-functions #'parinfer-rust--check-for-issues t t))

((eq 'immediate parinfer-rust-check-before-enable)
(setq-local parinfer-rust--disable t)
(parinfer-rust--check-for-issues))

(t (let ((parinfer-rust--mode "paren"))
(parinfer-rust--execute)))))
(progn
(message "Unable to load library parinfer-rust disabling parinfer-rust-mode")
(parinfer-rust-mode-disable))))

;;;###autoload
(defun parinfer-rust-switch-mode ()
"Switch to a different Parinfer mode.
Expand Down Expand Up @@ -572,37 +605,16 @@ not available."
(cond
(parinfer-rust-enabled
(parinfer-rust-mode-disable))
;; Don't do anything if the buffer is not selected
;; TODO: Come up with a better way to defer and disable loading
;; Defer waits for window selection change and disabled waits for a change event
;; there is also the idea of deferring the running of parinfer vs deferring the loading
((not (eq (current-buffer)
(window-buffer (selected-window))))
(setq-local parinfer-rust-enabled t)
(add-hook 'window-selection-change-functions #'parinfer-rust--defer-loading nil t))
(t
(progn
;; Make sure the library is installed at the appropriate location or offer to download it
(when (parinfer-rust--check-for-library parinfer-rust-supported-versions
parinfer-rust-library
parinfer-rust--lib-name
parinfer-rust-auto-download)
(require 'parinfer-rust parinfer-rust-library t))
;; Check version and prompt to download latest version if out of date Problem: Emacs can't
;; reload dynamic libraries, which means that if we download a new library the user has to
;; restart Emacs for changes to take effect.
(parinfer-rust--check-version parinfer-rust-supported-versions
(parinfer-rust-version)
parinfer-rust-library
parinfer-rust--lib-name)
(parinfer-rust-mode-enable)
(cond ((or (eq 'defer parinfer-rust-check-before-enable)
buffer-read-only)
;; Defer checking for changes until a user changes the buffer
(setq-local parinfer-rust--disable t)
(add-hook 'before-change-functions #'parinfer-rust--check-for-issues t t))

((eq 'immediate parinfer-rust-check-before-enable)
(setq-local parinfer-rust--disable t)
(parinfer-rust--check-for-issues))

(t (let ((parinfer-rust--mode "paren"))
(parinfer-rust--execute))))))))
(parinfer-rust-mode-enable))))

(provide 'parinfer-rust-mode)
;;; parinfer-rust-mode.el ends here
3 changes: 1 addition & 2 deletions test/test-helper.el
Original file line number Diff line number Diff line change
Expand Up @@ -143,10 +143,9 @@ it makes no sense to convert it to a string using
parinfer-rust-library
parinfer-rust--lib-name)
(indent-tabs-mode 0)
(parinfer-rust-mode-enable)
;; Disable checks for deferral and do not run --execute on initialization
;; this breaks a lot of test because they expect the buffer to be in a specific state
)))
(parinfer-rust-mode-setup))))

(defun simulate-parinfer-in-another-buffer--without-changes (test-string mode)
"Run parinfer on buffer using text and cursor position
Expand Down
2 changes: 1 addition & 1 deletion test/user-submitted-cases.el
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
;;; indent-parinfer-tests.el --- Auto generates tests based on a json file -*- lexical-binding: nil; -*-
;;; user-submitted-cases.el --- User submitted test cases -*- lexical-binding: nil; -*-
;; Copyright (C) 2019 Justin Barclay

;; Author: Justin Barclay <justinbarclay@gmail.com>
Expand Down

0 comments on commit 75ab470

Please sign in to comment.