Analysis API: recreate analysis session when not found by resolve state
This commit is contained in:
-6
@@ -31,7 +31,6 @@ private constructor(
|
||||
val firResolveState: FirModuleResolveState,
|
||||
internal val firSymbolBuilder: KtSymbolByFirBuilder,
|
||||
token: ValidityToken,
|
||||
element: KtElement,
|
||||
private val mode: AnalysisSessionMode,
|
||||
) : KtAnalysisSession(token) {
|
||||
|
||||
@@ -110,7 +109,6 @@ private constructor(
|
||||
contextResolveState,
|
||||
firSymbolBuilder.createReadOnlyCopy(contextResolveState),
|
||||
token,
|
||||
originalKtFile,
|
||||
AnalysisSessionMode.DEPENDENT_COPY
|
||||
)
|
||||
}
|
||||
@@ -118,15 +116,12 @@ private constructor(
|
||||
val rootModuleSession: FirSession get() = firResolveState.rootModuleSession
|
||||
val firSymbolProvider: FirSymbolProvider get() = rootModuleSession.symbolProvider
|
||||
val targetPlatform: TargetPlatform get() = rootModuleSession.moduleData.platform
|
||||
val searchScope: GlobalSearchScope = element.resolveScope//todo
|
||||
|
||||
companion object {
|
||||
@InvalidWayOfUsingAnalysisSession
|
||||
@Deprecated("Please use org.jetbrains.kotlin.analysis.api.KtAnalysisSessionProviderKt.analyze")
|
||||
internal fun createAnalysisSessionByResolveState(
|
||||
firResolveState: FirModuleResolveState,
|
||||
token: ValidityToken,
|
||||
element: KtElement,
|
||||
): KtFirAnalysisSession {
|
||||
val project = firResolveState.project
|
||||
val firSymbolBuilder = KtSymbolByFirBuilder(
|
||||
@@ -139,7 +134,6 @@ private constructor(
|
||||
firResolveState,
|
||||
firSymbolBuilder,
|
||||
token,
|
||||
element,
|
||||
AnalysisSessionMode.REGULAR,
|
||||
)
|
||||
}
|
||||
|
||||
+4
-3
@@ -30,9 +30,10 @@ class KtFirAnalysisSessionProvider(project: Project) : CachingKtAnalysisSessionP
|
||||
override fun createAnalysisSession(
|
||||
resolveState: FirModuleResolveState,
|
||||
validityToken: ValidityToken,
|
||||
contextElement: KtElement
|
||||
): KtAnalysisSession {
|
||||
@Suppress("DEPRECATION")
|
||||
return KtFirAnalysisSession.createAnalysisSessionByResolveState(resolveState, validityToken, contextElement)
|
||||
return KtFirAnalysisSession.createAnalysisSessionByResolveState(resolveState, validityToken)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
+2
-1
@@ -6,6 +6,7 @@
|
||||
package org.jetbrains.kotlin.analysis.api.fir.components
|
||||
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.psi.search.GlobalSearchScope
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
@@ -212,7 +213,7 @@ internal class KtFirScopeProvider(
|
||||
project,
|
||||
builder,
|
||||
token,
|
||||
analysisSession.searchScope,
|
||||
GlobalSearchScope.allScope(project), // todo
|
||||
analysisSession.targetPlatform
|
||||
)
|
||||
is FirContainingNamesAwareScope -> KtFirDelegatingScopeImpl(firScope, builder, token)
|
||||
|
||||
+2
-3
@@ -33,7 +33,6 @@ abstract class CachingKtAnalysisSessionProvider<State : Any>(private val project
|
||||
protected abstract fun createAnalysisSession(
|
||||
resolveState: State,
|
||||
validityToken: ValidityToken,
|
||||
contextElement: KtElement
|
||||
): KtAnalysisSession
|
||||
|
||||
@InvalidWayOfUsingAnalysisSession
|
||||
@@ -41,7 +40,7 @@ abstract class CachingKtAnalysisSessionProvider<State : Any>(private val project
|
||||
val resolveState = getResolveState(contextElement)
|
||||
return cache.getAnalysisSession(resolveState to factory.identifier) {
|
||||
val validityToken = factory.create(project)
|
||||
createAnalysisSession(resolveState, validityToken, contextElement)
|
||||
createAnalysisSession(resolveState, validityToken)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,7 +48,7 @@ abstract class CachingKtAnalysisSessionProvider<State : Any>(private val project
|
||||
val resolveState = getResolveState(contextSymbol)
|
||||
val token = contextSymbol.token
|
||||
return getCachedAnalysisSession(resolveState, token)
|
||||
?: error("analysis session was not found for ${contextSymbol::class}, symbol.isValid=${contextSymbol.isValid()}")
|
||||
?: createAnalysisSession(resolveState, contextSymbol.token)
|
||||
}
|
||||
|
||||
private fun getCachedAnalysisSession(resolveState: State, token: ValidityToken): KtAnalysisSession? {
|
||||
|
||||
+2
@@ -29,6 +29,8 @@ public class AlwaysAccessibleValidityToken(project: Project) : ValidityToken() {
|
||||
override fun getInaccessibilityReason(): String {
|
||||
error("Getting inaccessibility reason for validity token when it is accessible")
|
||||
}
|
||||
|
||||
override val factory: ValidityTokenFactory = AlwaysAccessibleValidityTokenFactory
|
||||
}
|
||||
|
||||
public object AlwaysAccessibleValidityTokenFactory : ValidityTokenFactory() {
|
||||
|
||||
+3
@@ -52,6 +52,8 @@ public class ReadActionConfinementValidityToken(project: Project) : ValidityToke
|
||||
@HackToForceAllowRunningAnalyzeOnEDT
|
||||
public val allowOnEdt: ThreadLocal<Boolean> = ThreadLocal.withInitial { false }
|
||||
}
|
||||
|
||||
public override val factory: ValidityTokenFactory = ReadActionConfinementValidityTokenFactory
|
||||
}
|
||||
|
||||
public object ReadActionConfinementValidityTokenFactory : ValidityTokenFactory() {
|
||||
@@ -70,6 +72,7 @@ public object ReadActionConfinementValidityTokenFactory : ValidityTokenFactory()
|
||||
private val currentAnalysisContextEnteringCount = ThreadLocal.withInitial { 0 }
|
||||
|
||||
internal fun isInsideAnalysisContext() = currentAnalysisContextEnteringCount.get() > 0
|
||||
|
||||
}
|
||||
|
||||
@RequiresOptIn("All frontend related work should not be allowed to be ran from EDT thread. Only use it as a temporary solution")
|
||||
|
||||
@@ -14,6 +14,8 @@ public abstract class ValidityToken {
|
||||
|
||||
public abstract fun isAccessible(): Boolean
|
||||
public abstract fun getInaccessibilityReason(): String
|
||||
|
||||
public abstract val factory: ValidityTokenFactory
|
||||
}
|
||||
|
||||
public abstract class ValidityTokenFactory {
|
||||
|
||||
Reference in New Issue
Block a user