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 getVariableSymbol(psi: KtProperty): KtVariableSymbol
|
||||||
public abstract fun getAnonymousObjectSymbol(psi: KtObjectLiteralExpression): KtAnonymousObjectSymbol
|
public abstract fun getAnonymousObjectSymbol(psi: KtObjectLiteralExpression): KtAnonymousObjectSymbol
|
||||||
public abstract fun getClassOrObjectSymbol(psi: KtClassOrObject): KtClassOrObjectSymbol
|
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 getPropertyAccessorSymbol(psi: KtPropertyAccessor): KtPropertyAccessorSymbol
|
||||||
|
|
||||||
public abstract fun getClassOrObjectSymbolByClassId(classId: ClassId): KtClassOrObjectSymbol?
|
public abstract fun getClassOrObjectSymbolByClassId(classId: ClassId): KtClassOrObjectSymbol?
|
||||||
@@ -102,7 +102,8 @@ public interface KtSymbolProviderMixIn : KtAnalysisSessionMixIn {
|
|||||||
public fun KtClassOrObject.getClassOrObjectSymbol(): KtClassOrObjectSymbol =
|
public fun KtClassOrObject.getClassOrObjectSymbol(): KtClassOrObjectSymbol =
|
||||||
analysisSession.symbolProvider.getClassOrObjectSymbol(this)
|
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)
|
analysisSession.symbolProvider.getNamedClassOrObjectSymbol(this)
|
||||||
|
|
||||||
public fun KtPropertyAccessor.getPropertyAccessorSymbol(): KtPropertyAccessorSymbol =
|
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 {
|
internal fun KtClassOrObject.checkIsInheritor(baseClassOrigin: KtClassOrObject, checkDeep: Boolean): Boolean {
|
||||||
return analyseForLightClasses(this) {
|
return analyseForLightClasses(this) {
|
||||||
val thisSymbol = this@checkIsInheritor.getNamedClassOrObjectSymbol()
|
val thisSymbol = this@checkIsInheritor.getNamedClassOrObjectSymbol() ?: return false
|
||||||
val baseSymbol = baseClassOrigin.getNamedClassOrObjectSymbol()
|
val baseSymbol = baseClassOrigin.getNamedClassOrObjectSymbol() ?: return false
|
||||||
|
|
||||||
if (thisSymbol == baseSymbol) return@analyseForLightClasses 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.renderWithType
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
|
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
|
import org.jetbrains.kotlin.idea.fir.low.level.api.api.*
|
||||||
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.frontend.api.KtAnalysisSession
|
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
|
import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
|
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)
|
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) {
|
psi.withFirDeclarationOfType<FirRegularClass, KtNamedClassOrObjectSymbol>(resolveState) {
|
||||||
firSymbolBuilder.classifierBuilder.buildNamedClassOrObjectSymbol(it)
|
firSymbolBuilder.classifierBuilder.buildNamedClassOrObjectSymbol(it)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user