diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtFirAnalysisSession.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtFirAnalysisSession.kt index 95f31f12669..fb80dc0be39 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtFirAnalysisSession.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtFirAnalysisSession.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.LowLevelFirApiFacade import org.jetbrains.kotlin.idea.frontend.api.* import org.jetbrains.kotlin.idea.frontend.api.fir.scopes.KtFirScopeProvider import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirSymbolProvider +import org.jetbrains.kotlin.idea.frontend.api.fir.utils.* import org.jetbrains.kotlin.idea.frontend.api.scopes.KtScopeProvider import org.jetbrains.kotlin.idea.frontend.api.symbols.KtFunctionSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol @@ -60,8 +61,9 @@ private constructor( private val firScopeStorage = FirScopeRegistry() - override val scopeProvider: KtScopeProvider = + override val scopeProvider: KtScopeProvider by threadLocal { KtFirScopeProvider(token, firSymbolBuilder, project, firSession, firResolveState, firScopeStorage) + } init { assertIsValid() diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/utils/ThreadLocalDelegate.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/utils/ThreadLocalDelegate.kt new file mode 100644 index 00000000000..294b663104b --- /dev/null +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/utils/ThreadLocalDelegate.kt @@ -0,0 +1,18 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.frontend.api.fir.utils + +import kotlin.reflect.KProperty + + +@Suppress("EXPERIMENTAL_FEATURE_WARNING") +internal inline class ThreadLocalValue(private val threadLocal: ThreadLocal) { + @Suppress("NOTHING_TO_INLINE") + inline operator fun getValue(thisRef: Any?, property: KProperty<*>): V = threadLocal.get() +} + +internal inline fun threadLocal(crossinline init: () -> T): ThreadLocalValue = + ThreadLocalValue(ThreadLocal.withInitial { init() })