FIR IDE: introduce analyze function for with by existing module resolve state
This commit is contained in:
+1
-1
@@ -33,7 +33,6 @@ internal class FirIdeResolveStateService(project: Project) {
|
|||||||
ConcurrentHashMap<IdeaModuleInfo, FirModuleResolveStateImpl>()
|
ConcurrentHashMap<IdeaModuleInfo, FirModuleResolveStateImpl>()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fun getResolveState(moduleInfo: IdeaModuleInfo): FirModuleResolveStateImpl =
|
fun getResolveState(moduleInfo: IdeaModuleInfo): FirModuleResolveStateImpl =
|
||||||
stateCache.computeIfAbsent(moduleInfo) { createResolveStateFor(moduleInfo, sessionProviderStorage) }
|
stateCache.computeIfAbsent(moduleInfo) { createResolveStateFor(moduleInfo, sessionProviderStorage) }
|
||||||
|
|
||||||
@@ -48,6 +47,7 @@ internal class FirIdeResolveStateService(project: Project) {
|
|||||||
val sessionProvider = sessionProviderStorage.getSessionProvider(moduleInfo)
|
val sessionProvider = sessionProviderStorage.getSessionProvider(moduleInfo)
|
||||||
val firFileBuilder = sessionProvider.rootModuleSession.firFileBuilder
|
val firFileBuilder = sessionProvider.rootModuleSession.firFileBuilder
|
||||||
return FirModuleResolveStateImpl(
|
return FirModuleResolveStateImpl(
|
||||||
|
moduleInfo.project,
|
||||||
moduleInfo,
|
moduleInfo,
|
||||||
sessionProvider,
|
sessionProvider,
|
||||||
firFileBuilder,
|
firFileBuilder,
|
||||||
|
|||||||
+2
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.fir.low.level.api
|
package org.jetbrains.kotlin.idea.fir.low.level.api
|
||||||
|
|
||||||
|
import com.intellij.openapi.project.Project
|
||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
||||||
import org.jetbrains.kotlin.fir.FirElement
|
import org.jetbrains.kotlin.fir.FirElement
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
@@ -21,6 +22,7 @@ import org.jetbrains.kotlin.psi.KtElement
|
|||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
|
|
||||||
internal class FirModuleResolveStateForCompletion(
|
internal class FirModuleResolveStateForCompletion(
|
||||||
|
override val project: Project,
|
||||||
private val originalState: FirModuleResolveStateImpl
|
private val originalState: FirModuleResolveStateImpl
|
||||||
) : FirModuleResolveState() {
|
) : FirModuleResolveState() {
|
||||||
override val moduleInfo: IdeaModuleInfo get() = originalState.moduleInfo
|
override val moduleInfo: IdeaModuleInfo get() = originalState.moduleInfo
|
||||||
|
|||||||
+2
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.fir.low.level.api
|
package org.jetbrains.kotlin.idea.fir.low.level.api
|
||||||
|
|
||||||
|
import com.intellij.openapi.project.Project
|
||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
||||||
import org.jetbrains.kotlin.fir.FirElement
|
import org.jetbrains.kotlin.fir.FirElement
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
@@ -31,6 +32,7 @@ import org.jetbrains.kotlin.psi.KtElement
|
|||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
|
|
||||||
internal class FirModuleResolveStateImpl(
|
internal class FirModuleResolveStateImpl(
|
||||||
|
override val project: Project,
|
||||||
override val moduleInfo: IdeaModuleInfo,
|
override val moduleInfo: IdeaModuleInfo,
|
||||||
private val sessionProvider: FirIdeSessionProvider,
|
private val sessionProvider: FirIdeSessionProvider,
|
||||||
val firFileBuilder: FirFileBuilder,
|
val firFileBuilder: FirFileBuilder,
|
||||||
|
|||||||
+4
-1
@@ -6,6 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.idea.fir.low.level.api.api
|
package org.jetbrains.kotlin.idea.fir.low.level.api.api
|
||||||
|
|
||||||
import org.jetbrains.annotations.TestOnly
|
import org.jetbrains.annotations.TestOnly
|
||||||
|
import com.intellij.openapi.project.Project
|
||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
||||||
import org.jetbrains.kotlin.fir.FirElement
|
import org.jetbrains.kotlin.fir.FirElement
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
@@ -26,9 +27,11 @@ import org.jetbrains.kotlin.psi.KtElement
|
|||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
|
|
||||||
abstract class FirModuleResolveState {
|
abstract class FirModuleResolveState {
|
||||||
|
abstract val project: Project
|
||||||
|
|
||||||
abstract val rootModuleSession: FirSession
|
abstract val rootModuleSession: FirSession
|
||||||
|
|
||||||
internal abstract val moduleInfo: IdeaModuleInfo
|
abstract val moduleInfo: IdeaModuleInfo
|
||||||
|
|
||||||
abstract val firTransformerProvider: FirTransformerProvider
|
abstract val firTransformerProvider: FirTransformerProvider
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -27,9 +27,9 @@ import org.jetbrains.kotlin.psi.KtNamedFunction
|
|||||||
import org.jetbrains.kotlin.psi.KtProperty
|
import org.jetbrains.kotlin.psi.KtProperty
|
||||||
|
|
||||||
object LowLevelFirApiFacadeForCompletion {
|
object LowLevelFirApiFacadeForCompletion {
|
||||||
fun getResolveStateForCompletion(element: KtElement, originalState: FirModuleResolveState): FirModuleResolveState {
|
fun getResolveStateForCompletion(originalState: FirModuleResolveState): FirModuleResolveState {
|
||||||
check(originalState is FirModuleResolveStateImpl)
|
check(originalState is FirModuleResolveStateImpl)
|
||||||
return FirModuleResolveStateForCompletion(originalState)
|
return FirModuleResolveStateForCompletion(originalState.project, originalState)
|
||||||
}
|
}
|
||||||
|
|
||||||
class FirCompletionContext internal constructor(
|
class FirCompletionContext internal constructor(
|
||||||
|
|||||||
+11
-7
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.frontend.api.fir
|
package org.jetbrains.kotlin.idea.frontend.api.fir
|
||||||
|
|
||||||
|
import com.intellij.openapi.project.Project
|
||||||
import org.jetbrains.kotlin.fir.resolve.firSymbolProvider
|
import org.jetbrains.kotlin.fir.resolve.firSymbolProvider
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
|
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.LowLevelFirApiFacade
|
import org.jetbrains.kotlin.idea.fir.low.level.api.api.LowLevelFirApiFacade
|
||||||
@@ -22,7 +23,7 @@ import org.jetbrains.kotlin.psi.KtElement
|
|||||||
|
|
||||||
internal class KtFirAnalysisSession
|
internal class KtFirAnalysisSession
|
||||||
private constructor(
|
private constructor(
|
||||||
private val element: KtElement,
|
private val project: Project,
|
||||||
val firResolveState: FirModuleResolveState,
|
val firResolveState: FirModuleResolveState,
|
||||||
internal val firSymbolBuilder: KtSymbolByFirBuilder,
|
internal val firSymbolBuilder: KtSymbolByFirBuilder,
|
||||||
token: ValidityToken,
|
token: ValidityToken,
|
||||||
@@ -32,8 +33,6 @@ private constructor(
|
|||||||
assertIsValid()
|
assertIsValid()
|
||||||
}
|
}
|
||||||
|
|
||||||
private val project = element.project
|
|
||||||
|
|
||||||
override val smartCastProvider: KtSmartCastProvider = KtFirSmartcastProvider(this, token)
|
override val smartCastProvider: KtSmartCastProvider = KtFirSmartcastProvider(this, token)
|
||||||
override val typeProvider: KtTypeProvider = KtFirTypeProvider(this, token)
|
override val typeProvider: KtTypeProvider = KtFirTypeProvider(this, token)
|
||||||
override val diagnosticProvider: KtDiagnosticProvider = KtFirDiagnosticProvider(this, token)
|
override val diagnosticProvider: KtDiagnosticProvider = KtFirDiagnosticProvider(this, token)
|
||||||
@@ -48,9 +47,9 @@ private constructor(
|
|||||||
|
|
||||||
override fun createContextDependentCopy(): KtAnalysisSession {
|
override fun createContextDependentCopy(): KtAnalysisSession {
|
||||||
check(!isContextSession) { "Cannot create context-dependent copy of KtAnalysis session from a context dependent one" }
|
check(!isContextSession) { "Cannot create context-dependent copy of KtAnalysis session from a context dependent one" }
|
||||||
val contextResolveState = LowLevelFirApiFacadeForCompletion.getResolveStateForCompletion(element, firResolveState)
|
val contextResolveState = LowLevelFirApiFacadeForCompletion.getResolveStateForCompletion(firResolveState)
|
||||||
return KtFirAnalysisSession(
|
return KtFirAnalysisSession(
|
||||||
element,
|
project,
|
||||||
contextResolveState,
|
contextResolveState,
|
||||||
firSymbolBuilder.createReadOnlyCopy(contextResolveState),
|
firSymbolBuilder.createReadOnlyCopy(contextResolveState),
|
||||||
token,
|
token,
|
||||||
@@ -62,7 +61,12 @@ private constructor(
|
|||||||
@Deprecated("Please use org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSessionProviderKt.analyze")
|
@Deprecated("Please use org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSessionProviderKt.analyze")
|
||||||
internal fun createForElement(element: KtElement): KtFirAnalysisSession {
|
internal fun createForElement(element: KtElement): KtFirAnalysisSession {
|
||||||
val firResolveState = LowLevelFirApiFacade.getResolveStateFor(element)
|
val firResolveState = LowLevelFirApiFacade.getResolveStateFor(element)
|
||||||
val project = element.project
|
return createAnalysisSessionByResolveState(firResolveState)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated("Please use org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSessionProviderKt.analyze")
|
||||||
|
internal fun createAnalysisSessionByResolveState(firResolveState: FirModuleResolveState): KtFirAnalysisSession {
|
||||||
|
val project = firResolveState.project
|
||||||
val token = ReadActionConfinementValidityToken(project)
|
val token = ReadActionConfinementValidityToken(project)
|
||||||
val firSymbolBuilder = KtSymbolByFirBuilder(
|
val firSymbolBuilder = KtSymbolByFirBuilder(
|
||||||
firResolveState,
|
firResolveState,
|
||||||
@@ -70,7 +74,7 @@ private constructor(
|
|||||||
token
|
token
|
||||||
)
|
)
|
||||||
return KtFirAnalysisSession(
|
return KtFirAnalysisSession(
|
||||||
element,
|
project,
|
||||||
firResolveState,
|
firResolveState,
|
||||||
firSymbolBuilder,
|
firSymbolBuilder,
|
||||||
token,
|
token,
|
||||||
|
|||||||
+7
-1
@@ -11,6 +11,7 @@ import com.intellij.psi.util.CachedValuesManager
|
|||||||
import com.intellij.psi.util.PsiModificationTracker
|
import com.intellij.psi.util.PsiModificationTracker
|
||||||
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
||||||
import org.jetbrains.kotlin.idea.caches.project.getModuleInfo
|
import org.jetbrains.kotlin.idea.caches.project.getModuleInfo
|
||||||
|
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.InvalidWayOfUsingAnalysisSession
|
import org.jetbrains.kotlin.idea.frontend.api.InvalidWayOfUsingAnalysisSession
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
|
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSessionProvider
|
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSessionProvider
|
||||||
@@ -19,7 +20,7 @@ import org.jetbrains.kotlin.psi.KtElement
|
|||||||
import java.util.concurrent.ConcurrentHashMap
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
|
|
||||||
@OptIn(InvalidWayOfUsingAnalysisSession::class)
|
@OptIn(InvalidWayOfUsingAnalysisSession::class)
|
||||||
class KtFirAnalysisSessionProvider(project: Project) : KtAnalysisSessionProvider() {
|
internal class KtFirAnalysisSessionProvider(project: Project) : KtAnalysisSessionProvider() {
|
||||||
private val analysisSessionByModuleInfoCache =
|
private val analysisSessionByModuleInfoCache =
|
||||||
CachedValuesManager.getManager(project).createCachedValue {
|
CachedValuesManager.getManager(project).createCachedValue {
|
||||||
CachedValueProvider.Result(
|
CachedValueProvider.Result(
|
||||||
@@ -36,4 +37,9 @@ class KtFirAnalysisSessionProvider(project: Project) : KtAnalysisSessionProvider
|
|||||||
assertIsValid()
|
assertIsValid()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal fun getAnalysisSessionByResolveState(firModuleResolveState: FirModuleResolveState): KtAnalysisSession =
|
||||||
|
analysisSessionByModuleInfoCache.value.getOrPut(firModuleResolveState.moduleInfo) {
|
||||||
|
KtFirAnalysisSession.createAnalysisSessionByResolveState(firModuleResolveState)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+23
@@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* 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
|
||||||
|
|
||||||
|
import com.intellij.openapi.components.service
|
||||||
|
import org.jetbrains.kotlin.idea.frontend.api.InvalidWayOfUsingAnalysisSession
|
||||||
|
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
|
||||||
|
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSessionProvider
|
||||||
|
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirSymbol
|
||||||
|
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol
|
||||||
|
|
||||||
|
@OptIn(InvalidWayOfUsingAnalysisSession::class)
|
||||||
|
internal inline fun <R> analyzeWithSymbolAsContext(contextSymbol: KtSymbol, action: KtAnalysisSession.() -> R): R {
|
||||||
|
require(contextSymbol is KtFirSymbol<*>)
|
||||||
|
val resolveState = contextSymbol.firRef.resolveState
|
||||||
|
val analysisSessionProvider = resolveState.project.service<KtAnalysisSessionProvider>()
|
||||||
|
check(analysisSessionProvider is KtFirAnalysisSessionProvider)
|
||||||
|
val analysisSession = analysisSessionProvider.getAnalysisSessionByResolveState(resolveState)
|
||||||
|
return action(analysisSession)
|
||||||
|
}
|
||||||
+3
-2
@@ -21,11 +21,12 @@ internal class FirRefWithValidityCheck<D : FirDeclaration>(fir: D, resolveState:
|
|||||||
inline fun <R> withFir(phase: FirResolvePhase = FirResolvePhase.RAW_FIR, action: (fir: D) -> R): R {
|
inline fun <R> withFir(phase: FirResolvePhase = FirResolvePhase.RAW_FIR, action: (fir: D) -> R): R {
|
||||||
token.assertIsValid()
|
token.assertIsValid()
|
||||||
val fir = firWeakRef.get() ?: error("FirElement was garbage collected while analysis session is still valid")
|
val fir = firWeakRef.get() ?: error("FirElement was garbage collected while analysis session is still valid")
|
||||||
val resolveState =
|
|
||||||
resolveStateWeakRef.get() ?: error("FirModuleResolveState was garbage collected while analysis session is still valid")
|
|
||||||
return action(LowLevelFirApiFacade.resolvedFirToPhase(fir, phase, resolveState))
|
return action(LowLevelFirApiFacade.resolvedFirToPhase(fir, phase, resolveState))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val resolveState
|
||||||
|
get() = resolveStateWeakRef.get() ?: error("FirModuleResolveState was garbage collected while analysis session is still valid")
|
||||||
|
|
||||||
inline fun <R> withFirAndCache(phase: FirResolvePhase = FirResolvePhase.RAW_FIR, crossinline createValue: (fir: D) -> R) =
|
inline fun <R> withFirAndCache(phase: FirResolvePhase = FirResolvePhase.RAW_FIR, crossinline createValue: (fir: D) -> R) =
|
||||||
ValidityAwareCachedValue(token) {
|
ValidityAwareCachedValue(token) {
|
||||||
withFir(phase) { fir -> createValue(fir) }
|
withFir(phase) { fir -> createValue(fir) }
|
||||||
|
|||||||
Reference in New Issue
Block a user