[FIR] Add symbol to all declarations. Get rid of FirSymbolOwner

This commit is contained in:
Dmitriy Novozhilov
2021-06-20 11:42:52 +03:00
parent 39cd1c8504
commit b3e5c6e079
254 changed files with 1305 additions and 1297 deletions
@@ -13,7 +13,7 @@ abstract class ContextByDesignationCollector<C : Any>(private val designation: F
private val designationState = FirDesignationState(designation)
protected abstract fun getCurrentContext(): C
protected abstract fun goToNestedDeclaration(declaration: FirDeclaration)
protected abstract fun goToNestedDeclaration(declaration: FirDeclaration<*>)
fun getCollectedContext(): C {
return context
@@ -47,14 +47,14 @@ private class FirDesignationState(val designation: FirDeclarationDesignation) {
fun canGoNext(): Boolean = currentIndex < designation.path.size
val currentDeclarationIfPresent: FirDeclaration?
val currentDeclarationIfPresent: FirDeclaration<*>?
get() = when (currentIndex) {
in designation.path.indices -> designation.path[currentIndex]
designation.path.size -> designation.declaration
else -> null
}
val currentDeclaration: FirDeclaration
val currentDeclaration: FirDeclaration<*>
get() = currentDeclarationIfPresent
?: error("Went inside target declaration")
@@ -73,4 +73,4 @@ private class FirDesignationState(val designation: FirDeclarationDesignation) {
throw IndexOutOfBoundsException()
}
}
}
}
@@ -59,13 +59,13 @@ internal class FirModuleResolveStateDepended(
override fun getOrBuildFirFile(ktFile: KtFile): FirFile =
originalState.getOrBuildFirFile(ktFile)
override fun <D : FirDeclaration> resolveFirToPhase(declaration: D, toPhase: FirResolvePhase): D =
override fun <D : FirDeclaration<*>> resolveFirToPhase(declaration: D, toPhase: FirResolvePhase): D =
originalState.resolveFirToPhase(declaration, toPhase)
override fun <D : FirDeclaration> resolveFirToResolveType(declaration: D, type: ResolveType): D =
override fun <D : FirDeclaration<*>> resolveFirToResolveType(declaration: D, type: ResolveType): D =
originalState.resolveFirToResolveType(declaration, type)
override fun tryGetCachedFirFile(declaration: FirDeclaration, cache: ModuleFileCache): FirFile? {
override fun tryGetCachedFirFile(declaration: FirDeclaration<*>, cache: ModuleFileCache): FirFile? {
val ktFile = declaration.containingKtFileIfAny ?: return null
cache.getCachedFirFile(ktFile)?.let { return it }
ktFile.originalKtFile?.let(cache::getCachedFirFile)?.let { return it }
@@ -79,11 +79,11 @@ internal class FirModuleResolveStateDepended(
TODO("Diagnostics are not implemented for depended state")
@OptIn(InternalForInline::class)
override fun findSourceFirDeclaration(ktDeclaration: KtLambdaExpression): FirDeclaration =
override fun findSourceFirDeclaration(ktDeclaration: KtLambdaExpression): FirDeclaration<*> =
originalState.findSourceFirDeclaration(ktDeclaration)
@OptIn(InternalForInline::class)
override fun findSourceFirDeclaration(ktDeclaration: KtDeclaration): FirDeclaration =
override fun findSourceFirDeclaration(ktDeclaration: KtDeclaration): FirDeclaration<*> =
originalState.findSourceFirDeclaration(ktDeclaration)
@OptIn(InternalForInline::class)
@@ -11,10 +11,12 @@ import org.jetbrains.kotlin.analyzer.ModuleSourceInfoBase
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirPsiDiagnostic
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.realPsi
import org.jetbrains.kotlin.fir.resolve.symbolProvider
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.symbolProvider
import org.jetbrains.kotlin.idea.fir.low.level.api.annotations.InternalForInline
import org.jetbrains.kotlin.idea.fir.low.level.api.api.DiagnosticCheckerFilter
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
@@ -31,8 +33,10 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve.lazyResolveDecla
import org.jetbrains.kotlin.idea.fir.low.level.api.providers.firIdeProvider
import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirIdeSessionProvider
import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirIdeSourcesSession
import org.jetbrains.kotlin.idea.fir.low.level.api.util.*
import org.jetbrains.kotlin.idea.fir.low.level.api.util.FirDeclarationForCompiledElementSearcher
import org.jetbrains.kotlin.idea.fir.low.level.api.util.FirElementFinder
import org.jetbrains.kotlin.idea.fir.low.level.api.util.findSourceNonLocalFirDeclaration
import org.jetbrains.kotlin.idea.fir.low.level.api.util.getElementTextInContext
import org.jetbrains.kotlin.psi.*
internal class FirModuleResolveStateImpl(
@@ -70,7 +74,7 @@ internal class FirModuleResolveStateImpl(
override fun getOrBuildFirFile(ktFile: KtFile): FirFile =
firFileBuilder.buildRawFirFileWithCaching(ktFile, rootModuleSession.cache, preferLazyBodies = false)
override fun tryGetCachedFirFile(declaration: FirDeclaration, cache: ModuleFileCache): FirFile? =
override fun tryGetCachedFirFile(declaration: FirDeclaration<*>, cache: ModuleFileCache): FirFile? =
cache.getContainerFirFile(declaration)
override fun getDiagnostics(element: KtElement, filter: DiagnosticCheckerFilter): List<FirPsiDiagnostic> =
@@ -80,21 +84,20 @@ internal class FirModuleResolveStateImpl(
diagnosticsCollector.collectDiagnosticsForFile(ktFile, filter)
@OptIn(InternalForInline::class)
override fun findSourceFirDeclaration(ktDeclaration: KtDeclaration): FirDeclaration =
override fun findSourceFirDeclaration(ktDeclaration: KtDeclaration): FirDeclaration<*> =
findSourceFirDeclarationByExpression(ktDeclaration)
@OptIn(InternalForInline::class)
override fun findSourceFirDeclaration(ktDeclaration: KtLambdaExpression): FirDeclaration =
override fun findSourceFirDeclaration(ktDeclaration: KtLambdaExpression): FirDeclaration<*> =
findSourceFirDeclarationByExpression(ktDeclaration)
/**
* [ktDeclaration] should be either [KtDeclaration] or [KtLambdaExpression]
*/
private fun findSourceFirDeclarationByExpression(ktDeclaration: KtExpression): FirDeclaration {
private fun findSourceFirDeclarationByExpression(ktDeclaration: KtExpression): FirDeclaration<*> {
require(ktDeclaration.getModuleInfo() is ModuleSourceInfoBase) {
"Declaration should have ModuleSourceInfo, instead it had ${ktDeclaration.getModuleInfo()}"
}
val nonLocalNamedDeclaration = ktDeclaration.getNonLocalContainingOrThisDeclaration()
?: error("Declaration should have non-local container${ktDeclaration.getElementTextInContext()}")
@@ -113,7 +116,7 @@ internal class FirModuleResolveStateImpl(
toPhase = FirResolvePhase.BODY_RESOLVE,
checkPCE = false, /*TODO*/
)
val firDeclaration = FirElementFinder.findElementIn<FirDeclaration>(nonLocalFirForNamedDeclaration) { firDeclaration ->
val firDeclaration = FirElementFinder.findElementIn<FirDeclaration<*>>(nonLocalFirForNamedDeclaration) { firDeclaration ->
when (val realPsi = firDeclaration.realPsi) {
is KtObjectLiteralExpression -> realPsi.objectDeclaration == ktDeclaration
is KtFunctionLiteral -> realPsi.parent == ktDeclaration
@@ -125,7 +128,7 @@ internal class FirModuleResolveStateImpl(
}
@OptIn(InternalForInline::class)
override fun findSourceFirCompiledDeclaration(ktDeclaration: KtDeclaration): FirDeclaration {
override fun findSourceFirCompiledDeclaration(ktDeclaration: KtDeclaration): FirDeclaration<*> {
require(ktDeclaration.containingKtFile.isCompiled) {
"This method will only work on compiled declarations, but this declaration is not compiled: ${ktDeclaration.getElementTextInContext()}"
}
@@ -142,7 +145,7 @@ internal class FirModuleResolveStateImpl(
}
}
override fun <D : FirDeclaration> resolveFirToPhase(declaration: D, toPhase: FirResolvePhase): D {
override fun <D : FirDeclaration<*>> resolveFirToPhase(declaration: D, toPhase: FirResolvePhase): D {
if (toPhase == FirResolvePhase.RAW_FIR) return declaration
val fileCache = when (val session = declaration.moduleData.session) {
is FirIdeSourcesSession -> session.cache
@@ -158,7 +161,7 @@ internal class FirModuleResolveStateImpl(
return declaration
}
override fun <D : FirDeclaration> resolveFirToResolveType(declaration: D, type: ResolveType): D {
override fun <D : FirDeclaration<*>> resolveFirToResolveType(declaration: D, type: ResolveType): D {
if (type == ResolveType.NoResolve) return declaration
val fileCache = when (val session = declaration.moduleData.session) {
is FirIdeSourcesSession -> session.cache
@@ -65,8 +65,8 @@ internal object DeclarationCopyBuilder {
}
private fun FirDeclarationBuilder.initDeclaration(
originalDeclaration: FirDeclaration,
builtDeclaration: FirDeclaration,
originalDeclaration: FirDeclaration<*>,
builtDeclaration: FirDeclaration<*>,
) {
resolvePhase = minOf(originalDeclaration.resolvePhase, FirResolvePhase.DECLARATIONS)
source = builtDeclaration.source
@@ -15,14 +15,14 @@ import org.jetbrains.kotlin.fir.resolve.toFirRegularClass
import org.jetbrains.kotlin.idea.fir.low.level.api.util.getContainingFile
class FirDeclarationDesignationWithFile(
path: List<FirDeclaration>,
declaration: FirDeclaration,
path: List<FirDeclaration<*>>,
declaration: FirDeclaration<*>,
val firFile: FirFile
) : FirDeclarationDesignation(
path,
declaration,
) {
fun toSequenceWithFile(includeTarget: Boolean): Sequence<FirDeclaration> = sequence {
fun toSequenceWithFile(includeTarget: Boolean): Sequence<FirDeclaration<*>> = sequence {
yield(firFile)
yieldAll(path)
if (includeTarget) yield(declaration)
@@ -30,20 +30,20 @@ class FirDeclarationDesignationWithFile(
}
open class FirDeclarationDesignation(
val path: List<FirDeclaration>,
val declaration: FirDeclaration,
val path: List<FirDeclaration<*>>,
val declaration: FirDeclaration<*>,
) {
fun toSequence(includeTarget: Boolean): Sequence<FirDeclaration> = sequence {
fun toSequence(includeTarget: Boolean): Sequence<FirDeclaration<*>> = sequence {
yieldAll(path)
if (includeTarget) yield(declaration)
}
}
private fun FirRegularClass.collectForNonLocal(): List<FirDeclaration> {
private fun FirRegularClass.collectForNonLocal(): List<FirDeclaration<*>> {
require(!isLocal)
val firProvider = moduleData.session.firProvider
var containingClassId = classId.outerClassId
val designation = mutableListOf<FirDeclaration>(this)
val designation = mutableListOf<FirDeclaration<*>>(this)
while (containingClassId != null) {
val currentClass = firProvider.getFirClassifierByFqName(containingClassId) ?: break
designation.add(currentClass)
@@ -52,7 +52,7 @@ private fun FirRegularClass.collectForNonLocal(): List<FirDeclaration> {
return designation
}
private fun collectDesignationPath(declaration: FirDeclaration): List<FirDeclaration>? {
private fun collectDesignationPath(declaration: FirDeclaration<*>): List<FirDeclaration<*>>? {
val containingClass = when (declaration) {
is FirCallableDeclaration<*> -> {
if (declaration.symbol.callableId.isLocal) return null
@@ -79,27 +79,27 @@ private fun collectDesignationPath(declaration: FirDeclaration): List<FirDeclara
return if (!containingClass.isLocal) containingClass.collectForNonLocal().asReversed() else null
}
fun FirDeclaration.collectDesignation(firFile: FirFile): FirDeclarationDesignationWithFile =
fun FirDeclaration<*>.collectDesignation(firFile: FirFile): FirDeclarationDesignationWithFile =
tryCollectDesignation(firFile) ?: error("No designation of local declaration ${this.render()}")
fun FirDeclaration.collectDesignation(): FirDeclarationDesignation =
fun FirDeclaration<*>.collectDesignation(): FirDeclarationDesignation =
tryCollectDesignation() ?: error("No designation of local declaration ${this.render()}")
fun FirDeclaration.collectDesignationWithFile(): FirDeclarationDesignationWithFile =
fun FirDeclaration<*>.collectDesignationWithFile(): FirDeclarationDesignationWithFile =
tryCollectDesignationWithFile() ?: error("No designation of local declaration ${this.render()}")
fun FirDeclaration.tryCollectDesignation(firFile: FirFile): FirDeclarationDesignationWithFile? =
fun FirDeclaration<*>.tryCollectDesignation(firFile: FirFile): FirDeclarationDesignationWithFile? =
collectDesignationPath(this)?.let {
FirDeclarationDesignationWithFile(it, this, firFile)
}
fun FirDeclaration.tryCollectDesignation(): FirDeclarationDesignation? =
fun FirDeclaration<*>.tryCollectDesignation(): FirDeclarationDesignation? =
collectDesignationPath(this)?.let {
FirDeclarationDesignation(it, this)
}
fun FirDeclaration.tryCollectDesignationWithFile(): FirDeclarationDesignationWithFile? {
fun FirDeclaration<*>.tryCollectDesignationWithFile(): FirDeclarationDesignationWithFile? {
val path = collectDesignationPath(this) ?: return null
val firFile = getContainingFile() ?: return null
return FirDeclarationDesignationWithFile(path, this, firFile)
}
}
@@ -44,13 +44,13 @@ abstract class FirModuleResolveState {
/**
* Try get [FirFile] from the cache in undefined phase
*/
internal abstract fun tryGetCachedFirFile(declaration: FirDeclaration, cache: ModuleFileCache): FirFile?
internal abstract fun tryGetCachedFirFile(declaration: FirDeclaration<*>, cache: ModuleFileCache): FirFile?
internal abstract fun getDiagnostics(element: KtElement, filter: DiagnosticCheckerFilter): List<FirPsiDiagnostic>
internal abstract fun collectDiagnosticsForFile(ktFile: KtFile, filter: DiagnosticCheckerFilter): Collection<FirPsiDiagnostic>
internal inline fun <D : FirDeclaration, R> withLock(declaration: D, declarationLockType: DeclarationLockType, action: (D) -> R): R {
internal inline fun <D : FirDeclaration<*>, R> withLock(declaration: D, declarationLockType: DeclarationLockType, action: (D) -> R): R {
val originalDeclaration = (declaration as? FirCallableDeclaration<*>)?.unwrapFakeOverrides() ?: declaration
val session = originalDeclaration.moduleData.session
return when {
@@ -67,12 +67,12 @@ abstract class FirModuleResolveState {
@InternalForInline
abstract fun findSourceFirDeclaration(
ktDeclaration: KtDeclaration,
): FirDeclaration
): FirDeclaration<*>
@InternalForInline
abstract fun findSourceFirDeclaration(
ktDeclaration: KtLambdaExpression,
): FirDeclaration
): FirDeclaration<*>
/**
* Looks for compiled non-local [ktDeclaration] declaration by querying its classId/callableId from the SymbolProvider.
@@ -82,10 +82,10 @@ abstract class FirModuleResolveState {
@InternalForInline
abstract fun findSourceFirCompiledDeclaration(
ktDeclaration: KtDeclaration
): FirDeclaration
): FirDeclaration<*>
internal abstract fun <D : FirDeclaration> resolveFirToPhase(declaration: D, toPhase: FirResolvePhase): D
internal abstract fun <D : FirDeclaration<*>> resolveFirToPhase(declaration: D, toPhase: FirResolvePhase): D
internal abstract fun <D : FirDeclaration> resolveFirToResolveType(declaration: D, type: ResolveType): D
internal abstract fun <D : FirDeclaration<*>> resolveFirToResolveType(declaration: D, type: ResolveType): D
}
@@ -43,7 +43,7 @@ fun ModuleInfo.getResolveState(project: Project): FirModuleResolveState =
inline fun <R> KtDeclaration.withFirDeclaration(
resolveState: FirModuleResolveState,
phase: FirResolvePhase = FirResolvePhase.RAW_FIR,
action: (FirDeclaration) -> R
action: (FirDeclaration<*>) -> R
): R {
val firDeclaration = if (containingKtFile.isCompiled) {
resolveState.findSourceFirCompiledDeclaration(this)
@@ -71,7 +71,7 @@ inline fun <R> KtDeclaration.withFirDeclaration(
inline fun <R> KtDeclaration.withFirDeclaration(
resolveState: FirModuleResolveState,
resolveType: ResolveType = ResolveType.NoResolve,
action: (FirDeclaration) -> R
action: (FirDeclaration<*>) -> R
): R {
val firDeclaration = resolveState.findSourceFirDeclaration(this)
firDeclaration.resolvedFirToType(resolveType, resolveState)
@@ -88,7 +88,7 @@ inline fun <R> KtDeclaration.withFirDeclaration(
* Otherwise, some threading problems may arise,
*/
@OptIn(InternalForInline::class)
inline fun <reified F : FirDeclaration, R> KtDeclaration.withFirDeclarationOfType(
inline fun <reified F : FirDeclaration<*>, R> KtDeclaration.withFirDeclarationOfType(
resolveState: FirModuleResolveState,
phase: FirResolvePhase = FirResolvePhase.RAW_FIR,
action: (F) -> R
@@ -106,7 +106,7 @@ inline fun <reified F : FirDeclaration, R> KtDeclaration.withFirDeclarationOfTyp
* Otherwise, some threading problems may arise,
*/
@OptIn(InternalForInline::class)
inline fun <reified F : FirDeclaration, R> KtLambdaExpression.withFirDeclarationOfType(
inline fun <reified F : FirDeclaration<*>, R> KtLambdaExpression.withFirDeclarationOfType(
resolveState: FirModuleResolveState,
action: (F) -> R
): R {
@@ -119,7 +119,7 @@ inline fun <reified F : FirDeclaration, R> KtLambdaExpression.withFirDeclaration
* Executes [action] with given [FirDeclaration] under read action, so resolve **is not possible** inside [action]
* [FirDeclaration] passed to [action] will be resolved at least to [phase] when executing [action] on it
*/
fun <D : FirDeclaration, R> D.withFirDeclaration(
fun <D : FirDeclaration<*>, R> D.withFirDeclaration(
resolveState: FirModuleResolveState,
phase: FirResolvePhase = FirResolvePhase.RAW_FIR,
action: (D) -> R,
@@ -132,7 +132,7 @@ fun <D : FirDeclaration, R> D.withFirDeclaration(
* Executes [action] with given [FirDeclaration] under read action, so resolve **is not possible** inside [action]
* [FirDeclaration] passed to [action] will be resolved at least to [phase] when executing [action] on it
*/
fun <D : FirDeclaration, R> D.withFirDeclaration(
fun <D : FirDeclaration<*>, R> D.withFirDeclaration(
type: ResolveType,
resolveState: FirModuleResolveState,
action: (D) -> R,
@@ -144,7 +144,7 @@ fun <D : FirDeclaration, R> D.withFirDeclaration(
/**
* Executes [action] with given [FirDeclaration] under write lock, so resolve **is possible** inside [action]
*/
fun <D : FirDeclaration, R> D.withFirDeclarationInWriteLock(
fun <D : FirDeclaration<*>, R> D.withFirDeclarationInWriteLock(
resolveState: FirModuleResolveState,
phase: FirResolvePhase = FirResolvePhase.RAW_FIR,
action: (D) -> R,
@@ -156,7 +156,7 @@ fun <D : FirDeclaration, R> D.withFirDeclarationInWriteLock(
/**
* Executes [action] with given [FirDeclaration] under write lock, so resolve **is possible** inside [action]
*/
fun <D : FirDeclaration, R> D.withFirDeclarationInWriteLock(
fun <D : FirDeclaration<*>, R> D.withFirDeclarationInWriteLock(
resolveState: FirModuleResolveState,
resolveType: ResolveType = ResolveType.BodyResolveWithChildren,
action: (D) -> R,
@@ -187,7 +187,7 @@ fun KtFile.collectDiagnosticsForFile(
*
* Should not be called form [withFirDeclaration], [withFirDeclarationOfType] functions, as it it may cause deadlock
*/
fun <D : FirDeclaration> D.resolvedFirToPhase(
fun <D : FirDeclaration<*>> D.resolvedFirToPhase(
phase: FirResolvePhase,
resolveState: FirModuleResolveState
): D =
@@ -198,7 +198,7 @@ fun <D : FirDeclaration> D.resolvedFirToPhase(
*
* Should not be called form [withFirDeclaration], [withFirDeclarationOfType] functions, as it it may cause deadlock
*/
fun <D : FirDeclaration> D.resolvedFirToType(
fun <D : FirDeclaration<*>> D.resolvedFirToType(
type: ResolveType,
resolveState: FirModuleResolveState
): D =
@@ -235,7 +235,7 @@ object LowLevelFirApiFacadeForResolveOnAir {
}
val originalDeclaration = nonLocalDeclaration.getOrBuildFir(state)
check(originalDeclaration is FirDeclaration) { "Invalid original declaration type ${originalDeclaration::class.simpleName}" }
check(originalDeclaration is FirDeclaration<*>) { "Invalid original declaration type ${originalDeclaration::class.simpleName}" }
val originalDesignation = originalDeclaration.collectDesignation()
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclaration
abstract class BeforeElementDiagnosticCollectionHandler: FirSessionComponent {
open fun beforeCollectingForElement(element: FirElement) {}
open fun beforeGoingNestedDeclaration(declaration: FirDeclaration, context: PersistentCheckerContext) {}
open fun beforeGoingNestedDeclaration(declaration: FirDeclaration<*>, context: PersistentCheckerContext) {}
}
val FirSession.beforeElementDiagnosticCollectionHandler: BeforeElementDiagnosticCollectionHandler? by FirSession.nullableSessionComponentAccessor()
@@ -24,7 +24,7 @@ internal abstract class FileStructureElementDiagnosticRetriever {
}
internal class SingleNonLocalDeclarationDiagnosticRetriever(
private val structureElementDeclaration: FirDeclaration
private val structureElementDeclaration: FirDeclaration<*>
) : FileStructureElementDiagnosticRetriever() {
override fun retrieve(
firFile: FirFile,
@@ -41,13 +41,13 @@ internal class SingleNonLocalDeclarationDiagnosticRetriever(
}
private class Visitor(
private val structureElementDeclaration: FirDeclaration,
private val structureElementDeclaration: FirDeclaration<*>,
context: PersistentCheckerContext,
components: List<AbstractDiagnosticCollectorComponent>
) : FirIdeDiagnosticVisitor(context, components) {
private var insideAlwaysVisitableDeclarations = 0
override fun shouldVisitDeclaration(declaration: FirDeclaration): Boolean {
override fun shouldVisitDeclaration(declaration: FirDeclaration<*>): Boolean {
if (declaration.shouldVisitWithNestedDeclarations()) {
insideAlwaysVisitableDeclarations++
}
@@ -64,7 +64,7 @@ internal class SingleNonLocalDeclarationDiagnosticRetriever(
}
}
private fun FirDeclaration.shouldVisitWithNestedDeclarations(): Boolean {
private fun FirDeclaration<*>.shouldVisitWithNestedDeclarations(): Boolean {
if (shouldDiagnosticsAlwaysBeCheckedOn(this)) return true
return when (this) {
is FirAnonymousInitializer -> true
@@ -75,7 +75,7 @@ internal class SingleNonLocalDeclarationDiagnosticRetriever(
}
}
override fun onDeclarationExit(declaration: FirDeclaration) {
override fun onDeclarationExit(declaration: FirDeclaration<*>) {
if (declaration.shouldVisitWithNestedDeclarations()) {
insideAlwaysVisitableDeclarations--
}
@@ -17,7 +17,7 @@ internal class FileStructureElementDiagnosticsCollector private constructor(priv
}
fun collectForStructureElement(
firDeclaration: FirDeclaration,
firDeclaration: FirDeclaration<*>,
createVisitor: (components: List<AbstractDiagnosticCollectorComponent>) -> CheckerRunningDiagnosticCollectorVisitor,
): FileStructureElementDiagnosticList {
val reporter = FirIdeDiagnosticReporter()
@@ -19,7 +19,7 @@ internal open class FirIdeDiagnosticVisitor(
private val beforeElementDiagnosticCollectionHandler = context.session.beforeElementDiagnosticCollectionHandler
override fun visitNestedElements(element: FirElement) {
if (element is FirDeclaration) {
if (element is FirDeclaration<*>) {
beforeElementDiagnosticCollectionHandler?.beforeGoingNestedDeclaration(element, context)
}
super.visitNestedElements(element)
@@ -32,4 +32,4 @@ internal open class FirIdeDiagnosticVisitor(
element.accept(it, context)
}
}
}
}
@@ -8,7 +8,10 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.diagnostics.fir
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.analysis.checkers.context.PersistentCheckerContext
import org.jetbrains.kotlin.fir.analysis.collectors.AbstractDiagnosticCollectorVisitor
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.renderWithType
import org.jetbrains.kotlin.fir.resolve.SessionHolder
import org.jetbrains.kotlin.idea.fir.low.level.api.ContextByDesignationCollector
@@ -24,13 +27,13 @@ private class ContextCollectingDiagnosticCollectorVisitor private constructor(
private val contextCollector = object : ContextByDesignationCollector<PersistentCheckerContext>(designation) {
override fun getCurrentContext(): PersistentCheckerContext = context
override fun goToNestedDeclaration(declaration: FirDeclaration) {
override fun goToNestedDeclaration(declaration: FirDeclaration<*>) {
declaration.accept(this@ContextCollectingDiagnosticCollectorVisitor, null)
}
}
override fun visitNestedElements(element: FirElement) {
if (element is FirDeclaration) {
if (element is FirDeclaration<*>) {
contextCollector.nextStep()
} else {
element.accept(this, null)
@@ -52,7 +55,7 @@ internal object PersistenceContextCollector {
fun collectContext(
sessionHolder: SessionHolder,
firFile: FirFile,
declaration: FirDeclaration,
declaration: FirDeclaration<*>,
): PersistentCheckerContext {
val isLocal = when (declaration) {
is FirClassLikeDeclaration<*> -> declaration.symbol.classId.isLocal
@@ -65,4 +68,4 @@ internal object PersistenceContextCollector {
val designation = declaration.collectDesignation(firFile)
return ContextCollectingDiagnosticCollectorVisitor.collect(sessionHolder, designation)
}
}
}
@@ -7,7 +7,10 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.element.builder
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.resolve.ResolutionMode
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator
@@ -56,7 +59,7 @@ class FirIdeDesignatedBodyResolveTransformerForReturnTypeCalculatorImpl(
returnTypeCalculator,
outerBodyResolveContext
) {
private val declarationDesignation = designation.filterIsInstance<FirDeclaration>()
private val declarationDesignation = designation.filterIsInstance<FirDeclaration<*>>()
override fun transformSimpleFunction(
simpleFunction: FirSimpleFunction,
@@ -67,7 +70,7 @@ class FirIdeDesignatedBodyResolveTransformerForReturnTypeCalculatorImpl(
return super.transformSimpleFunction(simpleFunction, data)
}
override fun transformConstructor(constructor: FirConstructor, data: ResolutionMode): FirDeclaration {
override fun transformConstructor(constructor: FirConstructor, data: ResolutionMode): FirConstructor {
val firDesignation = FirDeclarationDesignation(declarationDesignation, constructor)
FirLazyBodiesCalculator.calculateLazyBodyForSecondaryConstructor(firDesignation)
return super.transformConstructor(constructor, data)
@@ -78,4 +81,4 @@ class FirIdeDesignatedBodyResolveTransformerForReturnTypeCalculatorImpl(
FirLazyBodiesCalculator.calculateLazyBodyForProperty(firDesignation)
return super.transformProperty(property, data)
}
}
}
@@ -40,7 +40,7 @@ internal class FirTowerDataContextAllElementsCollector : FirTowerDataContextColl
elementsToContext[closestStatementInBlock] = context
}
override fun addDeclarationContext(declaration: FirDeclaration, context: FirTowerDataContext) {
override fun addDeclarationContext(declaration: FirDeclaration<*>, context: FirTowerDataContext) {
val psi = declaration.psi as? KtElement ?: return
elementsToContext[psi] = context
}
@@ -12,16 +12,13 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.idea.fir.low.level.api.annotations.ThreadSafe
import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.psi.KtFile
import java.util.*
import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.locks.ReentrantLock
import java.util.concurrent.locks.ReentrantReadWriteLock
import org.jetbrains.kotlin.idea.fir.low.level.api.annotations.ThreadSafe
import kotlin.concurrent.withLock
/**
* Caches mapping [KtFile] -> [FirFile] of module [moduleInfo]
@@ -48,13 +45,13 @@ internal abstract class ModuleFileCache {
*/
abstract fun fileCached(file: KtFile, createValue: () -> FirFile): FirFile
abstract fun getContainerFirFile(declaration: FirDeclaration): FirFile?
abstract fun getContainerFirFile(declaration: FirDeclaration<*>): FirFile?
abstract fun getCachedFirFile(ktFile: KtFile): FirFile?
abstract val firFileLockProvider: LockProvider<FirFile>
inline fun <D : FirDeclaration, R> withReadLockOn(declaration: D, action: (D) -> R): R {
inline fun <D : FirDeclaration<*>, R> withReadLockOn(declaration: D, action: (D) -> R): R {
val file = getContainerFirFile(declaration)
?: error("No fir file found for\n${declaration.render()}")
return firFileLockProvider.withReadLock(file) { action(declaration) }
@@ -72,7 +69,7 @@ internal class ModuleFileCacheImpl(override val session: FirSession) : ModuleFil
override fun getCachedFirFile(ktFile: KtFile): FirFile? = ktFileToFirFile[ktFile]
override fun getContainerFirFile(declaration: FirDeclaration): FirFile? {
override fun getContainerFirFile(declaration: FirDeclaration<*>): FirFile? {
val ktFile = declaration.psi?.containingFile as? KtFile ?: return null
return getCachedFirFile(ktFile)
}
@@ -19,7 +19,7 @@ internal object FileElementFactory {
* should be consistent with [isReanalyzableContainer]
*/
fun createFileStructureElement(
firDeclaration: FirDeclaration,
firDeclaration: FirDeclaration<*>,
ktDeclaration: KtDeclaration,
firFile: FirFile,
firFileLockProvider: LockProvider<FirFile>,
@@ -68,4 +68,4 @@ private fun KtProperty.isReanalyzableContainer() =
name != null && typeReference != null
private val KtNamedFunction.hasExplicitTypeOrUnit
get() = hasBlockBody() || typeReference != null
get() = hasBlockBody() || typeReference != null
@@ -222,7 +222,7 @@ internal class ReanalyzablePropertyStructureElement(
internal class NonReanalyzableDeclarationStructureElement(
firFile: FirFile,
val fir: FirDeclaration,
val fir: FirDeclaration<*>,
override val psi: KtDeclaration,
lockProvider: LockProvider<FirFile>,
) : FileStructureElement(firFile, lockProvider) {
@@ -263,7 +263,7 @@ internal class RootStructureElement(
companion object {
private val recorder = object : FirElementsRecorder() {
override fun visitElement(element: FirElement, data: MutableMap<KtElement, FirElement>) {
if (element !is FirDeclaration || element is FirFile) {
if (element !is FirDeclaration<*> || element is FirFile) {
super.visitElement(element, data)
}
}
@@ -13,7 +13,6 @@ import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache
import org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve.FirLazyDeclarationResolver
import org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve.declarationCanBeLazilyResolved
import org.jetbrains.kotlin.idea.fir.low.level.api.util.replaceFirst
import org.jetbrains.kotlin.psi.*
@@ -30,12 +29,12 @@ internal object FileStructureUtil {
fun replaceDeclaration(firFile: FirFile, from: FirCallableDeclaration<*>, to: FirCallableDeclaration<*>) {
val declarations = if (from.symbol.callableId.className == null) {
firFile.declarations as MutableList<FirDeclaration>
firFile.declarations as MutableList<FirDeclaration<*>>
} else {
val classLikeLookupTag = from.containingClass()
?: error("Class name should not be null for non-top-level & non-local declarations, but was null for\n${from.render()}")
val containingClass = classLikeLookupTag.toSymbol(firFile.moduleData.session)?.fir as FirRegularClass
containingClass.declarations as MutableList<FirDeclaration>
containingClass.declarations as MutableList<FirDeclaration<*>>
}
declarations.replaceFirst(from, to)
}
@@ -21,14 +21,14 @@ import org.jetbrains.kotlin.psi.KtSecondaryConstructor
internal object FirLazyBodiesCalculator {
fun calculateLazyBodiesInside(designation: FirDeclarationDesignation) {
designation.declaration.transform<FirElement, MutableList<FirDeclaration>>(
designation.declaration.transform<FirElement, MutableList<FirDeclaration<*>>>(
FirLazyBodiesCalculatorTransformer,
designation.toSequence(includeTarget = true).toMutableList()
)
}
fun calculateLazyBodies(firFile: FirFile) {
firFile.transform<FirElement, MutableList<FirDeclaration>>(FirLazyBodiesCalculatorTransformer, mutableListOf())
firFile.transform<FirElement, MutableList<FirDeclaration<*>>>(FirLazyBodiesCalculatorTransformer, mutableListOf())
}
fun calculateLazyBodiesForFunction(designation: FirDeclarationDesignation) {
@@ -104,16 +104,16 @@ internal object FirLazyBodiesCalculator {
|| (firProperty.delegate as? FirWrappedDelegateExpression)?.expression is FirLazyExpression
}
private object FirLazyBodiesCalculatorTransformer : FirTransformer<MutableList<FirDeclaration>>() {
private object FirLazyBodiesCalculatorTransformer : FirTransformer<MutableList<FirDeclaration<*>>>() {
override fun transformFile(file: FirFile, data: MutableList<FirDeclaration>): FirDeclaration {
override fun transformFile(file: FirFile, data: MutableList<FirDeclaration<*>>): FirFile {
file.declarations.forEach {
it.transformSingle(this, data)
}
return file
}
override fun <E : FirElement> transformElement(element: E, data: MutableList<FirDeclaration>): E {
override fun <E : FirElement> transformElement(element: E, data: MutableList<FirDeclaration<*>>): E {
if (element is FirRegularClass) {
data.add(element)
element.declarations.forEach {
@@ -127,8 +127,8 @@ private object FirLazyBodiesCalculatorTransformer : FirTransformer<MutableList<F
override fun transformSimpleFunction(
simpleFunction: FirSimpleFunction,
data: MutableList<FirDeclaration>
): FirDeclaration {
data: MutableList<FirDeclaration<*>>
): FirSimpleFunction {
if (simpleFunction.body is FirLazyBlock) {
val designation = FirDeclarationDesignation(data, simpleFunction)
FirLazyBodiesCalculator.calculateLazyBodiesForFunction(designation)
@@ -138,8 +138,8 @@ private object FirLazyBodiesCalculatorTransformer : FirTransformer<MutableList<F
override fun transformConstructor(
constructor: FirConstructor,
data: MutableList<FirDeclaration>
): FirDeclaration {
data: MutableList<FirDeclaration<*>>
): FirConstructor {
if (constructor.body is FirLazyBlock) {
val designation = FirDeclarationDesignation(data, constructor)
FirLazyBodiesCalculator.calculateLazyBodyForSecondaryConstructor(designation)
@@ -147,7 +147,7 @@ private object FirLazyBodiesCalculatorTransformer : FirTransformer<MutableList<F
return constructor
}
override fun transformProperty(property: FirProperty, data: MutableList<FirDeclaration>): FirDeclaration {
override fun transformProperty(property: FirProperty, data: MutableList<FirDeclaration<*>>): FirProperty {
if (FirLazyBodiesCalculator.needCalculatingLazyBodyForProperty(property)) {
val designation = FirDeclarationDesignation(data, property)
FirLazyBodiesCalculator.calculateLazyBodyForProperty(designation)
@@ -5,16 +5,11 @@
package org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve
import org.jetbrains.kotlin.fir.containingClass
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.toFirRegularClass
import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.runCustomResolveUnderLock
import org.jetbrains.kotlin.idea.fir.low.level.api.util.containingKtFileIfAny
import org.jetbrains.kotlin.idea.fir.low.level.api.util.getContainingFile
enum class ResolveType {
@@ -34,7 +29,7 @@ enum class ResolveType {
}
internal fun FirLazyDeclarationResolver.lazyResolveDeclaration(
firDeclaration: FirDeclaration,
firDeclaration: FirDeclaration<*>,
moduleFileCache: ModuleFileCache,
toResolveType: ResolveType,
scopeSession: ScopeSession,
@@ -162,4 +157,4 @@ internal fun FirLazyDeclarationResolver.lazyResolveDeclaration(
)
}
}
}
}
@@ -84,7 +84,7 @@ internal class FirLazyDeclarationResolver(private val firFileBuilder: FirFileBui
).transformDeclaration(firFileBuilder.firPhaseRunner)
}
private fun FirDeclaration.isValidForResolve(): Boolean = when (origin) {
private fun FirDeclaration<*>.isValidForResolve(): Boolean = when (origin) {
is FirDeclarationOrigin.Source,
is FirDeclarationOrigin.ImportedFromObject,
is FirDeclarationOrigin.Delegated,
@@ -190,7 +190,7 @@ internal class FirLazyDeclarationResolver(private val firFileBuilder: FirFileBui
* @param firDeclarationToResolve target non-local declaration
*/
fun lazyResolveDeclaration(
firDeclarationToResolve: FirDeclaration,
firDeclarationToResolve: FirDeclaration<*>,
moduleFileCache: ModuleFileCache,
scopeSession: ScopeSession,
toPhase: FirResolvePhase,
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
internal fun FirDeclaration.getKtDeclarationForFirElement(): KtDeclaration {
internal fun FirDeclaration<*>.getKtDeclarationForFirElement(): KtDeclaration {
require(this !is FirFile)
val ktDeclaration = (psi as? KtDeclaration) ?: run {
@@ -32,7 +32,7 @@ internal class RawFirNonLocalDeclarationBuilder private constructor(
designation: FirDeclarationDesignation,
rootNonLocalDeclaration: KtDeclaration,
replacement: RawFirReplacement?
): FirDeclaration {
): FirDeclaration<*> {
val replacementApplier = replacement?.Applier()
val builder = RawFirNonLocalDeclarationBuilder(
session = session,
@@ -51,7 +51,7 @@ internal class RawFirNonLocalDeclarationBuilder private constructor(
scopeProvider: FirScopeProvider,
designation: FirDeclarationDesignation,
rootNonLocalDeclaration: KtDeclaration,
): FirDeclaration {
): FirDeclaration<*> {
val functionsToRebind = when (val originalDeclaration = designation.declaration) {
is FirSimpleFunction -> setOf(originalDeclaration)
is FirProperty -> setOfNotNull(originalDeclaration.getter, originalDeclaration.setter)
@@ -102,7 +102,7 @@ internal class RawFirNonLocalDeclarationBuilder private constructor(
}
}
private fun moveNext(iterator: Iterator<FirDeclaration>, containingClass: FirRegularClass?): FirDeclaration {
private fun moveNext(iterator: Iterator<FirDeclaration<*>>, containingClass: FirRegularClass?): FirDeclaration<*> {
if (!iterator.hasNext()) {
val visitor = VisitorWithReplacement()
return when (declarationToBuild) {
@@ -112,7 +112,7 @@ internal class RawFirNonLocalDeclarationBuilder private constructor(
visitor.convertProperty(declarationToBuild, ownerSymbol, ownerTypeArgumentsCount)
}
else -> visitor.convertElement(declarationToBuild)
} as FirDeclaration
} as FirDeclaration<*>
}
val parent = iterator.next()
@@ -25,12 +25,12 @@ internal class FirIdeBuiltinsAndCloneableSessionProvider(override val symbolProv
override fun getFirFilesByPackage(fqName: FqName): List<FirFile> = emptyList()
@FirProviderInternals
override fun recordGeneratedClass(owner: FirAnnotatedDeclaration, klass: FirRegularClass) = shouldNotBeCalled()
override fun recordGeneratedClass(owner: FirAnnotatedDeclaration<*>, klass: FirRegularClass) = shouldNotBeCalled()
@FirProviderInternals
override fun recordGeneratedMember(owner: FirAnnotatedDeclaration, klass: FirDeclaration) = shouldNotBeCalled()
override fun recordGeneratedMember(owner: FirAnnotatedDeclaration<*>, klass: FirDeclaration<*>) = shouldNotBeCalled()
override fun getClassNamesInPackage(fqName: FqName): Set<Name> = shouldNotBeCalled()
private fun shouldNotBeCalled(): Nothing = error("Should not be called for FirIdeBuiltinsAndCloneableSession")
}
}
@@ -27,10 +27,10 @@ internal class FirIdeLibrariesSessionProvider(
override fun getFirFilesByPackage(fqName: FqName): List<FirFile> = emptyList()
@FirProviderInternals
override fun recordGeneratedClass(owner: FirAnnotatedDeclaration, klass: FirRegularClass) = shouldNotBeCalled()
override fun recordGeneratedClass(owner: FirAnnotatedDeclaration<*>, klass: FirRegularClass) = shouldNotBeCalled()
@FirProviderInternals
override fun recordGeneratedMember(owner: FirAnnotatedDeclaration, klass: FirDeclaration) = shouldNotBeCalled()
override fun recordGeneratedMember(owner: FirAnnotatedDeclaration<*>, klass: FirDeclaration<*>) = shouldNotBeCalled()
override fun getClassNamesInPackage(fqName: FqName): Set<Name> = shouldNotBeCalled()
@@ -92,12 +92,12 @@ internal class FirIdeProvider(
@FirProviderInternals
override fun recordGeneratedClass(owner: FirAnnotatedDeclaration, klass: FirRegularClass) {
override fun recordGeneratedClass(owner: FirAnnotatedDeclaration<*>, klass: FirRegularClass) {
TODO()
}
@FirProviderInternals
override fun recordGeneratedMember(owner: FirAnnotatedDeclaration, klass: FirDeclaration) {
override fun recordGeneratedMember(owner: FirAnnotatedDeclaration<*>, klass: FirDeclaration<*>) {
TODO()
}
@@ -10,7 +10,10 @@ import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.resolve.ResolutionMode
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.FirProviderInterceptor
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.*
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirBodyResolveTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.ImplicitBodyResolveComputationSession
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.createReturnTypeCalculatorForIDE
import org.jetbrains.kotlin.idea.fir.low.level.api.FirPhaseRunner
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationDesignationWithFile
import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.FirIdeDesignatedBodyResolveTransformerForReturnTypeCalculator
@@ -46,12 +49,12 @@ internal class FirDesignatedBodyResolveTransformerForIDE(
) {
private val ideDeclarationTransformer = IDEDeclarationTransformer(designation)
override fun transformDeclarationContent(declaration: FirDeclaration, data: ResolutionMode): FirDeclaration =
override fun transformDeclarationContent(declaration: FirDeclaration<*>, data: ResolutionMode): FirDeclaration<*> =
ideDeclarationTransformer.transformDeclarationContent(this, declaration, data) {
super.transformDeclarationContent(declaration, data)
}
override fun needReplacePhase(firDeclaration: FirDeclaration): Boolean =
override fun needReplacePhase(firDeclaration: FirDeclaration<*>): Boolean =
ideDeclarationTransformer.needReplacePhase && firDeclaration !is FirFile && super.needReplacePhase(firDeclaration)
override fun transformDeclaration(phaseRunner: FirPhaseRunner) {
@@ -73,7 +76,7 @@ internal class FirDesignatedBodyResolveTransformerForIDE(
ensureResolvedDeep(designation.declaration)
}
override fun ensureResolved(declaration: FirDeclaration) {
override fun ensureResolved(declaration: FirDeclaration<*>) {
when (declaration) {
is FirSimpleFunction, is FirConstructor, is FirTypeAlias, is FirField, is FirAnonymousInitializer ->
declaration.ensurePhase(FirResolvePhase.BODY_RESOLVE)
@@ -16,8 +16,9 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationDesignation
import org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve.FirLazyBodiesCalculator
import org.jetbrains.kotlin.idea.fir.low.level.api.transformers.FirLazyTransformerForIDE.Companion.isResolvedForAllDeclarations
import org.jetbrains.kotlin.idea.fir.low.level.api.transformers.FirLazyTransformerForIDE.Companion.updateResolvedPhaseForDeclarationAndChildren
import org.jetbrains.kotlin.idea.fir.low.level.api.util.*
import org.jetbrains.kotlin.idea.fir.low.level.api.util.ensureDesignation
import org.jetbrains.kotlin.idea.fir.low.level.api.util.ensurePhase
import org.jetbrains.kotlin.idea.fir.low.level.api.util.isTargetCallableDeclarationAndInPhase
/**
* Transform designation into CONTRACTS declaration. Affects only for target declaration and it's children
@@ -40,13 +41,13 @@ internal class FirDesignatedContractsResolveTransformerForIDE(
}
}
override fun transformDeclarationContent(declaration: FirDeclaration, data: ResolutionMode): FirDeclaration =
override fun transformDeclarationContent(declaration: FirDeclaration<*>, data: ResolutionMode): FirDeclaration<*> =
ideDeclarationTransformer.transformDeclarationContent(this, declaration, data) {
designation.declaration.updateResolvedPhaseForDeclarationAndChildren(FirResolvePhase.CONTRACTS)
super.transformDeclarationContent(declaration, data)
}
override fun needReplacePhase(firDeclaration: FirDeclaration): Boolean =
override fun needReplacePhase(firDeclaration: FirDeclaration<*>): Boolean =
ideDeclarationTransformer.needReplacePhase && firDeclaration !is FirFile && super.needReplacePhase(firDeclaration)
override fun transformDeclaration(phaseRunner: FirPhaseRunner) {
@@ -65,7 +66,7 @@ internal class FirDesignatedContractsResolveTransformerForIDE(
ensureResolvedDeep(designation.declaration)
}
override fun ensureResolved(declaration: FirDeclaration) {
override fun ensureResolved(declaration: FirDeclaration<*>) {
when (declaration) {
is FirSimpleFunction, is FirConstructor, is FirAnonymousInitializer ->
declaration.ensurePhase(FirResolvePhase.CONTRACTS)
@@ -49,12 +49,12 @@ internal class FirDesignatedImplicitTypesTransformerForIDE(
) {
private val ideDeclarationTransformer = IDEDeclarationTransformer(designation)
override fun transformDeclarationContent(declaration: FirDeclaration, data: ResolutionMode): FirDeclaration =
override fun transformDeclarationContent(declaration: FirDeclaration<*>, data: ResolutionMode): FirDeclaration<*> =
ideDeclarationTransformer.transformDeclarationContent(this, declaration, data) {
super.transformDeclarationContent(declaration, data)
}
override fun needReplacePhase(firDeclaration: FirDeclaration): Boolean =
override fun needReplacePhase(firDeclaration: FirDeclaration<*>): Boolean =
ideDeclarationTransformer.needReplacePhase && firDeclaration !is FirFile && super.needReplacePhase(firDeclaration)
override fun transformDeclaration(phaseRunner: FirPhaseRunner) {
@@ -78,7 +78,7 @@ internal class FirDesignatedImplicitTypesTransformerForIDE(
ensureResolvedDeep(designation.declaration)
}
override fun ensureResolved(declaration: FirDeclaration) {
override fun ensureResolved(declaration: FirDeclaration<*>) {
when (declaration) {
is FirSimpleFunction -> check(declaration.returnTypeRef is FirResolvedTypeRef)
is FirField -> check(declaration.returnTypeRef is FirResolvedTypeRef)
@@ -32,10 +32,10 @@ internal class FirDesignatedStatusResolveTransformerForIDE(
val designationTransformer = IDEDeclarationTransformer(designation)
override fun needReplacePhase(firDeclaration: FirDeclaration): Boolean =
override fun needReplacePhase(firDeclaration: FirDeclaration<*>): Boolean =
firDeclaration !is FirFile && super.needReplacePhase(firDeclaration)
override fun transformDeclarationContent(declaration: FirDeclaration, data: FirResolvedDeclarationStatus?): FirDeclaration =
override fun transformDeclarationContent(declaration: FirDeclaration<*>, data: FirResolvedDeclarationStatus?): FirDeclaration<*> =
designationTransformer.transformDeclarationContent(this, declaration, data) {
super.transformDeclarationContent(declaration, data)
}
@@ -57,7 +57,7 @@ internal class FirDesignatedStatusResolveTransformerForIDE(
ensureResolvedDeep(designation.declaration)
}
override fun ensureResolved(declaration: FirDeclaration) {
override fun ensureResolved(declaration: FirDeclaration<*>) {
if (declaration !is FirAnonymousInitializer) {
declaration.ensurePhase(FirResolvePhase.STATUS)
}
@@ -77,4 +77,4 @@ internal class FirDesignatedStatusResolveTransformerForIDE(
else -> error("Unexpected type: ${declaration::class.simpleName}")
}
}
}
}
@@ -53,7 +53,7 @@ internal class FirDesignatedSupertypeResolverTransformerForIDE(
) {
val declarationTransformer = IDEDeclarationTransformer(classDesignation)
override fun visitDeclarationContent(declaration: FirDeclaration, data: Any?) {
override fun visitDeclarationContent(declaration: FirDeclaration<*>, data: Any?) {
declarationTransformer.visitDeclarationContent(this, declaration, data) {
super.visitDeclarationContent(declaration, data)
declaration
@@ -64,7 +64,7 @@ internal class FirDesignatedSupertypeResolverTransformerForIDE(
private inner class DesignatedFirApplySupertypesTransformer(classDesignation: FirDeclarationDesignation) :
FirApplySupertypesTransformer(supertypeComputationSession) {
override fun needReplacePhase(firDeclaration: FirDeclaration): Boolean =
override fun needReplacePhase(firDeclaration: FirDeclaration<*>): Boolean =
firDeclaration !is FirFile && super.needReplacePhase(firDeclaration)
override fun transformRegularClass(regularClass: FirRegularClass, data: Any?): FirStatement {
@@ -79,15 +79,15 @@ internal class FirDesignatedSupertypeResolverTransformerForIDE(
else super.transformAnonymousObject(anonymousObject, data)
}
override fun transformTypeAlias(typeAlias: FirTypeAlias, data: Any?): FirDeclaration {
override fun transformTypeAlias(typeAlias: FirTypeAlias, data: Any?): FirStatement {
return if (typeAlias.resolvePhase >= FirResolvePhase.SUPER_TYPES)
transformDeclarationContent(typeAlias, data)
transformDeclarationContent(typeAlias, data) as FirTypeAlias
else super.transformTypeAlias(typeAlias, data)
}
val declarationTransformer = IDEDeclarationTransformer(classDesignation)
override fun transformDeclarationContent(declaration: FirDeclaration, data: Any?): FirDeclaration {
override fun transformDeclarationContent(declaration: FirDeclaration<*>, data: Any?): FirDeclaration<*> {
return declarationTransformer.transformDeclarationContent(this, declaration, data) {
super.transformDeclarationContent(declaration, data)
}
@@ -95,7 +95,7 @@ internal class FirDesignatedSupertypeResolverTransformerForIDE(
}
private fun collect(designation: FirDeclarationDesignationWithFile): Collection<FirDeclarationDesignationWithFile> {
val visited = mutableMapOf<FirDeclaration, FirDeclarationDesignationWithFile>()
val visited = mutableMapOf<FirDeclaration<*>, FirDeclarationDesignationWithFile>()
val toVisit = mutableListOf<FirDeclarationDesignationWithFile>()
toVisit.add(designation)
@@ -178,7 +178,7 @@ internal class FirDesignatedSupertypeResolverTransformerForIDE(
ensureResolvedDeep(designation.declaration)
}
override fun ensureResolved(declaration: FirDeclaration) {
override fun ensureResolved(declaration: FirDeclaration<*>) {
when (declaration) {
is FirFunction<*>, is FirProperty, is FirEnumEntry, is FirField, is FirAnonymousInitializer -> Unit
is FirRegularClass -> {
@@ -32,10 +32,11 @@ internal class FirDesignatedTypeResolverTransformerForIDE(
private val declarationTransformer = IDEDeclarationTransformer(designation)
override fun <E : FirElement> transformElement(element: E, data: Any?): E {
return if (element is FirDeclaration && (element is FirRegularClass || element is FirFile)) {
return if (element is FirDeclaration<*> && (element is FirRegularClass || element is FirFile)) {
@Suppress("UNCHECKED_CAST")
declarationTransformer.transformDeclarationContent(this, element, data) {
super.transformElement(element, data)
}
} as E
} else {
super.transformElement(element, data)
}
@@ -57,7 +58,7 @@ internal class FirDesignatedTypeResolverTransformerForIDE(
ensureResolvedDeep(designation.declaration)
}
override fun ensureResolved(declaration: FirDeclaration) {
override fun ensureResolved(declaration: FirDeclaration<*>) {
if (declaration !is FirAnonymousInitializer) {
declaration.ensurePhase(FirResolvePhase.TYPES)
}
@@ -81,4 +82,4 @@ internal class FirDesignatedTypeResolverTransformerForIDE(
else -> error("Unexpected type: ${declaration::class.simpleName}")
}
}
}
}
@@ -36,7 +36,7 @@ internal class FirFileAnnotationsResolveTransformer(
firTowerDataContextCollector = firTowerDataContextCollector
), FirLazyTransformerForIDE {
override fun transformDeclarationContent(declaration: FirDeclaration, data: ResolutionMode): FirDeclaration {
override fun transformDeclarationContent(declaration: FirDeclaration<*>, data: ResolutionMode): FirDeclaration<*> {
require(declaration is FirFile) { "Unexpected declaration ${declaration::class.simpleName}" }
annotations.forEach {
if (it.resolveStatus != FirAnnotationResolveStatus.Resolved) {
@@ -54,7 +54,7 @@ internal class FirFileAnnotationsResolveTransformer(
check(annotations.all { it.resolveStatus == FirAnnotationResolveStatus.Resolved }) { "Annotation was not resolved" }
}
override fun ensureResolved(declaration: FirDeclaration) = error("Not implemented")
override fun ensureResolved(declaration: FirDeclaration<*>) = error("Not implemented")
override fun needReplacePhase(firDeclaration: FirDeclaration): Boolean = false
}
override fun needReplacePhase(firDeclaration: FirDeclaration<*>): Boolean = false
}
@@ -12,8 +12,8 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationDesignation
internal interface FirLazyTransformerForIDE {
fun transformDeclaration(phaseRunner: FirPhaseRunner)
fun ensureResolved(declaration: FirDeclaration)
fun ensureResolvedDeep(declaration: FirDeclaration) {
fun ensureResolved(declaration: FirDeclaration<*>)
fun ensureResolvedDeep(declaration: FirDeclaration<*>) {
if (!enableDeepEnsure) return
ensureResolved(declaration)
if (declaration is FirRegularClass) {
@@ -27,19 +27,19 @@ internal interface FirLazyTransformerForIDE {
private object ResolvePhaseWithForAllDeclarationsKey : FirDeclarationDataKey()
private var FirDeclaration.resolvePhaseForDeclarationAndChildrenAttr: FirResolvePhase?
private var FirDeclaration<*>.resolvePhaseForDeclarationAndChildrenAttr: FirResolvePhase?
by FirDeclarationDataRegistry.data(ResolvePhaseWithForAllDeclarationsKey)
/**
* This resolve phase is used to check if current declaration and it's children were resolved for phase
*/
var FirDeclaration.resolvePhaseForDeclarationAndChildren: FirResolvePhase
var FirDeclaration<*>.resolvePhaseForDeclarationAndChildren: FirResolvePhase
get() = resolvePhaseForDeclarationAndChildrenAttr ?: FirResolvePhase.RAW_FIR
set(value) {
resolvePhaseForDeclarationAndChildrenAttr = value
}
fun FirDeclaration.updateResolvedPhaseForDeclarationAndChildren(phase: FirResolvePhase) {
fun FirDeclaration<*>.updateResolvedPhaseForDeclarationAndChildren(phase: FirResolvePhase) {
val allDeclaration = resolvePhaseForDeclarationAndChildren
if (allDeclaration < phase) {
resolvePhaseForDeclarationAndChildren = phase
@@ -67,7 +67,7 @@ internal interface FirLazyTransformerForIDE {
val DUMMY = object : FirLazyTransformerForIDE {
override fun transformDeclaration(phaseRunner: FirPhaseRunner) = Unit
override fun ensureResolved(declaration: FirDeclaration) = error("Not implemented")
override fun ensureResolved(declaration: FirDeclaration<*>) = error("Not implemented")
}
}
}
}
@@ -8,9 +8,7 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.transformers
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.resolve.transformers.FirAbstractPhaseTransformer
import org.jetbrains.kotlin.fir.visitors.FirDefaultTransformer
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.FirVisitor
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationDesignation
@@ -19,21 +17,21 @@ internal class IDEDeclarationTransformer(private val designation: FirDeclaration
private var isInsideTargetDeclaration: Boolean = false
private var designationPassed: Boolean = false
inline fun <K : FirDeclaration, D> visitDeclarationContent(
inline fun <D> visitDeclarationContent(
visitor: FirVisitor<Unit, D>,
declaration: K,
declaration: FirDeclaration<*>,
data: D,
default: () -> K
) = processDeclarationContent(declaration, default) {
default: () -> FirDeclaration<*>
): FirDeclaration<*> = processDeclarationContent(declaration, default) {
it.accept(visitor, data)
}
inline fun <K : FirDeclaration, D> transformDeclarationContent(
inline fun <D> transformDeclarationContent(
transformer: FirDefaultTransformer<D>,
declaration: K,
declaration: FirDeclaration<*>,
data: D,
default: () -> K
): K = processDeclarationContent(declaration, default) { toTransform ->
default: () -> FirDeclaration<*>
): FirDeclaration<*> = processDeclarationContent(declaration, default) { toTransform ->
toTransform.transform<FirElement, D>(transformer, data).also { transformed ->
check(transformed === toTransform) {
"become $transformed `${transformed.render()}`, was ${toTransform}: `${toTransform.render()}`"
@@ -41,11 +39,11 @@ internal class IDEDeclarationTransformer(private val designation: FirDeclaration
}
}
inline fun <K : FirDeclaration> processDeclarationContent(
declaration: K,
default: () -> K,
applyToDesignated: (FirDeclaration) -> Unit,
): K {
private inline fun processDeclarationContent(
declaration: FirDeclaration<*>,
default: () -> FirDeclaration<*>,
applyToDesignated: (FirDeclaration<*>) -> Unit,
): FirDeclaration<*> {
//It means that we are inside the target declaration
if (isInsideTargetDeclaration) {
return default()
@@ -76,4 +74,4 @@ internal class IDEDeclarationTransformer(private val designation: FirDeclaration
fun ensureDesignationPassed() {
check(designationPassed) { "Designation not passed for declaration ${designation.declaration::class.simpleName}" }
}
}
}
@@ -9,10 +9,9 @@ import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.resolve.firProvider
fun FirDeclaration.getContainingFile(): FirFile? {
fun FirDeclaration<*>.getContainingFile(): FirFile? {
val provider = moduleData.session.firProvider
return when (this) {
is FirFile -> this
@@ -20,4 +19,4 @@ fun FirDeclaration.getContainingFile(): FirFile? {
is FirClassLikeDeclaration<*> -> provider.getFirClassifierContainerFile(symbol)
else -> error("Unsupported declaration ${this::class.java}")
}
}
}
@@ -5,7 +5,10 @@
package org.jetbrains.kotlin.idea.fir.low.level.api.util
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.realPsi
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
@@ -24,7 +27,7 @@ internal fun KtDeclaration.findSourceNonLocalFirDeclaration(
firSymbolProvider: FirSymbolProvider,
moduleFileCache: ModuleFileCache,
containerFirFile: FirFile? = null
): FirDeclaration {
): FirDeclaration<*> {
//TODO test what way faster
findSourceNonLocalFirDeclarationByProvider(firFileBuilder, firSymbolProvider, moduleFileCache, containerFirFile)?.let { return it }
findSourceOfNonLocalFirDeclarationByTraversingWholeTree(firFileBuilder, moduleFileCache, containerFirFile)?.let { return it }
@@ -35,23 +38,23 @@ internal fun KtDeclaration.findFirDeclarationForAnyFirSourceDeclaration(
firFileBuilder: FirFileBuilder,
firSymbolProvider: FirSymbolProvider,
moduleFileCache: ModuleFileCache
): FirDeclaration {
): FirDeclaration<*> {
val nonLocalDeclaration = getNonLocalContainingOrThisDeclaration()
?.findSourceNonLocalFirDeclaration(firFileBuilder, firSymbolProvider, moduleFileCache)
?: firFileBuilder.buildRawFirFileWithCaching(containingKtFile, moduleFileCache, preferLazyBodies = true)
val originalDeclaration = originalDeclaration
val fir = FirElementFinder.findElementIn<FirDeclaration>(nonLocalDeclaration) { firDeclaration ->
val fir = FirElementFinder.findElementIn<FirDeclaration<*>>(nonLocalDeclaration) { firDeclaration ->
firDeclaration.psi == this || firDeclaration.psi == originalDeclaration
}
return fir
?: error("FirDeclaration was not found for\n${getElementTextInContext()}")
}
internal inline fun <reified F : FirDeclaration> KtDeclaration.findFirDeclarationForAnyFirSourceDeclarationOfType(
internal inline fun <reified F : FirDeclaration<*>> KtDeclaration.findFirDeclarationForAnyFirSourceDeclarationOfType(
firFileBuilder: FirFileBuilder,
firSymbolProvider: FirSymbolProvider,
moduleFileCache: ModuleFileCache
): FirDeclaration {
): FirDeclaration<*> {
val fir = findFirDeclarationForAnyFirSourceDeclaration(firFileBuilder, firSymbolProvider, moduleFileCache)
if (fir !is F) throw InvalidFirElementTypeException(this, F::class, fir::class)
return fir
@@ -61,7 +64,7 @@ private fun KtDeclaration.findSourceOfNonLocalFirDeclarationByTraversingWholeTre
firFileBuilder: FirFileBuilder,
moduleFileCache: ModuleFileCache,
containerFirFile: FirFile?,
): FirDeclaration? {
): FirDeclaration<*>? {
val firFile = containerFirFile ?: firFileBuilder.buildRawFirFileWithCaching(containingKtFile, moduleFileCache, preferLazyBodies = true)
val originalDeclaration = originalDeclaration
return FirElementFinder.findElementIn(firFile, goInside = { it is FirRegularClass }) { firDeclaration ->
@@ -74,7 +77,7 @@ private fun KtDeclaration.findSourceNonLocalFirDeclarationByProvider(
firSymbolProvider: FirSymbolProvider,
moduleFileCache: ModuleFileCache,
containerFirFile: FirFile?
): FirDeclaration? {
): FirDeclaration<*>? {
val candidate = when {
this is KtClassOrObject -> findFir(firSymbolProvider)
this is KtNamedDeclaration && (this is KtProperty || this is KtNamedFunction) -> {
@@ -122,5 +125,5 @@ private fun KtClassLikeDeclaration.findFir(firSymbolProvider: FirSymbolProvider)
}
val FirDeclaration.isGeneratedDeclaration
get() = realPsi == null
val FirDeclaration<*>.isGeneratedDeclaration
get() = realPsi == null
@@ -6,11 +6,9 @@
package org.jetbrains.kotlin.idea.fir.low.level.api.util
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.resolve.transformers.ensureResolved
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationDesignation
internal fun FirDeclaration.ensurePhase(firResolvePhase: FirResolvePhase) =
internal fun FirDeclaration<*>.ensurePhase(firResolvePhase: FirResolvePhase) =
check(resolvePhase >= firResolvePhase) {
"Element phase required to be $firResolvePhase but element resolved to $resolvePhase"
}
@@ -34,4 +32,4 @@ internal fun FirDeclarationDesignation.ensurePhaseForClasses(firResolvePhase: Fi
internal fun FirDeclarationDesignation.isTargetCallableDeclarationAndInPhase(firResolvePhase: FirResolvePhase): Boolean =
(declaration as? FirCallableDeclaration<*>)?.let { it.resolvePhase >= firResolvePhase } ?: false
internal fun FirDeclarationDesignation.targetContainingDeclaration(): FirDeclaration? = path.lastOrNull()
internal fun FirDeclarationDesignation.targetContainingDeclaration(): FirDeclaration<*>? = path.lastOrNull()
@@ -67,7 +67,7 @@ internal inline fun checkCanceled() {
internal val FirElement.isErrorElement
get() = this is FirDiagnosticHolder
internal val FirDeclaration.ktDeclaration: KtDeclaration
internal val FirDeclaration<*>.ktDeclaration: KtDeclaration
get() {
val psi = psi
?: error("PSI element was not found for${render()}")
@@ -85,7 +85,7 @@ internal val FirDeclaration.ktDeclaration: KtDeclaration
}
}
internal val FirDeclaration.containingKtFileIfAny: KtFile?
internal val FirDeclaration<*>.containingKtFileIfAny: KtFile?
get() = psi?.containingFile as? KtFile
@@ -5,8 +5,11 @@
package org.jetbrains.kotlin.idea.fir.low.level.api
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirRenderer
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.realPsi
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
import org.jetbrains.kotlin.idea.fir.low.level.api.api.withFirDeclaration
import org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve.ResolveType
@@ -27,13 +30,13 @@ import org.junit.jupiter.api.parallel.ExecutionMode
@Execution(ExecutionMode.SAME_THREAD)
abstract class AbstractFirLazyDeclarationResolveTest : AbstractLowLevelApiSingleFileTest() {
private fun FirFile.findResolveMe(): FirDeclaration {
private fun FirFile.findResolveMe(): FirDeclaration<*> {
val visitor = object : FirVisitorVoid() {
var result: FirDeclaration? = null
var result: FirDeclaration<*>? = null
override fun visitElement(element: FirElement) {
if (result != null) return
val declaration = element.realPsi as? KtDeclaration
if (element is FirDeclaration && declaration != null && declaration.name == "resolveMe") {
if (element is FirDeclaration<*> && declaration != null && declaration.name == "resolveMe") {
result = element
return
}
@@ -107,4 +110,4 @@ abstract class AbstractFirLazyDeclarationResolveTest : AbstractLowLevelApiSingle
}
}
}
}
}
@@ -54,7 +54,7 @@ abstract class AbstractPartialRawFirBuilderTestCase : AbstractLowLevelApiSingleF
}
private class DesignationBuilder(private val elementToBuild: KtDeclaration) : FirVisitorVoid() {
private val path = mutableListOf<FirDeclaration>()
private val path = mutableListOf<FirDeclaration<*>>()
var resultDesignation: FirDeclarationDesignation? = null
private set
@@ -63,7 +63,7 @@ abstract class AbstractPartialRawFirBuilderTestCase : AbstractLowLevelApiSingleF
when (element) {
is FirSimpleFunction, is FirProperty -> {
if (element.psi == elementToBuild) {
val originalDeclaration = element as FirDeclaration
val originalDeclaration = element as FirDeclaration<*>
resultDesignation = FirDeclarationDesignation(path, originalDeclaration)
} else {
element.acceptChildren(this)
@@ -107,7 +107,7 @@ abstract class AbstractDiagnosticTraversalCounterTest : AbstractLowLevelApiSing
firFile: FirElement,
): Set<FirElement> {
val elementUsageCount = mutableMapOf<FirElement, Int>()
val sessionHolder = SessionHolderImpl((firFile as FirDeclaration).moduleData.session, ScopeSession())
val sessionHolder = SessionHolderImpl((firFile as FirDeclaration<*>).moduleData.session, ScopeSession())
val visitor = object : AbstractDiagnosticCollectorVisitor(
PersistentCheckerContextFactory.createEmptyPersistenceCheckerContext(sessionHolder)
) {
@@ -57,9 +57,9 @@ abstract class AbstractFirContextCollectionTest : AbstractLowLevelApiSingleFileT
}
}
private fun FileStructureElement.getFirDeclaration(): FirDeclaration = when (this) {
private fun FileStructureElement.getFirDeclaration(): FirDeclaration<*> = when (this) {
is NonReanalyzableDeclarationStructureElement -> fir
is ReanalyzableStructureElement<*, *> -> firSymbol.fir as FirDeclaration
is ReanalyzableStructureElement<*, *> -> firSymbol.fir
is RootStructureElement -> firFile
}
@@ -68,10 +68,10 @@ abstract class AbstractFirContextCollectionTest : AbstractLowLevelApiSingleFileT
private val assertions: AssertionsService
) :
BeforeElementDiagnosticCollectionHandler() {
lateinit var elementsToCheckContext: List<FirDeclaration>
lateinit var elementsToCheckContext: List<FirDeclaration<*>>
lateinit var firFile: FirFile
override fun beforeGoingNestedDeclaration(declaration: FirDeclaration, context: PersistentCheckerContext) {
override fun beforeGoingNestedDeclaration(declaration: FirDeclaration<*>, context: PersistentCheckerContext) {
if (declaration is FirFile) {
return
}
@@ -93,8 +93,8 @@ abstract class AbstractFirContextCollectionTest : AbstractLowLevelApiSingleFileT
private fun PersistentImplicitReceiverStack.asString() =
joinToString { it.boundSymbol.name() }
private fun PersistentList<FirDeclaration>.asString() =
joinToString(transform = FirDeclaration::name)
private fun PersistentList<FirDeclaration<*>>.asString() =
joinToString(transform = FirDeclaration<*>::name)
}
}
@@ -9,14 +9,13 @@ import com.intellij.openapi.module.ModuleManager
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirRenderer
import org.jetbrains.kotlin.fir.FirSymbolOwner
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousInitializerSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFileSymbol
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getModuleInfo
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getResolveState
@@ -34,14 +33,11 @@ internal fun FirBasedSymbol<*>.name(): String = when (this) {
is FirCallableSymbol<*> -> callableId.callableName.asString()
is FirClassLikeSymbol<*> -> classId.shortClassName.asString()
is FirAnonymousInitializerSymbol -> "<init>"
is FirFileSymbol -> "<FILE>"
else -> error("unknown symbol ${this::class.simpleName}")
}
internal fun FirDeclaration.name(): String = when (this) {
is FirSymbolOwner<*> -> symbol.name()
is FirFile -> "<FILE>"
else -> error("unknown declaration ${this::class.simpleName}")
}
internal fun FirDeclaration<*>.name(): String = symbol.name()
internal inline fun <R> resolveWithClearCaches(
context: KtElement,
@@ -185,7 +185,7 @@ private object FirToKtConversionCreator {
importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirRegularClass")
),
FirMemberDeclaration::class to HLFunctionCallConversion(
"firSymbolBuilder.buildSymbol({0} as FirDeclaration)",
"firSymbolBuilder.buildSymbol({0} as FirDeclaration<*>)",
KtSymbol::class.createType(),
importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirDeclaration")
),
@@ -22,7 +22,6 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.backend.jvm.jvmTypeMapper
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.isPrimitiveType
import org.jetbrains.kotlin.fir.resolve.inference.inferenceComponents
import org.jetbrains.kotlin.fir.resolve.substitution.AbstractConeSubstitutor
import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
@@ -36,7 +35,10 @@ import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirSymbol
import org.jetbrains.kotlin.idea.frontend.api.fir.types.KtFirType
import org.jetbrains.kotlin.idea.frontend.api.symbols.*
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.*
import org.jetbrains.kotlin.idea.frontend.api.types.*
import org.jetbrains.kotlin.idea.frontend.api.types.KtNonErrorClassType
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
import org.jetbrains.kotlin.idea.frontend.api.types.KtTypeNullability
import org.jetbrains.kotlin.idea.frontend.api.types.KtTypeWithNullability
import org.jetbrains.kotlin.load.kotlin.TypeMappingMode
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.SpecialNames
@@ -194,7 +196,7 @@ internal val KtType.nullabilityType: NullabilityType
} ?: NullabilityType.Unknown
internal fun FirMemberDeclaration.computeSimpleModality(): Set<String> {
internal fun FirMemberDeclaration<*>.computeSimpleModality(): Set<String> {
require(this !is FirConstructor)
val modifier = when (modality) {
@@ -99,7 +99,7 @@ object FirIdeDeserializedDeclarationSourceProvider {
return null
}
private fun FirDeclaration.scope(project: Project): GlobalSearchScope {
private fun FirDeclaration<*>.scope(project: Project): GlobalSearchScope {
return GlobalSearchScope.allScope(project)
/* TODO:
val session = session as? FirLibrarySession
@@ -150,5 +150,5 @@ fun FirElement.findPsi(session: FirSession): PsiElement? =
* For data classes & enums generated members like `copy` `componentN`, `values` it will return corresponding enum/data class
* Otherwise, behaves the same way as [findPsi] returns exact PSI declaration corresponding to passed [FirDeclaration]
*/
fun FirDeclaration.findReferencePsi(): PsiElement? =
fun FirDeclaration<*>.findReferencePsi(): PsiElement? =
psi ?: FirIdeDeserializedDeclarationSourceProvider.findPsi(this, (moduleData.session as FirIdeSession).project)
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.*
import org.jetbrains.kotlin.resolve.constants.evaluate.CompileTimeType
@@ -204,7 +204,7 @@ internal class FirCompileTimeConstantEvaluator {
buildConstExpression(source, this, value as T)
private fun FirFunctionCall.getOriginalFunction(): FirCallableDeclaration<*>? {
val symbol: AbstractFirBasedSymbol<*>? = when (val reference = calleeReference) {
val symbol: FirBasedSymbol<*>? = when (val reference = calleeReference) {
is FirResolvedNamedReference -> reference.resolvedSymbol
else -> null
}
@@ -14,10 +14,10 @@ import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.impl.FirFieldImpl
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
import org.jetbrains.kotlin.fir.resolve.calls.originalConstructorIfTypeAlias
import org.jetbrains.kotlin.fir.java.declarations.FirJavaField
import org.jetbrains.kotlin.fir.resolve.symbolProvider
import org.jetbrains.kotlin.fir.resolve.calls.originalConstructorIfTypeAlias
import org.jetbrains.kotlin.fir.resolve.getSymbolByLookupTag
import org.jetbrains.kotlin.fir.resolve.symbolProvider
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag
import org.jetbrains.kotlin.fir.symbols.impl.FirBackingFieldSymbol
@@ -27,7 +27,10 @@ import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
import org.jetbrains.kotlin.idea.fir.low.level.api.createPackageProvider
import org.jetbrains.kotlin.idea.frontend.api.*
import org.jetbrains.kotlin.idea.frontend.api.KtStarProjectionTypeArgument
import org.jetbrains.kotlin.idea.frontend.api.KtTypeArgument
import org.jetbrains.kotlin.idea.frontend.api.KtTypeArgumentWithVariance
import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.*
import org.jetbrains.kotlin.idea.frontend.api.fir.types.*
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef
@@ -50,7 +53,7 @@ internal class KtSymbolByFirBuilder private constructor(
resolveState: FirModuleResolveState,
override val token: ValidityToken,
val withReadOnlyCaching: Boolean,
private val symbolsCache: BuilderCache<FirDeclaration, KtSymbol>,
private val symbolsCache: BuilderCache<FirDeclaration<*>, KtSymbol>,
private val filesCache: BuilderCache<FirFile, KtFileSymbol>,
private val backingFieldCache: BuilderCache<FirBackingFieldSymbol, KtBackingFieldSymbol>,
private val typesCache: BuilderCache<ConeKotlinType, KtType>,
@@ -97,7 +100,7 @@ internal class KtSymbolByFirBuilder private constructor(
}
fun buildSymbol(fir: FirDeclaration): KtSymbol {
fun buildSymbol(fir: FirDeclaration<*>): KtSymbol {
return when (fir) {
is FirClassLikeDeclaration<*> -> classifierBuilder.buildClassLikeSymbol(fir)
is FirTypeParameter -> classifierBuilder.buildTypeParameterSymbol(fir)
@@ -397,7 +400,7 @@ private class BuilderCache<From, To: Any> private constructor(
}
internal fun FirElement.buildSymbol(builder: KtSymbolByFirBuilder) =
(this as? FirDeclaration)?.let(builder::buildSymbol)
(this as? FirDeclaration<*>)?.let(builder::buildSymbol)
internal fun FirDeclaration.buildSymbol(builder: KtSymbolByFirBuilder) =
internal fun FirDeclaration<*>.buildSymbol(builder: KtSymbolByFirBuilder) =
builder.buildSymbol(this)
@@ -17,13 +17,13 @@ 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.SingleCandidateResolver
import org.jetbrains.kotlin.idea.fir.low.level.api.util.getElementTextInContext
import org.jetbrains.kotlin.idea.frontend.api.tokens.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.components.KtCompletionCandidateChecker
import org.jetbrains.kotlin.idea.frontend.api.components.KtExtensionApplicabilityResult
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirSymbol
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol
import org.jetbrains.kotlin.idea.frontend.api.tokens.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion
import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.psi.KtFile
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.idea.frontend.api.fir.components
import org.jetbrains.kotlin.fir.FirSymbolOwner
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.scopes.*
@@ -49,14 +48,14 @@ internal class KtFirSymbolDeclarationOverridesProvider(
return overriddenElement.map { analysisSession.firSymbolBuilder.callableBuilder.buildCallableSymbol(it.fir) }
}
private fun FirTypeScope.processCallableByName(declaration: FirDeclaration) = when (declaration) {
private fun FirTypeScope.processCallableByName(declaration: FirDeclaration<*>) = when (declaration) {
is FirSimpleFunction -> processFunctionsByName(declaration.name) { }
is FirProperty -> processPropertiesByName(declaration.name) { }
else -> error { "Invalid FIR symbol to process: ${declaration::class}" }
}
private fun FirTypeScope.processAllOverriddenDeclarations(
declaration: FirDeclaration,
declaration: FirDeclaration<*>,
processor: (FirCallableDeclaration<*>) -> Unit
) = when (declaration) {
is FirSimpleFunction -> processOverriddenFunctions(declaration.symbol) { symbol ->
@@ -71,7 +70,7 @@ internal class KtFirSymbolDeclarationOverridesProvider(
}
private fun FirTypeScope.processDirectOverriddenDeclarations(
declaration: FirDeclaration,
declaration: FirDeclaration<*>,
processor: (FirCallableDeclaration<*>) -> Unit
) = when (declaration) {
is FirSimpleFunction -> processDirectOverriddenFunctionsWithBaseScope(declaration.symbol) { symbol, _ ->
@@ -87,7 +86,7 @@ internal class KtFirSymbolDeclarationOverridesProvider(
private inline fun <T : KtSymbol> processOverrides(
callableSymbol: T,
crossinline process: (FirTypeScope, FirDeclaration) -> Unit
crossinline process: (FirTypeScope, FirDeclaration<*>) -> Unit
) {
require(callableSymbol is KtFirSymbol<*>)
val containingDeclaration = with(analysisSession) {
@@ -101,7 +100,7 @@ internal class KtFirSymbolDeclarationOverridesProvider(
private inline fun processOverrides(
containingDeclaration: KtFirNamedClassOrObjectSymbol,
callableSymbol: KtFirSymbol<*>,
crossinline process: (FirTypeScope, FirDeclaration) -> Unit
crossinline process: (FirTypeScope, FirDeclaration<*>) -> Unit
) {
containingDeclaration.firRef.withFir(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) { firContainer ->
callableSymbol.firRef.withFirUnsafe { firCallableDeclaration ->
@@ -134,7 +133,7 @@ internal class KtFirSymbolDeclarationOverridesProvider(
require(symbol is KtFirSymbol<*>)
if (symbol.origin != KtSymbolOrigin.INTERSECTION_OVERRIDE) return emptyList()
return symbol.firRef.withFir { fir ->
val firSymbol = (fir as? FirSymbolOwner<*>)?.symbol ?: return@withFir emptyList()
val firSymbol = fir.symbol
firSymbol.getIntersectionOverriddenSymbols().map { analysisSession.firSymbolBuilder.callableBuilder.buildCallableSymbol(it.fir) }
}
}
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.idea.frontend.api.fir.components
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSymbolOwner
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.expressions.FirExpression
@@ -56,7 +55,7 @@ internal class KtFirVisibilityChecker(
?.let { ExpressionReceiverValue(it) }
candidateSymbol.firRef.withFir { candidateFirSymbol ->
require(candidateFirSymbol is FirMemberDeclaration && candidateFirSymbol is FirSymbolOwner<*>) {
require(candidateFirSymbol is FirMemberDeclaration) {
"$candidateFirSymbol must be a FirMemberDeclaration and FirSymbolOwner; it were ${candidateFirSymbol::class} instead"
}
@@ -841,7 +841,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
add(FirErrors.EXPOSED_TYPEALIAS_EXPANDED_TYPE) { firDiagnostic ->
ExposedTypealiasExpandedTypeImpl(
firDiagnostic.a,
firSymbolBuilder.buildSymbol(firDiagnostic.b as FirDeclaration),
firSymbolBuilder.buildSymbol(firDiagnostic.b as FirDeclaration<*>),
firDiagnostic.c,
firDiagnostic as FirPsiDiagnostic,
token,
@@ -850,7 +850,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
add(FirErrors.EXPOSED_FUNCTION_RETURN_TYPE) { firDiagnostic ->
ExposedFunctionReturnTypeImpl(
firDiagnostic.a,
firSymbolBuilder.buildSymbol(firDiagnostic.b as FirDeclaration),
firSymbolBuilder.buildSymbol(firDiagnostic.b as FirDeclaration<*>),
firDiagnostic.c,
firDiagnostic as FirPsiDiagnostic,
token,
@@ -859,7 +859,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
add(FirErrors.EXPOSED_RECEIVER_TYPE) { firDiagnostic ->
ExposedReceiverTypeImpl(
firDiagnostic.a,
firSymbolBuilder.buildSymbol(firDiagnostic.b as FirDeclaration),
firSymbolBuilder.buildSymbol(firDiagnostic.b as FirDeclaration<*>),
firDiagnostic.c,
firDiagnostic as FirPsiDiagnostic,
token,
@@ -868,7 +868,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
add(FirErrors.EXPOSED_PROPERTY_TYPE) { firDiagnostic ->
ExposedPropertyTypeImpl(
firDiagnostic.a,
firSymbolBuilder.buildSymbol(firDiagnostic.b as FirDeclaration),
firSymbolBuilder.buildSymbol(firDiagnostic.b as FirDeclaration<*>),
firDiagnostic.c,
firDiagnostic as FirPsiDiagnostic,
token,
@@ -877,7 +877,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
add(FirErrors.EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR) { firDiagnostic ->
ExposedPropertyTypeInConstructorImpl(
firDiagnostic.a,
firSymbolBuilder.buildSymbol(firDiagnostic.b as FirDeclaration),
firSymbolBuilder.buildSymbol(firDiagnostic.b as FirDeclaration<*>),
firDiagnostic.c,
firDiagnostic as FirPsiDiagnostic,
token,
@@ -886,7 +886,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
add(FirErrors.EXPOSED_PARAMETER_TYPE) { firDiagnostic ->
ExposedParameterTypeImpl(
firDiagnostic.a,
firSymbolBuilder.buildSymbol(firDiagnostic.b as FirDeclaration),
firSymbolBuilder.buildSymbol(firDiagnostic.b as FirDeclaration<*>),
firDiagnostic.c,
firDiagnostic as FirPsiDiagnostic,
token,
@@ -895,7 +895,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
add(FirErrors.EXPOSED_SUPER_INTERFACE) { firDiagnostic ->
ExposedSuperInterfaceImpl(
firDiagnostic.a,
firSymbolBuilder.buildSymbol(firDiagnostic.b as FirDeclaration),
firSymbolBuilder.buildSymbol(firDiagnostic.b as FirDeclaration<*>),
firDiagnostic.c,
firDiagnostic as FirPsiDiagnostic,
token,
@@ -904,7 +904,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
add(FirErrors.EXPOSED_SUPER_CLASS) { firDiagnostic ->
ExposedSuperClassImpl(
firDiagnostic.a,
firSymbolBuilder.buildSymbol(firDiagnostic.b as FirDeclaration),
firSymbolBuilder.buildSymbol(firDiagnostic.b as FirDeclaration<*>),
firDiagnostic.c,
firDiagnostic as FirPsiDiagnostic,
token,
@@ -913,7 +913,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
add(FirErrors.EXPOSED_TYPE_PARAMETER_BOUND) { firDiagnostic ->
ExposedTypeParameterBoundImpl(
firDiagnostic.a,
firSymbolBuilder.buildSymbol(firDiagnostic.b as FirDeclaration),
firSymbolBuilder.buildSymbol(firDiagnostic.b as FirDeclaration<*>),
firDiagnostic.c,
firDiagnostic as FirPsiDiagnostic,
token,
@@ -1590,7 +1590,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
}
add(FirErrors.NOTHING_TO_OVERRIDE) { firDiagnostic ->
NothingToOverrideImpl(
firSymbolBuilder.buildSymbol(firDiagnostic.a as FirDeclaration),
firSymbolBuilder.buildSymbol(firDiagnostic.a as FirDeclaration<*>),
firDiagnostic as FirPsiDiagnostic,
token,
)
@@ -1687,32 +1687,32 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
}
add(FirErrors.RETURN_TYPE_MISMATCH_ON_OVERRIDE) { firDiagnostic ->
ReturnTypeMismatchOnOverrideImpl(
firSymbolBuilder.buildSymbol(firDiagnostic.a as FirDeclaration),
firSymbolBuilder.buildSymbol(firDiagnostic.b as FirDeclaration),
firSymbolBuilder.buildSymbol(firDiagnostic.a as FirDeclaration<*>),
firSymbolBuilder.buildSymbol(firDiagnostic.b as FirDeclaration<*>),
firDiagnostic as FirPsiDiagnostic,
token,
)
}
add(FirErrors.PROPERTY_TYPE_MISMATCH_ON_OVERRIDE) { firDiagnostic ->
PropertyTypeMismatchOnOverrideImpl(
firSymbolBuilder.buildSymbol(firDiagnostic.a as FirDeclaration),
firSymbolBuilder.buildSymbol(firDiagnostic.b as FirDeclaration),
firSymbolBuilder.buildSymbol(firDiagnostic.a as FirDeclaration<*>),
firSymbolBuilder.buildSymbol(firDiagnostic.b as FirDeclaration<*>),
firDiagnostic as FirPsiDiagnostic,
token,
)
}
add(FirErrors.VAR_TYPE_MISMATCH_ON_OVERRIDE) { firDiagnostic ->
VarTypeMismatchOnOverrideImpl(
firSymbolBuilder.buildSymbol(firDiagnostic.a as FirDeclaration),
firSymbolBuilder.buildSymbol(firDiagnostic.b as FirDeclaration),
firSymbolBuilder.buildSymbol(firDiagnostic.a as FirDeclaration<*>),
firSymbolBuilder.buildSymbol(firDiagnostic.b as FirDeclaration<*>),
firDiagnostic as FirPsiDiagnostic,
token,
)
}
add(FirErrors.VAR_OVERRIDDEN_BY_VAL) { firDiagnostic ->
VarOverriddenByValImpl(
firSymbolBuilder.buildSymbol(firDiagnostic.a as FirDeclaration),
firSymbolBuilder.buildSymbol(firDiagnostic.b as FirDeclaration),
firSymbolBuilder.buildSymbol(firDiagnostic.a as FirDeclaration<*>),
firSymbolBuilder.buildSymbol(firDiagnostic.b as FirDeclaration<*>),
firDiagnostic as FirPsiDiagnostic,
token,
)
@@ -1731,7 +1731,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
}
add(FirErrors.VIRTUAL_MEMBER_HIDDEN) { firDiagnostic ->
VirtualMemberHiddenImpl(
firSymbolBuilder.buildSymbol(firDiagnostic.a as FirDeclaration),
firSymbolBuilder.buildSymbol(firDiagnostic.a as FirDeclaration<*>),
firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.b) as KtNamedClassOrObjectSymbol,
firDiagnostic as FirPsiDiagnostic,
token,
@@ -1783,7 +1783,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
}
add(FirErrors.ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS) { firDiagnostic ->
AbstractFunctionInNonAbstractClassImpl(
firSymbolBuilder.buildSymbol(firDiagnostic.a as FirDeclaration),
firSymbolBuilder.buildSymbol(firDiagnostic.a as FirDeclaration<*>),
firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.b),
firDiagnostic as FirPsiDiagnostic,
token,
@@ -1791,28 +1791,28 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
}
add(FirErrors.ABSTRACT_FUNCTION_WITH_BODY) { firDiagnostic ->
AbstractFunctionWithBodyImpl(
firSymbolBuilder.buildSymbol(firDiagnostic.a as FirDeclaration),
firSymbolBuilder.buildSymbol(firDiagnostic.a as FirDeclaration<*>),
firDiagnostic as FirPsiDiagnostic,
token,
)
}
add(FirErrors.NON_ABSTRACT_FUNCTION_WITH_NO_BODY) { firDiagnostic ->
NonAbstractFunctionWithNoBodyImpl(
firSymbolBuilder.buildSymbol(firDiagnostic.a as FirDeclaration),
firSymbolBuilder.buildSymbol(firDiagnostic.a as FirDeclaration<*>),
firDiagnostic as FirPsiDiagnostic,
token,
)
}
add(FirErrors.PRIVATE_FUNCTION_WITH_NO_BODY) { firDiagnostic ->
PrivateFunctionWithNoBodyImpl(
firSymbolBuilder.buildSymbol(firDiagnostic.a as FirDeclaration),
firSymbolBuilder.buildSymbol(firDiagnostic.a as FirDeclaration<*>),
firDiagnostic as FirPsiDiagnostic,
token,
)
}
add(FirErrors.NON_MEMBER_FUNCTION_NO_BODY) { firDiagnostic ->
NonMemberFunctionNoBodyImpl(
firSymbolBuilder.buildSymbol(firDiagnostic.a as FirDeclaration),
firSymbolBuilder.buildSymbol(firDiagnostic.a as FirDeclaration<*>),
firDiagnostic as FirPsiDiagnostic,
token,
)
@@ -1904,7 +1904,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
}
add(FirErrors.ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS) { firDiagnostic ->
AbstractPropertyInNonAbstractClassImpl(
firSymbolBuilder.buildSymbol(firDiagnostic.a as FirDeclaration),
firSymbolBuilder.buildSymbol(firDiagnostic.a as FirDeclaration<*>),
firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.b),
firDiagnostic as FirPsiDiagnostic,
token,
@@ -189,7 +189,7 @@ internal class ConeTypeIdeRenderer(
return designation
}
private fun collectDesignationPathForLocal(declaration: FirDeclaration): List<FirDeclaration>? {
private fun collectDesignationPathForLocal(declaration: FirDeclaration<*>): List<FirDeclaration<*>>? {
val containingClass = when (declaration) {
is FirCallableDeclaration<*> -> declaration.containingClass()?.toFirRegularClass(declaration.moduleData.session)
is FirAnonymousObject -> return listOf(declaration)
@@ -326,7 +326,6 @@ internal class ConeTypeIdeRenderer(
val notNullParametersType = type
.valueParameterTypesIncludingReceiver(session)
.filterNotNull()
.applyIf(receiverType != null) { drop(1) }
notNullParametersType.forEachIndexed { index, typeProjection ->
@@ -337,14 +336,10 @@ internal class ConeTypeIdeRenderer(
append(") -> ")
val returnType = type.returnType(session)
if (returnType != null) {
append(renderType(returnType))
} else {
appendError()
}
append(renderType(returnType))
if (needParenthesis) append(")")
renderNullability(type)
}
}
}
@@ -28,14 +28,14 @@ import org.jetbrains.kotlin.renderer.render
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
internal class FirIdeRenderer private constructor(
private var containingDeclaration: FirDeclaration?,
private var containingDeclaration: FirDeclaration<*>?,
private val options: KtDeclarationRendererOptions,
private val session: FirSession
) : FirVisitor<Unit, StringBuilder>() {
private val typeIdeRenderer: ConeTypeIdeRenderer = ConeTypeIdeRenderer(session, options.typeRendererOptions)
private fun StringBuilder.renderAnnotations(annotated: FirAnnotatedDeclaration) {
private fun StringBuilder.renderAnnotations(annotated: FirAnnotatedDeclaration<*>) {
if (RendererModifier.ANNOTATIONS in options.modifiers) {
renderAnnotations(typeIdeRenderer, annotated.annotations, session)
}
@@ -58,7 +58,7 @@ internal class FirIdeRenderer private constructor(
return renderType(approximatedIfNeeded, annotations)
}
private fun StringBuilder.renderName(declaration: FirDeclaration) {
private fun StringBuilder.renderName(declaration: FirDeclaration<*>) {
if (declaration is FirAnonymousObject) {
append("<no name provided>")
return
@@ -109,7 +109,7 @@ internal class FirIdeRenderer private constructor(
renderModifier(RendererModifier.MODALITY in options.modifiers, modality.name.toLowerCaseAsciiOnly())
}
private fun FirMemberDeclaration.implicitModalityWithoutExtensions(containingDeclaration: FirDeclaration?): Modality {
private fun FirMemberDeclaration<*>.implicitModalityWithoutExtensions(containingDeclaration: FirDeclaration<*>?): Modality {
if (this is FirRegularClass) {
return if (classKind == ClassKind.INTERFACE) Modality.ABSTRACT else Modality.FINAL
}
@@ -126,7 +126,7 @@ internal class FirIdeRenderer private constructor(
private fun StringBuilder.renderModalityForCallable(
callable: FirCallableMemberDeclaration<*>,
containingDeclaration: FirDeclaration?
containingDeclaration: FirDeclaration<*>?
) {
val modality = callable.modality ?: return
val isTopLevel = containingDeclaration == null
@@ -148,13 +148,13 @@ internal class FirIdeRenderer private constructor(
}
}
private fun StringBuilder.renderMemberModifiers(declaration: FirMemberDeclaration) {
private fun StringBuilder.renderMemberModifiers(declaration: FirMemberDeclaration<*>) {
renderModifier(declaration.isExternal, "external")
renderModifier(RendererModifier.EXPECT in options.modifiers && declaration.isExpect, "expect")
renderModifier(RendererModifier.ACTUAL in options.modifiers && declaration.isActual, "actual")
}
private fun StringBuilder.renderAdditionalModifiers(firMember: FirMemberDeclaration) {
private fun StringBuilder.renderAdditionalModifiers(firMember: FirMemberDeclaration<*>) {
val isOperator =
firMember.isOperator//TODO make similar to functionDescriptor.overriddenDescriptors.none { it.isOperator }
val isInfix =
@@ -167,7 +167,7 @@ internal class FirIdeRenderer private constructor(
renderModifier(RendererModifier.OPERATOR in options.modifiers && isOperator, "operator")
}
private fun StringBuilder.renderSuspendModifier(functionDescriptor: FirMemberDeclaration) {
private fun StringBuilder.renderSuspendModifier(functionDescriptor: FirMemberDeclaration<*>) {
renderModifier(functionDescriptor.isSuspend, "suspend")
}
@@ -377,14 +377,14 @@ internal class FirIdeRenderer private constructor(
renderWhereSuffix(typeParameters)
}
fun FirDeclaration.isDefaultPrimaryConstructor() =
fun FirDeclaration<*>.isDefaultPrimaryConstructor() =
this is FirConstructor &&
isPrimary &&
valueParameters.isEmpty() &&
!hasBody &&
(visibility == Visibilities.DEFAULT_VISIBILITY || regularClass.classKind == ClassKind.OBJECT)
fun FirDeclaration.skipDeclarationForEnumClass(): Boolean {
fun FirDeclaration<*>.skipDeclarationForEnumClass(): Boolean {
if (this is FirConstructor) return isPrimary && valueParameters.isEmpty()
if (this !is FirSimpleFunction) return false
@@ -440,14 +440,14 @@ internal class FirIdeRenderer private constructor(
tabbedString = oldTabbedString
}
private inline fun underContainingDeclaration(firDeclaration: FirDeclaration, body: () -> Unit) {
private inline fun underContainingDeclaration(firDeclaration: FirDeclaration<*>, body: () -> Unit) {
val oldContainingDeclaration = containingDeclaration
containingDeclaration = firDeclaration
body()
containingDeclaration = oldContainingDeclaration
}
private inline fun StringBuilder.underBlockDeclaration(firDeclaration: FirDeclaration, withBrackets: Boolean = true, body: () -> Unit) {
private inline fun StringBuilder.underBlockDeclaration(firDeclaration: FirDeclaration<*>, withBrackets: Boolean = true, body: () -> Unit) {
val oldLength = length
if (withBrackets) append(" {")
val unchangedLength = length
@@ -469,7 +469,7 @@ internal class FirIdeRenderer private constructor(
private fun StringBuilder.appendTabs() = append(tabbedString)
private fun underBlockDeclaration(firDeclaration: FirDeclaration, firBlock: FirBlock, data: StringBuilder) {
private fun underBlockDeclaration(firDeclaration: FirDeclaration<*>, firBlock: FirBlock, data: StringBuilder) {
data.underBlockDeclaration(firDeclaration) {
firBlock.accept(this, data)
}
@@ -502,8 +502,8 @@ internal class FirIdeRenderer private constructor(
companion object {
fun render(
firDeclaration: FirDeclaration,
containingDeclaration: FirDeclaration?,
firDeclaration: FirDeclaration<*>,
containingDeclaration: FirDeclaration<*>?,
options: KtDeclarationRendererOptions,
session: FirSession
): String {
@@ -679,7 +679,7 @@ internal class FirIdeRenderer private constructor(
}
private fun getClassifierKindPrefix(classifier: FirDeclaration): String = when (classifier) {
private fun getClassifierKindPrefix(classifier: FirDeclaration<*>): String = when (classifier) {
is FirTypeAlias -> "typealias"
is FirRegularClass ->
if (classifier.isCompanion) {
@@ -6,7 +6,9 @@
package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import org.jetbrains.kotlin.fir.FirFakeSourceElementKind
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
import org.jetbrains.kotlin.fir.originalIfFakeOverride
import org.jetbrains.kotlin.fir.render
@@ -16,14 +18,14 @@ import org.jetbrains.kotlin.idea.frontend.api.fir.utils.FirRefWithValidityCheck
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbolOrigin
internal interface KtFirSymbol<out F : FirDeclaration> : KtSymbol, ValidityTokenOwner {
internal interface KtFirSymbol<out F : FirDeclaration<*>> : KtSymbol, ValidityTokenOwner {
val firRef: FirRefWithValidityCheck<F>
override val origin: KtSymbolOrigin get() = firRef.withFir { it.ktSymbolOrigin() }
}
private tailrec fun FirDeclaration.ktSymbolOrigin(): KtSymbolOrigin = when (origin) {
private tailrec fun FirDeclaration<*>.ktSymbolOrigin(): KtSymbolOrigin = when (origin) {
FirDeclarationOrigin.Source -> {
if (source?.kind == FirFakeSourceElementKind.DataClassGeneratedMembers
|| source?.kind == FirFakeSourceElementKind.EnumGeneratedDeclaration
@@ -58,5 +60,5 @@ private tailrec fun FirDeclaration.ktSymbolOrigin(): KtSymbolOrigin = when (orig
}
class InvalidFirDeclarationOriginForSymbol(declaration: FirDeclaration) :
class InvalidFirDeclarationOriginForSymbol(declaration: FirDeclaration<*>) :
IllegalStateException("Invalid FirDeclarationOrigin ${declaration.origin::class.simpleName} for ${declaration.render()}")
@@ -7,9 +7,10 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.resolve.transformers.resolveSupertypesInTheAir
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.coneType
import org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve.ResolveType
import org.jetbrains.kotlin.idea.frontend.api.tokens.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.annotations.KtFirAnnotationCall
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.FirRefWithValidityCheck
@@ -17,9 +18,10 @@ import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotationCall
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtTypeAndAnnotations
import org.jetbrains.kotlin.idea.frontend.api.tokens.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
internal class KtFirTypeAndAnnotations<T : FirDeclaration>(
internal class KtFirTypeAndAnnotations<T : FirDeclaration<*>>(
private val containingDeclaration: FirRefWithValidityCheck<T>,
typeResolvePhase: FirResolvePhase,
_builder: KtSymbolByFirBuilder,
@@ -82,7 +84,7 @@ private fun List<FirTypeRef>.mapToTypeAndAnnotations(
KtSimpleFirTypeAndAnnotations(typeRef.coneType, annotations, builder, containingDeclaration.token)
}
internal fun FirRefWithValidityCheck<FirTypedDeclaration>.returnTypeAndAnnotations(
internal fun FirRefWithValidityCheck<FirTypedDeclaration<*>>.returnTypeAndAnnotations(
typeResolvePhase: FirResolvePhase,
builder: KtSymbolByFirBuilder
) = KtFirTypeAndAnnotations(this, typeResolvePhase, builder) { it.returnTypeRef }
@@ -100,4 +102,4 @@ internal fun FirRefWithValidityCheck<FirCallableMemberDeclaration<*>>.dispatchRe
fir.dispatchReceiverType?.let {
builder.typeBuilder.buildKtType(it)
}
}
}
@@ -7,15 +7,10 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols.annotations
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.idea.fir.findPsi
import org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve.ResolveType
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.*
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.FirRefWithValidityCheck
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertConstantExpression
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.mapAnnotationParameters
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotationCall
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtNamedConstantValue
import org.jetbrains.kotlin.idea.frontend.api.tokens.ValidityToken
@@ -23,7 +18,7 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.psi.KtCallElement
internal class KtFirAnnotationCall(
private val containingDeclaration: FirRefWithValidityCheck<FirDeclaration>,
private val containingDeclaration: FirRefWithValidityCheck<FirDeclaration<*>>,
annotationCall: FirAnnotationCall
) : KtAnnotationCall() {
@@ -7,12 +7,9 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols.annotations
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirAnnotatedDeclaration
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.expandedConeType
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.coneClassLikeType
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
import org.jetbrains.kotlin.fir.resolve.transformers.ensureResolved
import org.jetbrains.kotlin.fir.types.classId
import org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve.ResolveType
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.FirRefWithValidityCheck
@@ -22,16 +19,16 @@ import org.jetbrains.kotlin.name.ClassId
internal fun FirAnnotationCall.getClassId(session: FirSession): ClassId? =
coneClassLikeType?.fullyExpandedType(session)?.classId
internal fun FirRefWithValidityCheck<FirAnnotatedDeclaration>.toAnnotationsList() = withFir { fir ->
internal fun FirRefWithValidityCheck<FirAnnotatedDeclaration<*>>.toAnnotationsList() = withFir { fir ->
fir.annotations.map { KtFirAnnotationCall(this, it) }
}
internal fun FirRefWithValidityCheck<FirAnnotatedDeclaration>.containsAnnotation(classId: ClassId): Boolean =
internal fun FirRefWithValidityCheck<FirAnnotatedDeclaration<*>>.containsAnnotation(classId: ClassId): Boolean =
withFir(ResolveType.AnnotationType) { fir ->
fir.annotations.any { it.getClassId(fir.moduleData.session) == classId }
}
internal fun FirRefWithValidityCheck<FirAnnotatedDeclaration>.getAnnotationClassIds(): Collection<ClassId> =
internal fun FirRefWithValidityCheck<FirAnnotatedDeclaration<*>>.getAnnotationClassIds(): Collection<ClassId> =
withFir(ResolveType.AnnotationType) { fir ->
fir.annotations.mapNotNull { it.getClassId(fir.moduleData.session) }
}
}
@@ -8,23 +8,14 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirRenderer
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.renderWithType
import org.jetbrains.kotlin.fir.resolve.firProvider
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
import org.jetbrains.kotlin.fir.types.coneType
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
import org.jetbrains.kotlin.idea.frontend.api.fir.buildSymbol
import org.jetbrains.kotlin.idea.fir.low.level.api.util.getElementTextInContext
import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.psi.KtDeclaration
internal fun KtFirSymbol<FirMemberDeclaration>.getModality(
internal fun KtFirSymbol<FirMemberDeclaration<*>>.getModality(
phase: FirResolvePhase = FirResolvePhase.STATUS,
defaultModality: Modality? = null
) =
@@ -35,7 +26,7 @@ internal fun KtFirSymbol<FirMemberDeclaration>.getModality(
}
private fun FirDeclaration.invalidModalityError(): Nothing {
private fun FirDeclaration<*>.invalidModalityError(): Nothing {
error(
"""|Symbol modality should not be null, looks like the FIR symbol was not properly resolved
|
@@ -46,7 +37,7 @@ private fun FirDeclaration.invalidModalityError(): Nothing {
}
internal fun <F : FirMemberDeclaration> KtFirSymbol<F>.getVisibility(phase: FirResolvePhase = FirResolvePhase.STATUS): Visibility =
internal fun <F : FirMemberDeclaration<F>> KtFirSymbol<F>.getVisibility(phase: FirResolvePhase = FirResolvePhase.STATUS): Visibility =
firRef.withFir(phase) { fir -> fir.visibility }
internal fun KtFirSymbol<FirCallableDeclaration<*>>.getCallableIdIfNonLocal(): CallableId? =
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.idea.fir.low.level.api.ideSessionComponents
import org.jetbrains.kotlin.ir.util.IdSignature
internal inline fun <reified D : FirDeclaration> FirScope.findDeclarationWithSignature(
internal inline fun <reified D : FirDeclaration<*>> FirScope.findDeclarationWithSignature(
signature: IdSignature,
firSession: FirSession,
processor: FirScope.((FirBasedSymbol<*>) -> Unit) -> Unit
@@ -31,7 +31,7 @@ internal inline fun <reified D : FirDeclaration> FirScope.findDeclarationWithSig
return foundSymbol
}
internal inline fun <reified D : FirDeclaration> Collection<FirCallableSymbol<*>>.findDeclarationWithSignatureBySymbols(
internal inline fun <reified D : FirDeclaration<*>> Collection<FirCallableSymbol<*>>.findDeclarationWithSignatureBySymbols(
signature: IdSignature,
firSession: FirSession
): D? {
@@ -45,7 +45,7 @@ internal inline fun <reified D : FirDeclaration> Collection<FirCallableSymbol<*>
return null
}
internal fun FirDeclaration.createSignature(): IdSignature {
internal fun FirDeclaration<*>.createSignature(): IdSignature {
val signatureComposer = moduleData.session.ideSessionComponents.signatureComposer
return signatureComposer.composeSignature(this)
?: error("Could not compose signature for ${this.renderWithType(FirRenderer.RenderMode.WithResolvePhases)}, looks like it is private or local")
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.idea.frontend.api.tokens.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.tokens.assertIsValidAndAccessible
import java.lang.ref.WeakReference
internal class FirRefWithValidityCheck<out D : FirDeclaration>(fir: D, resolveState: FirModuleResolveState, val token: ValidityToken) {
internal class FirRefWithValidityCheck<out D : FirDeclaration<*>>(fir: D, resolveState: FirModuleResolveState, val token: ValidityToken) {
private val firWeakRef = WeakReference(fir)
private val resolveStateWeakRef = WeakReference(resolveState)
@@ -138,5 +138,5 @@ internal class FirRefWithValidityCheck<out D : FirDeclaration>(fir: D, resolveSt
}
@Suppress("NOTHING_TO_INLINE")
internal inline fun <D : FirDeclaration> ValidityTokenOwner.firRef(fir: D, resolveState: FirModuleResolveState) =
FirRefWithValidityCheck(fir, resolveState, token)
internal inline fun <D : FirDeclaration<*>> ValidityTokenOwner.firRef(fir: D, resolveState: FirModuleResolveState) =
FirRefWithValidityCheck(fir, resolveState, token)
@@ -40,7 +40,7 @@ class KtAnalysisSessionFe10BindingHolder private constructor(
fun buildSymbol(firElement: FirElement): KtSymbol? = firElement.buildSymbol(firAnalysisSession.firSymbolBuilder)
@Suppress("UNCHECKED_CAST", "NON_PUBLIC_CALL_FROM_PUBLIC_INLINE")
inline fun <T : FirDeclaration, R> withFir(ktSymbol: KtSymbol, crossinline action: (T) -> R) =
inline fun <T : FirDeclaration<*>, R> withFir(ktSymbol: KtSymbol, crossinline action: (T) -> R) =
(ktSymbol as KtFirSymbol<T>).firRef.withFir(action = action)
fun toSignature(ktSymbol: KtSymbol): IdSignature = (ktSymbol as KtFirSymbol<*>).firRef.withFir { it.createSignature() }
@@ -52,4 +52,4 @@ class KtAnalysisSessionFe10BindingHolder private constructor(
return KtAnalysisSessionFe10BindingHolder(firAnalysisSession)
}
}
}
}