From 871fd09e3f7b7c12be64eaaa8415761bfd34b99e Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Wed, 9 Nov 2022 15:04:33 +0100 Subject: [PATCH] [AA FIR] KtFirClassLikeSymbolPointer: replace lambda with regular class check ^KT-54311 --- .../api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt | 4 +++- .../analysis/api/fir/symbols/KtFirTypeAliasSymbol.kt | 2 +- .../fir/symbols/pointers/KtFirClassLikeSymbolPointer.kt | 8 ++++++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt index 4f0628340e4..bce73f91fb5 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt @@ -109,7 +109,9 @@ internal class KtFirNamedClassOrObjectSymbol( KtSymbolKind.LOCAL -> throw CanNotCreateSymbolPointerForLocalLibraryDeclarationException(classIdIfNonLocal?.asString() ?: name.asString()) - KtSymbolKind.CLASS_MEMBER, KtSymbolKind.TOP_LEVEL -> KtFirClassLikeSymbolPointer(classIdIfNonLocal!!) { it as? KtNamedClassOrObjectSymbol } + KtSymbolKind.CLASS_MEMBER, KtSymbolKind.TOP_LEVEL -> + KtFirClassLikeSymbolPointer(classIdIfNonLocal!!, KtNamedClassOrObjectSymbol::class) + else -> throw UnsupportedSymbolKind(this::class, symbolKind) } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeAliasSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeAliasSymbol.kt index 58d27005ece..e97f903021f 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeAliasSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeAliasSymbol.kt @@ -64,7 +64,7 @@ internal class KtFirTypeAliasSymbol( KtSymbolKind.LOCAL -> throw CanNotCreateSymbolPointerForLocalLibraryDeclarationException(classIdIfNonLocal?.asString() ?: name.asString()) - KtSymbolKind.CLASS_MEMBER, KtSymbolKind.TOP_LEVEL -> KtFirClassLikeSymbolPointer(classIdIfNonLocal!!) { it as? KtTypeAliasSymbol } + KtSymbolKind.CLASS_MEMBER, KtSymbolKind.TOP_LEVEL -> KtFirClassLikeSymbolPointer(classIdIfNonLocal!!, KtTypeAliasSymbol::class) else -> throw UnsupportedSymbolKind(this::class, symbolKind) } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirClassLikeSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirClassLikeSymbolPointer.kt index 99268455f9a..0b00ea9aa4a 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirClassLikeSymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirClassLikeSymbolPointer.kt @@ -10,15 +10,19 @@ import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.name.ClassId +import kotlin.reflect.KClass internal class KtFirClassLikeSymbolPointer( private val classId: ClassId, - private val castAction: (KtClassLikeSymbol) -> T?, + private val expectedClass: KClass, ) : KtSymbolPointer() { @Deprecated("Consider using org.jetbrains.kotlin.analysis.api.KtAnalysisSession.restoreSymbol") override fun restoreSymbol(analysisSession: KtAnalysisSession): T? { require(analysisSession is KtFirAnalysisSession) val classLikeSymbol = analysisSession.firSymbolBuilder.classifierBuilder.buildClassLikeSymbolByClassId(classId) ?: return null - return castAction(classLikeSymbol) + if (!expectedClass.isInstance(classLikeSymbol)) return null + + @Suppress("UNCHECKED_CAST") + return classLikeSymbol as T } }