From 3ecf4d7259e161ffc6341fd187d620dd5b348181 Mon Sep 17 00:00:00 2001 From: Akash Yadav Date: Sun, 15 Oct 2023 23:54:53 +0530 Subject: [PATCH] fix: TsBracketPairs uses recycled TSNode instances --- .idea/deploymentTargetDropDown.xml | 17 ------------- .../rosemoe/sora/editor/ts/TsBracketPairs.kt | 25 ++++++++++++------- 2 files changed, 16 insertions(+), 26 deletions(-) delete mode 100644 .idea/deploymentTargetDropDown.xml diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml deleted file mode 100644 index 1edcacd3f..000000000 --- a/.idea/deploymentTargetDropDown.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/editor-treesitter/src/main/java/io/github/rosemoe/sora/editor/ts/TsBracketPairs.kt b/editor-treesitter/src/main/java/io/github/rosemoe/sora/editor/ts/TsBracketPairs.kt index fe80097d8..3472f0a0b 100644 --- a/editor-treesitter/src/main/java/io/github/rosemoe/sora/editor/ts/TsBracketPairs.kt +++ b/editor-treesitter/src/main/java/io/github/rosemoe/sora/editor/ts/TsBracketPairs.kt @@ -24,7 +24,6 @@ package io.github.rosemoe.sora.editor.ts -import com.itsaky.androidide.treesitter.TSNode import com.itsaky.androidide.treesitter.TSQueryCursor import com.itsaky.androidide.treesitter.TSTree import com.itsaky.androidide.treesitter.api.TreeSitterQueryCapture @@ -73,8 +72,9 @@ class TsBracketPairs(private val tree: TSTree, private val languageSpec: TsLangu return@safeExecQueryCursor null } - var startNode: TSNode? = null - var endNode: TSNode? = null + // do not store TSNode instances from the capture + // this is because the nodes are also recycled with the TSQueryCapture instances + val positions = IntArray(4) { -1 } for (capture in match.captures) { val captureName = languageSpec.bracketsQuery.getCaptureNameForId(capture.index) @@ -84,19 +84,26 @@ class TsBracketPairs(private val tree: TSTree, private val languageSpec: TsLangu matched = true } if (captureName == OPEN_NAME) { - startNode = node + positions[0] = node.startByte + positions[1] = node.endByte } else { - endNode = node + positions[2] = node.startByte + positions[3] = node.endByte } } (capture as? TreeSitterQueryCapture?)?.recycle() } - if (matched && startNode != null && endNode != null) { - return@safeExecQueryCursor PairedBracket(startNode.startByte / 2, - (startNode.endByte - startNode.startByte) / 2, endNode.startByte / 2, - (endNode.endByte - endNode.startByte) / 2) + val startStartByte = positions[0] + val startEndByte = positions[1] + val endStartByte = positions[2] + val endEndByte = positions[3] + + if (matched && positions.find { it == -1 } == null) { + return@safeExecQueryCursor PairedBracket(startStartByte / 2, + (startEndByte - startStartByte) / 2, endStartByte / 2, + (endEndByte - endStartByte) / 2) } return@safeExecQueryCursor null