diff --git a/compiler/psi/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt b/compiler/psi/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt index 0a729ed1a9b..9078d1a6a8a 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt +++ b/compiler/psi/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt @@ -121,11 +121,18 @@ private class CachingSequence(from: Sequence) : Sequence { private var cacheCursor = 0 - override fun hasNext(): Boolean = lock.read { cacheCursor < cache.size || sequenceIterator.hasNext() } + override fun hasNext(): Boolean = + lock.read { cacheCursor < cache.size } || lock.write { cacheCursor < cache.size || sequenceIterator.hasNext() } - override fun next(): T = lock.write { - if (cacheCursor < cache.size) cache[cacheCursor++] - else sequenceIterator.next().also { cache.add(it) } + override fun next(): T { + lock.read { + if (cacheCursor < cache.size) return cache[cacheCursor++] + } + // lock.write is not an upgrade but retake, therefore - one more check needed + lock.write { + return if (cacheCursor < cache.size) cache[cacheCursor++] + else sequenceIterator.next().also { cache.add(it) } + } } }