FIR IDE: allow KtClassOrObject to resolve to null KtSymbol
At PSI level, an enum entry is a `KtClassOrObject`. But the resolved FIR counterpart `FirEnumEntry` is not an `FirRegularClass`.
This commit is contained in:
committed by
Mikhail Glukhikh
parent
bea90e0578
commit
6dc75c2e51
+3
-2
@@ -42,7 +42,7 @@ public abstract class KtSymbolProvider : KtAnalysisSessionComponent() {
|
||||
public abstract fun getVariableSymbol(psi: KtProperty): KtVariableSymbol
|
||||
public abstract fun getAnonymousObjectSymbol(psi: KtObjectLiteralExpression): KtAnonymousObjectSymbol
|
||||
public abstract fun getClassOrObjectSymbol(psi: KtClassOrObject): KtClassOrObjectSymbol
|
||||
public abstract fun getNamedClassOrObjectSymbol(psi: KtClassOrObject): KtNamedClassOrObjectSymbol
|
||||
public abstract fun getNamedClassOrObjectSymbol(psi: KtClassOrObject): KtNamedClassOrObjectSymbol?
|
||||
public abstract fun getPropertyAccessorSymbol(psi: KtPropertyAccessor): KtPropertyAccessorSymbol
|
||||
|
||||
public abstract fun getClassOrObjectSymbolByClassId(classId: ClassId): KtClassOrObjectSymbol?
|
||||
@@ -102,7 +102,8 @@ public interface KtSymbolProviderMixIn : KtAnalysisSessionMixIn {
|
||||
public fun KtClassOrObject.getClassOrObjectSymbol(): KtClassOrObjectSymbol =
|
||||
analysisSession.symbolProvider.getClassOrObjectSymbol(this)
|
||||
|
||||
public fun KtClassOrObject.getNamedClassOrObjectSymbol(): KtNamedClassOrObjectSymbol =
|
||||
/** Gets the corresponding class or object symbol or null if the given [KtClassOrObject] is an enum entry. */
|
||||
public fun KtClassOrObject.getNamedClassOrObjectSymbol(): KtNamedClassOrObjectSymbol? =
|
||||
analysisSession.symbolProvider.getNamedClassOrObjectSymbol(this)
|
||||
|
||||
public fun KtPropertyAccessor.getPropertyAccessorSymbol(): KtPropertyAccessorSymbol =
|
||||
|
||||
+2
-2
@@ -332,8 +332,8 @@ internal fun KtSymbolWithMembers.createInnerClasses(manager: PsiManager): List<F
|
||||
|
||||
internal fun KtClassOrObject.checkIsInheritor(baseClassOrigin: KtClassOrObject, checkDeep: Boolean): Boolean {
|
||||
return analyseForLightClasses(this) {
|
||||
val thisSymbol = this@checkIsInheritor.getNamedClassOrObjectSymbol()
|
||||
val baseSymbol = baseClassOrigin.getNamedClassOrObjectSymbol()
|
||||
val thisSymbol = this@checkIsInheritor.getNamedClassOrObjectSymbol() ?: return false
|
||||
val baseSymbol = baseClassOrigin.getNamedClassOrObjectSymbol() ?: return false
|
||||
|
||||
if (thisSymbol == baseSymbol) return@analyseForLightClasses false
|
||||
|
||||
|
||||
+4
-5
@@ -9,10 +9,7 @@ import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.renderWithType
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFirFile
|
||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFirOfType
|
||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.withFirDeclarationOfType
|
||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.*
|
||||
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
|
||||
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
|
||||
@@ -112,8 +109,10 @@ internal class KtFirSymbolProvider(
|
||||
}
|
||||
}
|
||||
|
||||
override fun getNamedClassOrObjectSymbol(psi: KtClassOrObject): KtNamedClassOrObjectSymbol = withValidityAssertion {
|
||||
override fun getNamedClassOrObjectSymbol(psi: KtClassOrObject): KtNamedClassOrObjectSymbol? = withValidityAssertion {
|
||||
require(psi !is KtObjectDeclaration || psi.parent !is KtObjectLiteralExpression)
|
||||
// A KtClassOrObject may also map to an FirEnumEntry. Hence, we need to return null in this case.
|
||||
if (psi is KtEnumEntry) return null
|
||||
psi.withFirDeclarationOfType<FirRegularClass, KtNamedClassOrObjectSymbol>(resolveState) {
|
||||
firSymbolBuilder.classifierBuilder.buildNamedClassOrObjectSymbol(it)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user