From ea75b9592bd472a08cbdc20f196b076fbec55b1c Mon Sep 17 00:00:00 2001 From: Akash Yadav Date: Fri, 31 Mar 2023 19:02:17 +0530 Subject: [PATCH] fix(projects): synchronize edits to ActiveDocument --- .../projects/models/ActiveDocument.kt | 33 ++++++++++++++----- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/models/ActiveDocument.kt b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/models/ActiveDocument.kt index 34aaa759a..d3f806221 100644 --- a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/models/ActiveDocument.kt +++ b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/models/ActiveDocument.kt @@ -25,6 +25,7 @@ import java.io.BufferedReader import java.io.Closeable import java.nio.file.Path import java.time.Instant +import java.util.concurrent.Semaphore /** * A document that is opened in the editor. @@ -39,23 +40,37 @@ open class ActiveDocument( ) : Closeable { private val _content = StringBuilder(content) + private val semaphore = Semaphore(1) private val log = ILogger.newInstance("ActiveDocument") val content: String get() = _content.toString() fun patch(event: DocumentChangeEvent) { - val text = event.changedText - val start = event.changeRange.start.requireIndex() - val end = event.changeRange.end.requireIndex() + try { + semaphore.acquire() + } catch (e: Exception) { + log.error("Failed to acquire", e) + throw RuntimeException(e) + } - when (event.changeType) { - ChangeType.DELETE -> _content.delete(start, end) - ChangeType.INSERT -> _content.insert(start, text) - else -> { - _content.clear() - _content.append(text) + try { + val text = event.changedText + val start = event.changeRange.start.requireIndex() + val end = event.changeRange.end.requireIndex() + + when (event.changeType) { + ChangeType.DELETE -> _content.delete(start, end) + ChangeType.INSERT -> _content.insert(start, text) + else -> { + _content.clear() + _content.append(text) + } } + } catch (err: Throwable) { + throw RuntimeException(err) + } finally { + semaphore.release() } }