From: Yuan Fu Date: Thu, 8 Dec 2022 00:36:07 +0000 (-0800) Subject: Add recursion limit to treesit--children-covering-range-recurse X-Git-Tag: emacs-29.0.90~1314 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=670daa8b6264f9cd813efb0d40ceec253fdd603e;p=emacs.git Add recursion limit to treesit--children-covering-range-recurse * lisp/treesit.el (treesit--children-covering-range-recurse): Add limit. --- diff --git a/lisp/treesit.el b/lisp/treesit.el index 5e87737659e..85154d0d1c7 100644 --- a/lisp/treesit.el +++ b/lisp/treesit.el @@ -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)))