Skip to content

Commit 36d91bf

Browse files
Add a lock around parse, to prevent concurrent access to the underlying parse tree. (simonbs#367)
* Add a lock around parse, as we can have both the OperationQueue-based parse and this parse happen at the same time * Fixes SwiftLint violation --------- Co-authored-by: Simon Støvring <mail@simonbs.dk>
1 parent 9a48654 commit 36d91bf

1 file changed

Lines changed: 4 additions & 1 deletion

File tree

Sources/Runestone/TextView/SyntaxHighlighting/Internal/TreeSitter/TreeSitterInternalLanguageMode.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ final class TreeSitterInternalLanguageMode: InternalLanguageMode {
1616
private let lineManager: LineManager
1717
private let rootLanguageLayer: TreeSitterLanguageLayer
1818
private let operationQueue = OperationQueue()
19+
private let parseLock = NSLock()
1920

2021
init(language: TreeSitterInternalLanguage, languageProvider: TreeSitterLanguageProvider?, stringView: StringView, lineManager: LineManager) {
2122
self.stringView = stringView
@@ -37,7 +38,9 @@ final class TreeSitterInternalLanguageMode: InternalLanguageMode {
3738
}
3839

3940
func parse(_ text: NSString) {
40-
rootLanguageLayer.parse(text)
41+
parseLock.withLock {
42+
rootLanguageLayer.parse(text)
43+
}
4144
}
4245

4346
func parse(_ text: NSString, completion: @escaping ((Bool) -> Void)) {

0 commit comments

Comments
 (0)