diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/pointers/KtPsiBasedSymbolPointer.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/pointers/KtPsiBasedSymbolPointer.kt index dde9b3803b7..8238eecd358 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/pointers/KtPsiBasedSymbolPointer.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/pointers/KtPsiBasedSymbolPointer.kt @@ -36,7 +36,9 @@ public class KtPsiBasedSymbolPointer private constructor(private v public companion object { public fun createForSymbolFromSource(symbol: S): KtPsiBasedSymbolPointer? { - if (disablePsiPointer || symbol.origin != KtSymbolOrigin.SOURCE) return null + ifDisabled { return null } + + if (symbol.origin != KtSymbolOrigin.SOURCE) return null val psi = when (val psi = symbol.psi) { is KtDeclaration -> psi @@ -49,20 +51,29 @@ public class KtPsiBasedSymbolPointer private constructor(private v } public fun createForSymbolFromPsi(ktElement: KtElement): KtPsiBasedSymbolPointer? { - if (disablePsiPointer) return null + ifDisabled { return null } return KtPsiBasedSymbolPointer(ktElement.createSmartPointer()) } @TestOnly - @Synchronized public fun withDisabledPsiBasedPointers(disable: Boolean, action: () -> T): T = try { - disablePsiPointer = disable + disablePsiPointer = true + disablePsiPointerFlag.set(disable) action() } finally { - disablePsiPointer = false + disablePsiPointerFlag.remove() } + private inline fun ifDisabled(action: () -> Unit) { + if (!disablePsiPointer) return + if (disablePsiPointerFlag.get()) { + action() + } + } + + private val disablePsiPointerFlag: ThreadLocal = ThreadLocal.withInitial { false } + @Volatile private var disablePsiPointer: Boolean = false }