From 683ec2beffaee4a8c632ad35da0e1524c863ecc7 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 7 Aug 2020 15:30:24 +0300 Subject: [PATCH] FIR IDE: make KtScopeProvider thread local --- .../frontend/api/fir/KtFirAnalysisSession.kt | 4 +++- .../api/fir/utils/ThreadLocalDelegate.kt | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/utils/ThreadLocalDelegate.kt 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() })