FIR IDE: get rid of LowLevelFirApiFacade object

This commit is contained in:
Ilya Kirillov
2020-11-26 10:52:39 +01:00
parent a206eca164
commit 3141fead0d
22 changed files with 122 additions and 224 deletions
@@ -15,6 +15,8 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo
import org.jetbrains.kotlin.idea.fir.low.level.api.annotations.InternalForInline
import org.jetbrains.kotlin.idea.fir.low.level.api.annotations.PrivateForInline
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.element.builder.FirTowerDataContextCollector import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.FirTowerDataContextCollector
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache
@@ -92,14 +94,17 @@ internal class FirModuleResolveStateForCompletion(
error("Diagnostics should not be retrieved in completion") error("Diagnostics should not be retrieved in completion")
} }
@OptIn(InternalForInline::class)
override fun findNonLocalSourceFirDeclaration(ktDeclaration: KtDeclaration): FirDeclaration { override fun findNonLocalSourceFirDeclaration(ktDeclaration: KtDeclaration): FirDeclaration {
error("Should not be used in completion") error("Should not be used in completion")
} }
@OptIn(InternalForInline::class)
override fun findSourceFirDeclaration(ktDeclaration: KtDeclaration): FirDeclaration { override fun findSourceFirDeclaration(ktDeclaration: KtDeclaration): FirDeclaration {
error("Should not be used in completion") error("Should not be used in completion")
} }
@OptIn(InternalForInline::class)
override fun findSourceFirDeclaration(ktDeclaration: KtLambdaExpression): FirDeclaration { override fun findSourceFirDeclaration(ktDeclaration: KtLambdaExpression): FirDeclaration {
error("Should not be used in completion") error("Should not be used in completion")
} }
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo
import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo
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.annotations.InternalForInline
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.diagnostics.DiagnosticsCollector import org.jetbrains.kotlin.idea.fir.low.level.api.diagnostics.DiagnosticsCollector
import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.FirElementBuilder import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.FirElementBuilder
@@ -71,6 +72,7 @@ internal class FirModuleResolveStateImpl(
error("Should be called only from FirModuleResolveStateForCompletion") error("Should be called only from FirModuleResolveStateForCompletion")
} }
@OptIn(InternalForInline::class)
override fun findNonLocalSourceFirDeclaration( override fun findNonLocalSourceFirDeclaration(
ktDeclaration: KtDeclaration, ktDeclaration: KtDeclaration,
): FirDeclaration = ktDeclaration.findSourceNonLocalFirDeclaration( ): FirDeclaration = ktDeclaration.findSourceNonLocalFirDeclaration(
@@ -79,9 +81,11 @@ internal class FirModuleResolveStateImpl(
sessionProvider.getModuleCache(ktDeclaration.getModuleInfo() as ModuleSourceInfo) sessionProvider.getModuleCache(ktDeclaration.getModuleInfo() as ModuleSourceInfo)
) )
@OptIn(InternalForInline::class)
override fun findSourceFirDeclaration(ktDeclaration: KtDeclaration): FirDeclaration = override fun findSourceFirDeclaration(ktDeclaration: KtDeclaration): FirDeclaration =
findSourceFirDeclarationByExpression(ktDeclaration) findSourceFirDeclarationByExpression(ktDeclaration)
@OptIn(InternalForInline::class)
override fun findSourceFirDeclaration(ktDeclaration: KtLambdaExpression): FirDeclaration = override fun findSourceFirDeclaration(ktDeclaration: KtLambdaExpression): FirDeclaration =
findSourceFirDeclarationByExpression(ktDeclaration) findSourceFirDeclarationByExpression(ktDeclaration)
@@ -5,6 +5,8 @@
package org.jetbrains.kotlin.idea.fir.low.level.api.annotations package org.jetbrains.kotlin.idea.fir.low.level.api.annotations
@Target(AnnotationTarget.PROPERTY, AnnotationTarget.FUNCTION, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.CLASS)
@RequiresOptIn @RequiresOptIn
annotation class PrivateForInline annotation class PrivateForInline
@RequiresOptIn
annotation class InternalForInline
@@ -17,6 +17,8 @@ import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo
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.FirIdeResolveStateService import org.jetbrains.kotlin.idea.fir.low.level.api.FirIdeResolveStateService
import org.jetbrains.kotlin.idea.fir.low.level.api.FirTransformerProvider import org.jetbrains.kotlin.idea.fir.low.level.api.FirTransformerProvider
import org.jetbrains.kotlin.idea.fir.low.level.api.annotations.InternalForInline
import org.jetbrains.kotlin.idea.fir.low.level.api.annotations.PrivateForInline
import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.FirTowerDataContextCollector import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.FirTowerDataContextCollector
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.FirFileBuilder import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.FirFileBuilder
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache
@@ -52,14 +54,17 @@ abstract class FirModuleResolveState {
@TestOnly @TestOnly
internal abstract fun getBuiltFirFileOrNull(ktFile: KtFile): FirFile? internal abstract fun getBuiltFirFileOrNull(ktFile: KtFile): FirFile?
@InternalForInline
abstract fun findNonLocalSourceFirDeclaration( abstract fun findNonLocalSourceFirDeclaration(
ktDeclaration: KtDeclaration, ktDeclaration: KtDeclaration,
): FirDeclaration ): FirDeclaration
@InternalForInline
abstract fun findSourceFirDeclaration( abstract fun findSourceFirDeclaration(
ktDeclaration: KtDeclaration, ktDeclaration: KtDeclaration,
): FirDeclaration ): FirDeclaration
@InternalForInline
abstract fun findSourceFirDeclaration( abstract fun findSourceFirDeclaration(
ktDeclaration: KtLambdaExpression, ktDeclaration: KtLambdaExpression,
): FirDeclaration ): FirDeclaration
@@ -7,113 +7,92 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.api
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.FirSymbolOwner
import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo
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.FirIdeResolveStateService import org.jetbrains.kotlin.idea.fir.low.level.api.FirIdeResolveStateService
import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirIdeSourcesSession import org.jetbrains.kotlin.idea.fir.low.level.api.annotations.InternalForInline
import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtLambdaExpression import org.jetbrains.kotlin.psi.KtLambdaExpression
import kotlin.reflect.KClass import kotlin.reflect.KClass
object LowLevelFirApiFacade { fun KtElement.getResolveState(): FirModuleResolveState =
fun getResolveStateFor(element: KtElement): FirModuleResolveState = getModuleInfo().getResolveState()
getResolveStateFor(element.getModuleInfo())
fun getResolveStateFor(moduleInfo: IdeaModuleInfo): FirModuleResolveState = fun IdeaModuleInfo.getResolveState(): FirModuleResolveState =
FirIdeResolveStateService.getInstance(moduleInfo.project!!).getResolveState(moduleInfo) FirIdeResolveStateService.getInstance(project!!).getResolveState(this)
fun getSessionFor(element: KtElement): FirSession = fun KtFile.getFirFile(resolveState: FirModuleResolveState) =
getResolveStateFor(element).getSessionFor(element.getModuleInfo()) resolveState.getFirFile(this)
fun getOrBuildFirFor(element: KtElement, resolveState: FirModuleResolveState): FirElement = /**
resolveState.getOrBuildFirFor(element) * Creates [FirDeclaration] by [KtDeclaration] and runs an [action] with it
* [this@withFirDeclaration]
fun getFirFile(ktFile: KtFile, resolveState: FirModuleResolveState) = * [FirDeclaration] passed to [action] should not be leaked outside [action] lambda
resolveState.getFirFile(ktFile) * [FirDeclaration] passed to [action] will be resolved at least to [phase]
* Otherwise, some threading problems may arise,
/** *
* Creates [FirDeclaration] by [KtDeclaration] and runs an [action] with it * [this@withFirDeclaration] should be non-local declaration (should have fully qualified name)
* [ktDeclaration] */
* [FirDeclaration] passed to [action] should not be leaked outside [action] lambda @OptIn(InternalForInline::class)
* [FirDeclaration] passed to [action] will be resolved at least to [phase] inline fun <R> KtDeclaration.withFirDeclaration(
* Otherwise, some threading problems may arise, resolveState: FirModuleResolveState,
* phase: FirResolvePhase = FirResolvePhase.RAW_FIR,
* [ktDeclaration] should be non-local declaration (should have fully qualified name) action: (FirDeclaration) -> R
*/ ): R {
inline fun <R> withFirDeclaration( val firDeclaration = resolveState.findSourceFirDeclaration(this)
ktDeclaration: KtDeclaration, firDeclaration.resolvedFirToPhase(phase, resolveState)
resolveState: FirModuleResolveState, return action(firDeclaration)
phase: FirResolvePhase = FirResolvePhase.RAW_FIR,
action: (FirDeclaration) -> R
): R {
val firDeclaration = resolveState.findSourceFirDeclaration(ktDeclaration)
resolvedFirToPhase(firDeclaration, phase, resolveState)
return action(firDeclaration)
}
inline fun <reified F : FirDeclaration, R> withFirDeclarationOfType(
ktDeclaration: KtDeclaration,
resolveState: FirModuleResolveState,
action: (F) -> R
): R {
val firDeclaration = resolveState.findSourceFirDeclaration(ktDeclaration)
if (firDeclaration !is F) throw InvalidFirElementTypeException(ktDeclaration, F::class, firDeclaration::class)
return action(firDeclaration)
}
inline fun <reified F : FirDeclaration, R> withFirDeclarationOfType(
ktDeclaration: KtLambdaExpression,
resolveState: FirModuleResolveState,
action: (F) -> R
): R {
val firDeclaration = resolveState.findSourceFirDeclaration(ktDeclaration)
if (firDeclaration !is F) throw InvalidFirElementTypeException(ktDeclaration, F::class, firDeclaration::class)
return action(firDeclaration)
}
inline fun <F : FirElement, R> withFir(fir: F, action: (F) -> R): R {
// TODO locking
return action(fir)
}
fun getDiagnosticsFor(element: KtElement, resolveState: FirModuleResolveState): Collection<Diagnostic> =
resolveState.getDiagnostics(element)
fun collectDiagnosticsForFile(ktFile: KtFile, resolveState: FirModuleResolveState): Collection<Diagnostic> =
resolveState.collectDiagnosticsForFile(ktFile)
fun <D : FirDeclaration> resolvedFirToPhase(
firDeclaration: D,
phase: FirResolvePhase,
resolveState: FirModuleResolveState
): D =
resolveState.resolvedFirToPhase(firDeclaration, phase)
} }
@OptIn(InternalForInline::class)
inline fun <reified F : FirDeclaration, R> KtDeclaration.withFirDeclarationOfType(
resolveState: FirModuleResolveState,
action: (F) -> R
): R {
val firDeclaration = resolveState.findSourceFirDeclaration(this)
if (firDeclaration !is F) throw InvalidFirElementTypeException(this, F::class, firDeclaration::class)
return action(firDeclaration)
}
@OptIn(InternalForInline::class)
inline fun <reified F : FirDeclaration, R> KtLambdaExpression.withFirDeclarationOfType(
resolveState: FirModuleResolveState,
action: (F) -> R
): R {
val firDeclaration = resolveState.findSourceFirDeclaration(this)
if (firDeclaration !is F) throw InvalidFirElementTypeException(this, F::class, firDeclaration::class)
return action(firDeclaration)
}
fun getDiagnosticsFor(element: KtElement, resolveState: FirModuleResolveState): Collection<Diagnostic> =
resolveState.getDiagnostics(element)
fun KtFile.collectDiagnosticsForFile(resolveState: FirModuleResolveState): Collection<Diagnostic> =
resolveState.collectDiagnosticsForFile(this)
fun <D : FirDeclaration> D.resolvedFirToPhase(
phase: FirResolvePhase,
resolveState: FirModuleResolveState
): D =
resolveState.resolvedFirToPhase(this, phase)
fun KtElement.getOrBuildFir( fun KtElement.getOrBuildFir(
resolveState: FirModuleResolveState, resolveState: FirModuleResolveState,
) = LowLevelFirApiFacade.getOrBuildFirFor(this, resolveState) ) = resolveState.getOrBuildFirFor(this)
inline fun <reified E : FirElement> KtElement.getOrBuildFirSafe( inline fun <reified E : FirElement> KtElement.getOrBuildFirSafe(
resolveState: FirModuleResolveState, resolveState: FirModuleResolveState,
) = LowLevelFirApiFacade.getOrBuildFirFor(this, resolveState) as? E ) = getOrBuildFir(resolveState) as? E
inline fun <reified E : FirElement> KtElement.getOrBuildFirOfType( inline fun <reified E : FirElement> KtElement.getOrBuildFirOfType(
resolveState: FirModuleResolveState, resolveState: FirModuleResolveState,
): E { ): E {
val fir = LowLevelFirApiFacade.getOrBuildFirFor(this, resolveState) val fir = this.getOrBuildFir(resolveState)
if (fir is E) return fir if (fir is E) return fir
throw InvalidFirElementTypeException(this, E::class, fir::class) throw InvalidFirElementTypeException(this, E::class, fir::class)
} }
@@ -1,69 +0,0 @@
/*
* 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.fir.low.level.api.api
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.idea.fir.low.level.api.annotations.PrivateForInline
import org.jetbrains.kotlin.psi.KtDeclaration
import java.lang.ref.WeakReference
import kotlin.reflect.KClass
/**
* Lazy [FirDeclaration] reference which allows to find corresponding non-local [FirDeclaration] by [KtDeclaration]
* Builds declaration only when [withFir] is called or some other entity already built it
* Allows approximately to check if we already have corresponding [FirDeclaration] built by [isFirDeclarationAlreadyBuilt]
*
* To create one consider using [weakByPsiRef]
*/
class WeakFirByPsiRef<KT : KtDeclaration, FIR : FirDeclaration> @PrivateForInline constructor(
val ktDeclaration: KT,
@PrivateForInline val firClass: KClass<FIR>,
resolveState: FirModuleResolveState,
) {
@PrivateForInline
val resolveStateWeakRef = WeakReference(resolveState)
/**
* Checks if corresponding [FirDeclaration] is available now
* If return true consequent call to [withFir] will not build new RAW_FIR as it is already built
* If return false consequent call to [withFir] will build new [FirDeclaration]
* if it was not build between [isFirDeclarationAlreadyBuilt] & [withFir] calls
*
* Should be used with caution as this is only approximation and may return inaccurate results
*/
@OptIn(PrivateForInline::class)
fun isFirDeclarationAlreadyBuilt(): Boolean {
val resolveState = resolveStateWeakRef.get()
?: error("FirModuleResolveState was garbage collected")
return resolveState.isFirFileBuilt(ktDeclaration.containingKtFile)
}
/**
* Creates [FirDeclaration] by [KtDeclaration] if it is not created previously and runs an [action] with it
* [FirDeclaration] passed to [action] should not be leaked outside [action] lambda
* Otherwise, some threading problems may arise.`
*
* [FirDeclaration] passed to [action] will be resolved at least to [phase]
**/
@OptIn(PrivateForInline::class)
inline fun <R> withFir(phase: FirResolvePhase = FirResolvePhase.RAW_FIR, action: (fir: FIR) -> R): R {
val resolveState = resolveStateWeakRef.get()
?: error("FirModuleResolveState was garbage collected")
return LowLevelFirApiFacade.withFirDeclaration(ktDeclaration, resolveState, phase) { fir ->
if (!firClass.isInstance(fir)) throw InvalidFirElementTypeException(ktDeclaration, firClass, fir::class)
@Suppress("UNCHECKED_CAST")
action(fir as FIR)
}
}
}
@OptIn(PrivateForInline::class)
inline fun <KT : KtDeclaration, reified FIR : FirDeclaration> weakByPsiRef(
ktDeclaration: KT,
resolveState: FirModuleResolveState,
) = WeakFirByPsiRef(ktDeclaration, FIR::class, resolveState)
@@ -1,28 +0,0 @@
/*
* 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.fir.low.level.api.api
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.idea.fir.low.level.api.annotations.PrivateForInline
import java.lang.ref.WeakReference
class WeakFirRef<D : FirDeclaration>(fir: D, resolveState: FirModuleResolveState) {
@PrivateForInline
val firWeakRef = WeakReference(fir)
@PrivateForInline
val resolveStateWeakRef = WeakReference(resolveState)
@OptIn(PrivateForInline::class)
inline fun <R> withFir(phase: FirResolvePhase = FirResolvePhase.RAW_FIR, action: (fir: D) -> R): R {
val fir = firWeakRef.get()
?: error("FirElement was garbage collected")
val resolveState = resolveStateWeakRef.get()
?: error("FirModuleResolveState was garbage collected")
return action(LowLevelFirApiFacade.resolvedFirToPhase(fir, phase, resolveState))
}
}
@@ -10,7 +10,7 @@ import com.intellij.testFramework.LightProjectDescriptor
import org.jetbrains.kotlin.fir.FirRenderer import org.jetbrains.kotlin.fir.FirRenderer
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.idea.fir.low.level.api.api.LowLevelFirApiFacade import org.jetbrains.kotlin.idea.fir.low.level.api.api.withFirDeclaration
import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase
import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor
import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtDeclaration
@@ -34,8 +34,7 @@ abstract class AbstractFirLazyDeclarationResolveTest : KotlinLightCodeInsightFix
val declarationToResolve = lazyDeclarations.firstOrNull { it.name?.toLowerCase() == "resolveme" } val declarationToResolve = lazyDeclarations.firstOrNull { it.name?.toLowerCase() == "resolveme" }
?: error("declaration with name `resolveMe` was not found") ?: error("declaration with name `resolveMe` was not found")
resolveWithClearCaches(ktFile) { firModuleResolveState -> resolveWithClearCaches(ktFile) { firModuleResolveState ->
val rendered = LowLevelFirApiFacade.withFirDeclaration( val rendered = declarationToResolve.withFirDeclaration(
declarationToResolve,
firModuleResolveState, firModuleResolveState,
FirResolvePhase.BODY_RESOLVE FirResolvePhase.BODY_RESOLVE
) @Suppress("UNUSED_ANONYMOUS_PARAMETER") { firDeclaration -> ) @Suppress("UNUSED_ANONYMOUS_PARAMETER") { firDeclaration ->
@@ -20,7 +20,8 @@ import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo
import org.jetbrains.kotlin.idea.caches.project.productionSourceInfo import org.jetbrains.kotlin.idea.caches.project.productionSourceInfo
import org.jetbrains.kotlin.idea.fir.low.level.api.api.LowLevelFirApiFacade import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFir
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getResolveState
import org.jetbrains.kotlin.idea.fir.low.level.api.providers.firIdeProvider import org.jetbrains.kotlin.idea.fir.low.level.api.providers.firIdeProvider
import org.jetbrains.kotlin.idea.jsonUtils.getString import org.jetbrains.kotlin.idea.jsonUtils.getString
import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase
@@ -67,8 +68,8 @@ abstract class AbstractFirLazyResolveTest : KotlinLightCodeInsightFixtureTestCas
else -> elementToResolve else -> elementToResolve
} as KtExpression } as KtExpression
val resolveState = LowLevelFirApiFacade.getResolveStateFor(expressionToResolve) val resolveState = expressionToResolve.getResolveState()
val resultsDump = when (val firElement = resolveState.getOrBuildFirFor(expressionToResolve)) { val resultsDump = when (val firElement = expressionToResolve.getOrBuildFir(resolveState)) {
is FirResolvedImport -> buildString { is FirResolvedImport -> buildString {
append("import ") append("import ")
append(firElement.packageFqName) append(firElement.packageFqName)
@@ -9,7 +9,8 @@ import com.intellij.openapi.vfs.VirtualFileManager
import com.intellij.psi.PsiManager import com.intellij.psi.PsiManager
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.idea.fir.low.level.api.api.LowLevelFirApiFacade import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFir
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getResolveState
import org.jetbrains.kotlin.idea.stubs.AbstractMultiModuleTest import org.jetbrains.kotlin.idea.stubs.AbstractMultiModuleTest
import org.jetbrains.kotlin.idea.util.sourceRoots import org.jetbrains.kotlin.idea.util.sourceRoots
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
@@ -38,12 +39,12 @@ abstract class AbstractFirMultiModuleLazyResolveTest : AbstractMultiModuleTest()
val virtualFileToAnalyse = VirtualFileManager.getInstance().findFileByUrl(fileToAnalysePath) val virtualFileToAnalyse = VirtualFileManager.getInstance().findFileByUrl(fileToAnalysePath)
?: error("File ${testStructure.fileToResolve.filePath} not found") ?: error("File ${testStructure.fileToResolve.filePath} not found")
val ktFileToAnalyse = PsiManager.getInstance(project).findFile(virtualFileToAnalyse) as KtFile val ktFileToAnalyse = PsiManager.getInstance(project).findFile(virtualFileToAnalyse) as KtFile
val resolveState = LowLevelFirApiFacade.getResolveStateFor(ktFileToAnalyse) val resolveState = ktFileToAnalyse.getResolveState()
val fails = testStructure.fails val fails = testStructure.fails
try { try {
val fir = LowLevelFirApiFacade.getOrBuildFirFor(ktFileToAnalyse, resolveState) val fir = ktFileToAnalyse.getOrBuildFir(resolveState)
KotlinTestUtils.assertEqualsToFile(File("$path/expected.txt"), fir.render()) KotlinTestUtils.assertEqualsToFile(File("$path/expected.txt"), fir.render())
} catch (e: Throwable) { } catch (e: Throwable) {
if (!fails) throw e if (!fails) throw e
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.idea.fir.low.level.api package org.jetbrains.kotlin.idea.fir.low.level.api
import org.jetbrains.kotlin.idea.AbstractResolveElementCacheTest import org.jetbrains.kotlin.idea.AbstractResolveElementCacheTest
import org.jetbrains.kotlin.idea.fir.low.level.api.api.LowLevelFirApiFacade import org.jetbrains.kotlin.idea.fir.low.level.api.api.getResolveState
class FirResolveStateTest : AbstractResolveElementCacheTest() { class FirResolveStateTest : AbstractResolveElementCacheTest() {
override fun isFirPlugin(): Boolean = true override fun isFirPlugin(): Boolean = true
@@ -15,7 +15,7 @@ class FirResolveStateTest : AbstractResolveElementCacheTest() {
doTest { doTest {
val firstStatement = statements[0] val firstStatement = statements[0]
val secondStatement = statements[1] val secondStatement = statements[1]
assertSame(LowLevelFirApiFacade.getResolveStateFor(firstStatement), LowLevelFirApiFacade.getResolveStateFor(secondStatement)) assertSame(firstStatement.getResolveState(), secondStatement.getResolveState())
} }
} }
} }
@@ -11,7 +11,7 @@ import com.intellij.psi.util.parentOfType
import junit.framework.Assert import junit.framework.Assert
import org.jetbrains.kotlin.idea.fir.low.level.api.FirModuleResolveStateImpl import org.jetbrains.kotlin.idea.fir.low.level.api.FirModuleResolveStateImpl
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.getResolveState
import org.jetbrains.kotlin.idea.fir.low.level.api.trackers.AbstractProjectWideOutOfBlockKotlinModificationTrackerTest import org.jetbrains.kotlin.idea.fir.low.level.api.trackers.AbstractProjectWideOutOfBlockKotlinModificationTrackerTest
import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase
import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtElement
@@ -57,7 +57,7 @@ abstract class AbstractFileStructureAndOutOfBlockModificationTrackerConsistencyT
findElementAt(myFixture.caretOffset)!!.parentOfType()!! findElementAt(myFixture.caretOffset)!!.parentOfType()!!
private fun getStructureElementForKtElement(element: KtElement): Triple<FileStructureElement, FileStructure, FirModuleResolveState> { private fun getStructureElementForKtElement(element: KtElement): Triple<FileStructureElement, FileStructure, FirModuleResolveState> {
val moduleResolveState = LowLevelFirApiFacade.getResolveStateFor(element) as FirModuleResolveStateImpl val moduleResolveState = element.getResolveState() as FirModuleResolveStateImpl
val fileStructure = val fileStructure =
moduleResolveState.fileStructureCache.getFileStructure(element.containingKtFile, moduleResolveState.rootModuleSession.cache) moduleResolveState.fileStructureCache.getFileStructure(element.containingKtFile, moduleResolveState.rootModuleSession.cache)
val fileStructureElement = fileStructure.getStructureElementFor(element) val fileStructureElement = fileStructure.getStructureElementFor(element)
@@ -15,7 +15,7 @@ import com.intellij.psi.util.parentOfType
import junit.framework.Assert import junit.framework.Assert
import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.idea.fir.low.level.api.FirModuleResolveStateImpl import org.jetbrains.kotlin.idea.fir.low.level.api.FirModuleResolveStateImpl
import org.jetbrains.kotlin.idea.fir.low.level.api.api.LowLevelFirApiFacade import org.jetbrains.kotlin.idea.fir.low.level.api.api.getResolveState
import org.jetbrains.kotlin.idea.search.getKotlinFqName import org.jetbrains.kotlin.idea.search.getKotlinFqName
import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase
import org.jetbrains.kotlin.idea.util.getElementTextInContext import org.jetbrains.kotlin.idea.util.getElementTextInContext
@@ -70,7 +70,7 @@ abstract class AbstractFileStructureTest : KotlinLightCodeInsightFixtureTestCase
} }
private fun KtFile.getFileStructure(): FileStructure { private fun KtFile.getFileStructure(): FileStructure {
val moduleResolveState = LowLevelFirApiFacade.getResolveStateFor(this) as FirModuleResolveStateImpl val moduleResolveState = getResolveState() as FirModuleResolveStateImpl
return moduleResolveState.fileStructureCache.getFileStructure( return moduleResolveState.fileStructureCache.getFileStructure(
ktFile = this, ktFile = this,
moduleFileCache = moduleResolveState.rootModuleSession.cache moduleFileCache = moduleResolveState.rootModuleSession.cache
@@ -9,8 +9,6 @@ import com.intellij.openapi.module.ModuleManager
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
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.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.sessions.FirIdeSessionProviderStorage
import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtElement
internal fun Project.allModules() = ModuleManager.getInstance(this).modules.toList() internal fun Project.allModules() = ModuleManager.getInstance(this).modules.toList()
@@ -20,7 +20,6 @@ import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.types.ConeNullability import org.jetbrains.kotlin.fir.types.ConeNullability
import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.idea.fir.low.level.api.api.LowLevelFirApiFacade
import org.jetbrains.kotlin.idea.frontend.api.analyze import org.jetbrains.kotlin.idea.frontend.api.analyze
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol
import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind
@@ -8,8 +8,8 @@ package org.jetbrains.kotlin.idea.frontend.api.fir
import com.intellij.openapi.project.Project 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.LowLevelFirApiFacadeForCompletion import org.jetbrains.kotlin.idea.fir.low.level.api.api.LowLevelFirApiFacadeForCompletion
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getResolveState
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.ReadActionConfinementValidityToken import org.jetbrains.kotlin.idea.frontend.api.ReadActionConfinementValidityToken
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
@@ -60,7 +60,7 @@ private constructor(
companion object { companion object {
@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 = element.getResolveState()
return createAnalysisSessionByResolveState(firResolveState) return createAnalysisSessionByResolveState(firResolveState)
} }
@@ -9,8 +9,8 @@ import com.jetbrains.rd.util.getOrCreate
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.resolve.calls.ImplicitReceiverValue import org.jetbrains.kotlin.fir.resolve.calls.ImplicitReceiverValue
import org.jetbrains.kotlin.idea.fir.low.level.api.api.LowLevelFirApiFacade
import org.jetbrains.kotlin.idea.fir.low.level.api.api.LowLevelFirApiFacadeForCompletion import org.jetbrains.kotlin.idea.fir.low.level.api.api.LowLevelFirApiFacadeForCompletion
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getFirFile
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFirOfType import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFirOfType
import org.jetbrains.kotlin.idea.fir.low.level.api.resolver.ResolutionParameters import org.jetbrains.kotlin.idea.fir.low.level.api.resolver.ResolutionParameters
import org.jetbrains.kotlin.idea.fir.low.level.api.resolver.SingleCandidateResolutionMode import org.jetbrains.kotlin.idea.fir.low.level.api.resolver.SingleCandidateResolutionMode
@@ -69,7 +69,7 @@ internal class KtFirCompletionCandidateChecker(
nameExpression: KtSimpleNameExpression, nameExpression: KtSimpleNameExpression,
possibleExplicitReceiver: KtExpression?, possibleExplicitReceiver: KtExpression?,
): Boolean { ): Boolean {
val file = LowLevelFirApiFacade.getFirFile(originalFile, firResolveState) val file = originalFile.getFirFile(firResolveState)
val explicitReceiverExpression = possibleExplicitReceiver?.getOrBuildFirOfType<FirExpression>(firResolveState) val explicitReceiverExpression = possibleExplicitReceiver?.getOrBuildFirOfType<FirExpression>(firResolveState)
val resolver = SingleCandidateResolver(firResolveState.rootModuleSession, file) val resolver = SingleCandidateResolver(firResolveState.rootModuleSession, file)
val implicitReceivers = getImplicitReceivers(originalFile, file, nameExpression) val implicitReceivers = getImplicitReceivers(originalFile, file, nameExpression)
@@ -6,7 +6,8 @@
package org.jetbrains.kotlin.idea.frontend.api.fir.components package org.jetbrains.kotlin.idea.frontend.api.fir.components
import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.idea.fir.low.level.api.api.LowLevelFirApiFacade import org.jetbrains.kotlin.idea.fir.low.level.api.api.collectDiagnosticsForFile
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getDiagnosticsFor
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.components.KtDiagnosticProvider import org.jetbrains.kotlin.idea.frontend.api.components.KtDiagnosticProvider
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
@@ -19,9 +20,9 @@ internal class KtFirDiagnosticProvider(
override val token: ValidityToken, override val token: ValidityToken,
) : KtDiagnosticProvider(), KtFirAnalysisSessionComponent { ) : KtDiagnosticProvider(), KtFirAnalysisSessionComponent {
override fun getDiagnosticsForElement(element: KtElement): Collection<Diagnostic> = withValidityAssertion { override fun getDiagnosticsForElement(element: KtElement): Collection<Diagnostic> = withValidityAssertion {
LowLevelFirApiFacade.getDiagnosticsFor(element, firResolveState) getDiagnosticsFor(element, firResolveState)
} }
override fun collectDiagnosticsForFile(ktFile: KtFile): Collection<Diagnostic> = override fun collectDiagnosticsForFile(ktFile: KtFile): Collection<Diagnostic> =
LowLevelFirApiFacade.collectDiagnosticsForFile(ktFile, firResolveState) ktFile.collectDiagnosticsForFile(firResolveState)
} }
@@ -14,8 +14,8 @@ import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.impl.* import org.jetbrains.kotlin.fir.scopes.impl.*
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
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.LowLevelFirApiFacadeForCompletion import org.jetbrains.kotlin.idea.fir.low.level.api.api.LowLevelFirApiFacadeForCompletion
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getFirFile
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
@@ -137,7 +137,7 @@ internal class KtFirScopeProvider(
ktFile: KtFile, ktFile: KtFile,
positionInFakeFile: KtElement positionInFakeFile: KtElement
): LowLevelFirApiFacadeForCompletion.FirCompletionContext { ): LowLevelFirApiFacadeForCompletion.FirCompletionContext {
val firFile = LowLevelFirApiFacade.getFirFile(ktFile, firResolveState) val firFile = ktFile.getFirFile(firResolveState)
val declarationContext = EnclosingDeclarationContext.detect(ktFile, positionInFakeFile) val declarationContext = EnclosingDeclarationContext.detect(ktFile, positionInFakeFile)
return declarationContext.buildCompletionContext(firFile, firResolveState) return declarationContext.buildCompletionContext(firFile, firResolveState)
@@ -9,8 +9,8 @@ import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
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.getOrBuildFirOfType import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFirOfType
import org.jetbrains.kotlin.idea.fir.low.level.api.api.withFirDeclarationOfType
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
@@ -33,68 +33,68 @@ internal class KtFirSymbolProvider(
private val firSymbolProvider by weakRef(firSymbolProvider) private val firSymbolProvider by weakRef(firSymbolProvider)
override fun getParameterSymbol(psi: KtParameter): KtParameterSymbol = withValidityAssertion { override fun getParameterSymbol(psi: KtParameter): KtParameterSymbol = withValidityAssertion {
LowLevelFirApiFacade.withFirDeclarationOfType<FirValueParameter, KtParameterSymbol>(psi, resolveState) { psi.withFirDeclarationOfType<FirValueParameter, KtParameterSymbol>(resolveState) {
firSymbolBuilder.buildParameterSymbol(it) firSymbolBuilder.buildParameterSymbol(it)
} }
} }
override fun getFunctionSymbol(psi: KtNamedFunction): KtFunctionSymbol = withValidityAssertion { override fun getFunctionSymbol(psi: KtNamedFunction): KtFunctionSymbol = withValidityAssertion {
LowLevelFirApiFacade.withFirDeclarationOfType<FirSimpleFunction, KtFunctionSymbol>(psi, resolveState) { psi.withFirDeclarationOfType<FirSimpleFunction, KtFunctionSymbol>(resolveState) {
firSymbolBuilder.buildFunctionSymbol(it) firSymbolBuilder.buildFunctionSymbol(it)
} }
} }
override fun getConstructorSymbol(psi: KtConstructor<*>): KtConstructorSymbol = withValidityAssertion { override fun getConstructorSymbol(psi: KtConstructor<*>): KtConstructorSymbol = withValidityAssertion {
LowLevelFirApiFacade.withFirDeclarationOfType<FirConstructor, KtConstructorSymbol>(psi, resolveState) { psi.withFirDeclarationOfType<FirConstructor, KtConstructorSymbol>(resolveState) {
firSymbolBuilder.buildConstructorSymbol(it) firSymbolBuilder.buildConstructorSymbol(it)
} }
} }
override fun getTypeParameterSymbol(psi: KtTypeParameter): KtTypeParameterSymbol = withValidityAssertion { override fun getTypeParameterSymbol(psi: KtTypeParameter): KtTypeParameterSymbol = withValidityAssertion {
LowLevelFirApiFacade.withFirDeclarationOfType<FirTypeParameter, KtTypeParameterSymbol>(psi, resolveState) { psi.withFirDeclarationOfType<FirTypeParameter, KtTypeParameterSymbol>(resolveState) {
firSymbolBuilder.buildTypeParameterSymbol(it) firSymbolBuilder.buildTypeParameterSymbol(it)
} }
} }
override fun getTypeAliasSymbol(psi: KtTypeAlias): KtTypeAliasSymbol = withValidityAssertion { override fun getTypeAliasSymbol(psi: KtTypeAlias): KtTypeAliasSymbol = withValidityAssertion {
LowLevelFirApiFacade.withFirDeclarationOfType<FirTypeAlias, KtTypeAliasSymbol>(psi, resolveState) { psi.withFirDeclarationOfType<FirTypeAlias, KtTypeAliasSymbol>(resolveState) {
firSymbolBuilder.buildTypeAliasSymbol(it) firSymbolBuilder.buildTypeAliasSymbol(it)
} }
} }
override fun getEnumEntrySymbol(psi: KtEnumEntry): KtEnumEntrySymbol = withValidityAssertion { override fun getEnumEntrySymbol(psi: KtEnumEntry): KtEnumEntrySymbol = withValidityAssertion {
LowLevelFirApiFacade.withFirDeclarationOfType<FirEnumEntry, KtEnumEntrySymbol>(psi, resolveState) { psi.withFirDeclarationOfType<FirEnumEntry, KtEnumEntrySymbol>(resolveState) {
firSymbolBuilder.buildEnumEntrySymbol(it) firSymbolBuilder.buildEnumEntrySymbol(it)
} }
} }
override fun getAnonymousFunctionSymbol(psi: KtNamedFunction): KtAnonymousFunctionSymbol = withValidityAssertion { override fun getAnonymousFunctionSymbol(psi: KtNamedFunction): KtAnonymousFunctionSymbol = withValidityAssertion {
LowLevelFirApiFacade.withFirDeclarationOfType<FirSimpleFunction, KtFunctionSymbol>(psi, resolveState) { psi.withFirDeclarationOfType<FirSimpleFunction, KtFunctionSymbol>(resolveState) {
firSymbolBuilder.buildFunctionSymbol(it) firSymbolBuilder.buildFunctionSymbol(it)
} }
firSymbolBuilder.buildAnonymousFunctionSymbol(psi.getOrBuildFirOfType(resolveState)) firSymbolBuilder.buildAnonymousFunctionSymbol(psi.getOrBuildFirOfType(resolveState))
} }
override fun getAnonymousFunctionSymbol(psi: KtLambdaExpression): KtAnonymousFunctionSymbol = withValidityAssertion { override fun getAnonymousFunctionSymbol(psi: KtLambdaExpression): KtAnonymousFunctionSymbol = withValidityAssertion {
LowLevelFirApiFacade.withFirDeclarationOfType<FirAnonymousFunction, KtAnonymousFunctionSymbol>(psi, resolveState) { psi.withFirDeclarationOfType<FirAnonymousFunction, KtAnonymousFunctionSymbol>(resolveState) {
firSymbolBuilder.buildAnonymousFunctionSymbol(it) firSymbolBuilder.buildAnonymousFunctionSymbol(it)
} }
} }
override fun getVariableSymbol(psi: KtProperty): KtVariableSymbol = withValidityAssertion { override fun getVariableSymbol(psi: KtProperty): KtVariableSymbol = withValidityAssertion {
LowLevelFirApiFacade.withFirDeclarationOfType<FirProperty, KtVariableSymbol>(psi, resolveState) { psi.withFirDeclarationOfType<FirProperty, KtVariableSymbol>(resolveState) {
firSymbolBuilder.buildVariableSymbol(it) firSymbolBuilder.buildVariableSymbol(it)
} }
} }
override fun getClassOrObjectSymbol(psi: KtClassOrObject): KtClassOrObjectSymbol = withValidityAssertion { override fun getClassOrObjectSymbol(psi: KtClassOrObject): KtClassOrObjectSymbol = withValidityAssertion {
LowLevelFirApiFacade.withFirDeclarationOfType<FirRegularClass, KtClassOrObjectSymbol>(psi, resolveState) { psi.withFirDeclarationOfType<FirRegularClass, KtClassOrObjectSymbol>(resolveState) {
firSymbolBuilder.buildClassSymbol(it) firSymbolBuilder.buildClassSymbol(it)
} }
} }
override fun getPropertyAccessorSymbol(psi: KtPropertyAccessor): KtPropertyAccessorSymbol = withValidityAssertion { override fun getPropertyAccessorSymbol(psi: KtPropertyAccessor): KtPropertyAccessorSymbol = withValidityAssertion {
LowLevelFirApiFacade.withFirDeclarationOfType<FirPropertyAccessor, KtPropertyAccessorSymbol>(psi, resolveState) { psi.withFirDeclarationOfType<FirPropertyAccessor, KtPropertyAccessorSymbol>(resolveState) {
firSymbolBuilder.buildPropertyAccessorSymbol(it) firSymbolBuilder.buildPropertyAccessorSymbol(it)
} }
} }
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.utils
import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
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.resolvedFirToPhase
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.idea.frontend.api.assertIsValid import org.jetbrains.kotlin.idea.frontend.api.assertIsValid
@@ -24,7 +24,7 @@ internal class FirRefWithValidityCheck<D : FirDeclaration>(fir: D, resolveState:
?: throw EntityWasGarbageCollectedException("FirElement") ?: throw EntityWasGarbageCollectedException("FirElement")
val resolveState = resolveStateWeakRef.get() val resolveState = resolveStateWeakRef.get()
?: throw EntityWasGarbageCollectedException("FirModuleResolveState") ?: throw EntityWasGarbageCollectedException("FirModuleResolveState")
LowLevelFirApiFacade.resolvedFirToPhase(fir, phase, resolveState) fir.resolvedFirToPhase(phase, resolveState)
return resolveState.withFirDeclaration(fir) { action(it) } return resolveState.withFirDeclaration(fir) { action(it) }
} }
@@ -34,7 +34,7 @@ internal class FirRefWithValidityCheck<D : FirDeclaration>(fir: D, resolveState:
?: throw EntityWasGarbageCollectedException("FirElement") ?: throw EntityWasGarbageCollectedException("FirElement")
val resolveState = resolveStateWeakRef.get() val resolveState = resolveStateWeakRef.get()
?: throw EntityWasGarbageCollectedException("FirModuleResolveState") ?: throw EntityWasGarbageCollectedException("FirModuleResolveState")
LowLevelFirApiFacade.resolvedFirToPhase(fir, FirResolvePhase.BODY_RESOLVE, resolveState) fir.resolvedFirToPhase(FirResolvePhase.BODY_RESOLVE, resolveState)
return action(resolveState.withFirDeclaration(fir) { it }) return action(resolveState.withFirDeclaration(fir) { it })
} }
@@ -8,7 +8,8 @@ package org.jetbrains.kotlin.idea.fir
import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.io.FileUtil
import com.intellij.rt.execution.junit.FileComparisonFailure import com.intellij.rt.execution.junit.FileComparisonFailure
import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirFunction
import org.jetbrains.kotlin.idea.fir.low.level.api.api.LowLevelFirApiFacade import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFirOfType
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getResolveState
import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtFunction import org.jetbrains.kotlin.psi.KtFunction
@@ -19,9 +20,9 @@ abstract class AbstractKtDeclarationAndFirDeclarationEqualityChecker : KotlinLig
protected fun doTest(path: String) { protected fun doTest(path: String) {
val file = File(path) val file = File(path)
val ktFile = myFixture.configureByText(file.name, FileUtil.loadFile(file)) as KtFile val ktFile = myFixture.configureByText(file.name, FileUtil.loadFile(file)) as KtFile
val resolveState = LowLevelFirApiFacade.getResolveStateFor(ktFile) val resolveState = ktFile.getResolveState()
ktFile.forEachDescendantOfType<KtFunction> { ktFunction -> ktFile.forEachDescendantOfType<KtFunction> { ktFunction ->
val firFunction = LowLevelFirApiFacade.getOrBuildFirFor(ktFunction, resolveState) as FirFunction<*> val firFunction = ktFunction.getOrBuildFirOfType<FirFunction<*>>(resolveState)
if (!KtDeclarationAndFirDeclarationEqualityChecker.representsTheSameDeclaration(ktFunction, firFunction)) { if (!KtDeclarationAndFirDeclarationEqualityChecker.representsTheSameDeclaration(ktFunction, firFunction)) {
throw FileComparisonFailure( throw FileComparisonFailure(
/* message= */ null, /* message= */ null,