]> git.eshelyaron.com Git - emacs.git/commitdiff
Add recursion limit to treesit--children-covering-range-recurse
authorYuan Fu <casouri@gmail.com>
Thu, 8 Dec 2022 00:36:07 +0000 (16:36 -0800)
committerYuan Fu <casouri@gmail.com>
Thu, 8 Dec 2022 00:36:07 +0000 (16:36 -0800)
* lisp/treesit.el (treesit--children-covering-range-recurse): Add
limit.

lisp/treesit.el

index 5e87737659e8bc4a6a04d956da168a1f8526c4b4..85154d0d1c7ece254cfb2912c29a8e1599118ace 100644 (file)
@@ -833,21 +833,28 @@ The range is between START and END."
         (nreverse result))
     (list node)))
 
-(defun treesit--children-covering-range-recurse (node start end threshold)
+(defun treesit--children-covering-range-recurse
+    (node start end threshold &optional limit)
   "Return a list of children of NODE covering a range.
+
 Recursively go down the parse tree and collect children, until
 all nodes in the returned list are smaller than THRESHOLD.  The
-range is between START and END."
+range is between START and END.
+
+LIMIT is the recursion limit, which defaults to 100."
   (let* ((child (treesit-node-first-child-for-pos node start))
+         (limit (or limit 100))
          result)
-    (while (and child (<= (treesit-node-start child) end))
+    ;; If LIMIT is exceeded, we are probably seeing the erroneously
+    ;; tall tree, in that case, just give up.
+    (while (and (> limit 0) child (<= (treesit-node-start child) end))
       ;; If child still too large, recurse down.  Otherwise collect
       ;; child.
       (if (> (- (treesit-node-end child)
                 (treesit-node-start child))
              threshold)
           (dolist (r (treesit--children-covering-range-recurse
-                      child start end threshold))
+                      child start end threshold (1- limit)))
             (push r result))
         (push child result))
       (setq child (treesit-node-next-sibling child)))