From 670daa8b6264f9cd813efb0d40ceec253fdd603e Mon Sep 17 00:00:00 2001 From: Yuan Fu Date: Wed, 7 Dec 2022 16:36:07 -0800 Subject: [PATCH] Add recursion limit to treesit--children-covering-range-recurse * lisp/treesit.el (treesit--children-covering-range-recurse): Add limit. --- lisp/treesit.el | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) 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))) -- 2.39.2