branch: elpa/treesit-fold
commit c6f58d41d57c17a681160f76943c47b9487a904c
Author: Jen-Chieh Shen <[email protected]>
Commit: Jen-Chieh Shen <[email protected]>

    Fix
---
 tree-sitter-fold-indicators.el | 62 ++++++++++++++++++++++++------------------
 tree-sitter-fold.el            | 10 ++++++-
 2 files changed, 44 insertions(+), 28 deletions(-)

diff --git a/tree-sitter-fold-indicators.el b/tree-sitter-fold-indicators.el
index 0533371c2b..aa7fc669d3 100644
--- a/tree-sitter-fold-indicators.el
+++ b/tree-sitter-fold-indicators.el
@@ -103,6 +103,8 @@
 
 (defvar tree-sitter-fold-foldable-node-alist)
 
+(declare-function tree-sitter-fold-overlay-at "tree-sitter-fold.el")
+
 ;;
 ;; (@* "Entry" )
 ;;
@@ -117,13 +119,16 @@
 (defun tree-sitter-fold-indicators--enable ()
   "Enable `tree-sitter-fold-indicators' mode."
   (if (tree-sitter-fold-mode 1)  ; Enable `tree-sitter-fold-mode' automatically
-      (add-hook 'tree-sitter-after-change-functions 
#'tree-sitter-fold-indicators--after-change nil t)
+      (progn
+        (add-hook 'tree-sitter-after-change-functions 
#'tree-sitter-fold-indicators-refresh nil t)
+        (add-hook 'after-save-hook #'tree-sitter-fold-indicators-refresh nil 
t))
     (tree-sitter-fold-indicators-mode -1)))
 
 (defun tree-sitter-fold-indicators--disable ()
   "Disable `tree-sitter-fold-indicators' mode."
-  (remove-hook 'tree-sitter-after-change-functions 
#'tree-sitter-fold-indicators--after-change t)
-  (tree-sitter-fold-indicators--remove-overlays (current-buffer)))
+  (remove-hook 'tree-sitter-after-change-functions 
#'tree-sitter-fold-indicators-refresh t)
+  (remove-hook 'after-save-hook #'tree-sitter-fold-indicators-refresh t)
+  (tree-sitter-fold-indicators--remove-overlays))
 
 ;;;###autoload
 (define-minor-mode tree-sitter-fold-indicators-mode
@@ -173,15 +178,17 @@
     (overlay-put ov 'creator 'tree-sitter-fold-indicators)
     ov))
 
-(defun tree-sitter-fold-indicators--create-overlays (beg end)
+(defun tree-sitter-fold-indicators--create-overlays (node beg end)
   "Return a list of indicator overlays from BEG to END."
-  (let ((ov-lst '()))
+  (let (ov-lst)
     (save-excursion
       (goto-char beg)
       (while (and (<= (line-beginning-position) end) (not (eobp)))
         (push (tree-sitter-fold-indicators--create-overlay-at-point) ov-lst)
         (forward-line 1)))
-    (tree-sitter-fold-indicators--update-overlays (reverse ov-lst) t)))
+    (tree-sitter-fold-indicators--update-overlays
+     (reverse ov-lst)
+     (not (tree-sitter-fold-overlay-at node)))))
 
 (defun tree-sitter-fold-indicators--get-priority (bitmap)
   "Get priority by BITMAP."
@@ -234,8 +241,8 @@
     (tree-sitter-fold-indicators--active-ov
      show first-ov
      (if show
-         (if (> len 1)
-             'tree-sitter-fold-indicators-fr-minus-tail 
'tree-sitter-fold-indicators-fr-minus)
+         (if (> len 1) 'tree-sitter-fold-indicators-fr-minus-tail
+           'tree-sitter-fold-indicators-fr-minus)
        'tree-sitter-fold-indicators-fr-plus))
     (when (> len 1)
       (tree-sitter-fold-indicators--active-ov show last-ov 
(tree-sitter-fold-indicators--get-end-fringe)))
@@ -252,25 +259,26 @@
   "Create indicators with NODE."
   (let ((beg (tsc-node-start-position node))
         (end (tsc-node-end-position node)))
-    (tree-sitter-fold-indicators--create-overlays beg end)))
-
-(defun tree-sitter-fold-indicators--after-change (&rest _)
-  "Register to hook `tree-sitter-after-change-functions'."
-  (tree-sitter-fold--ensure-ts
-    (let* ((node (tsc-root-node tree-sitter-tree))
-           (patterns (seq-mapcat (lambda (type) `(,(list type) @name))
-                                 (alist-get major-mode 
tree-sitter-fold-foldable-node-alist)
-                                 'vector))
-           (query (tsc-make-query tree-sitter-language patterns))
-           (nodes-to-fold (tsc-query-captures query node #'ignore)))
-      (thread-last nodes-to-fold
-        (mapcar #'cdr)
-        (mapc #'tree-sitter-fold-indicators--create)))))
-
-(defun tree-sitter-fold-indicators--remove-overlays (buffer)
-  "Remove all indicators overlays from BUFFER."
-  (with-current-buffer buffer
-    (remove-overlays (point-min) (point-max) 'creator 
'tree-sitter-fold-indicators)))
+    (tree-sitter-fold-indicators--create-overlays node beg end)))
+
+(defun tree-sitter-fold-indicators-refresh (&rest _)
+  "Refresh indicators for all folding range."
+  (when tree-sitter-fold-indicators-mode
+    (tree-sitter-fold--ensure-ts
+      (let* ((node (tsc-root-node tree-sitter-tree))
+             (patterns (seq-mapcat (lambda (type) `(,(list type) @name))
+                                   (alist-get major-mode 
tree-sitter-fold-foldable-node-alist)
+                                   'vector))
+             (query (tsc-make-query tree-sitter-language patterns))
+             (nodes-to-fold (tsc-query-captures query node #'ignore)))
+        (tree-sitter-fold-indicators--remove-overlays)
+        (thread-last nodes-to-fold
+          (mapcar #'cdr)
+          (mapc #'tree-sitter-fold-indicators--create))))))
+
+(defun tree-sitter-fold-indicators--remove-overlays ()
+  "Remove all indicators overlays."
+  (remove-overlays (point-min) (point-max) 'creator 
'tree-sitter-fold-indicators))
 
 (provide 'tree-sitter-fold-indicators)
 ;;; tree-sitter-fold-indicators.el ends here
diff --git a/tree-sitter-fold.el b/tree-sitter-fold.el
index 6bab5ab154..47c0c2896b 100644
--- a/tree-sitter-fold.el
+++ b/tree-sitter-fold.el
@@ -108,6 +108,12 @@ the fold in a cons cell.  See 
`tree-sitter-fold-range-python' for an example."
   "Face used to display fringe contents."
   :group 'tree-sitter-fold)
 
+;;
+;; (@* "Externals" )
+;;
+
+(declare-function tree-sitter-fold-indicators-refresh 
"tree-sitter-fold-indicators.el")
+
 ;;
 ;; (@* "Entry" )
 ;;
@@ -179,6 +185,7 @@ This function is borrowed from `tree-sitter-node-at-point'."
   "Create invisible overlay in RANGE."
   (when (not (null range))
     (let* ((beg (car range)) (end (cdr range)) (ov (make-overlay beg end)))
+      (overlay-put ov 'creator 'tree-sitter-fold)
       (overlay-put ov 'invisible 'tree-sitter-fold)
       (overlay-put ov 'display (or (and tree-sitter-fold-summary-show
                                         (tree-sitter-fold-summary--get 
(buffer-substring beg end)))
@@ -226,7 +233,8 @@ current `major-mode'.  If no foldable NODE is found in 
point, do nothing."
       ;; make sure I do not create multiple overlays for the same fold
       (when-let* ((ov (tree-sitter-fold-overlay-at node)))
         (delete-overlay ov))
-      (tree-sitter-fold--create-overlay (tree-sitter-fold--get-fold-range 
node)))))
+      (tree-sitter-fold--create-overlay (tree-sitter-fold--get-fold-range 
node)))
+    (tree-sitter-fold-indicators-refresh)))
 
 ;;;###autoload
 (defun tree-sitter-fold-open ()

Reply via email to