From aebdef8257173b31df77ae02bb23ec2abfd07e5c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bla=C5=BE=20Hrastnik?= <blaz@mxxn.io>
Date: Thu, 10 Jun 2021 12:49:34 +0900
Subject: [PATCH] Reuse a cursor from the pool if available (fixes #202)

---
 helix-core/src/syntax.rs | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/helix-core/src/syntax.rs b/helix-core/src/syntax.rs
index 24b4e1a3..b0f82ca1 100644
--- a/helix-core/src/syntax.rs
+++ b/helix-core/src/syntax.rs
@@ -366,7 +366,11 @@ impl Syntax {
         // prevents them from being moved. But both of these values are really just
         // pointers, so it's actually ok to move them.
 
-        let mut cursor = QueryCursor::new(); // reuse a pool
+        // reuse a cursor from the pool if possible
+        let mut cursor = PARSER.with(|ts_parser| {
+            let highlighter = &mut ts_parser.borrow_mut();
+            highlighter.cursors.pop().unwrap_or_else(QueryCursor::new)
+        });
         let tree_ref = unsafe { mem::transmute::<_, &'static Tree>(self.tree()) };
         let cursor_ref = unsafe { mem::transmute::<_, &'static mut QueryCursor>(&mut cursor) };
         let query_ref = unsafe { mem::transmute::<_, &'static Query>(&self.config.query) };