[Analysis API] fix symbol kind for KtTypeAliasSymbol

they can be non-toplevel
This commit is contained in:
Ilya Kirillov
2022-10-14 15:43:41 +02:00
committed by teamcity
parent 3ea29e42b9
commit 98e665a652
6 changed files with 38 additions and 20 deletions
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.*
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.KtFe10DescSymbol
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.classId
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktVisibility
@@ -17,6 +18,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointe
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.name.ClassId
@@ -38,6 +40,9 @@ internal class KtFe10DescTypeAliasSymbol(
override val expandedType: KtType
get() = withValidityAssertion { descriptor.expandedType.toKtType(analysisContext) }
override val symbolKind: KtSymbolKind
get() = withValidityAssertion { descriptor.ktSymbolKind }
override val classIdIfNonLocal: ClassId?
get() = withValidityAssertion { descriptor.classId }
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.bas
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.KtFe10PsiSymbol
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.createErrorType
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.ktSymbolKind
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.ktVisibility
import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached
import org.jetbrains.kotlin.analysis.api.symbols.KtTypeAliasSymbol
@@ -20,6 +21,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointe
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility
@@ -52,6 +54,9 @@ internal class KtFe10PsiTypeAliasSymbol(
override val classIdIfNonLocal: ClassId?
get() = withValidityAssertion { psi.getClassId() }
override val symbolKind: KtSymbolKind
get() = withValidityAssertion { psi.ktSymbolKind }
override fun createPointer(): KtSymbolPointer<KtTypeAliasSymbol> = withValidityAssertion {
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
}
@@ -101,20 +101,7 @@ internal class KtFirNamedClassOrObjectSymbol(
firSymbol.classKind.toKtClassKind(isCompanionObject = firSymbol.isCompanion)
}
override val symbolKind: KtSymbolKind
get() = withValidityAssertion {
when {
// TODO: hack should be dropped after KT-54390
firSymbol.isLocal && (firSymbol.fir.getContainingDeclaration(firResolveSession.useSiteFirSession) as? FirClass)?.let { clazz ->
clazz.declarations.none { it === firSymbol.fir }
} == true -> KtSymbolKind.LOCAL
firSymbol.classId.isNestedClass -> KtSymbolKind.CLASS_MEMBER
firSymbol.isLocal -> KtSymbolKind.LOCAL
else -> KtSymbolKind.TOP_LEVEL
}
}
override val symbolKind: KtSymbolKind get() = withValidityAssertion { getSymbolKind(firResolveSession) }
override fun createPointer(): KtSymbolPointer<KtNamedClassOrObjectSymbol> = withValidityAssertion {
KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it }
@@ -6,23 +6,27 @@
package org.jetbrains.kotlin.analysis.api.fir.symbols
import org.jetbrains.kotlin.KtFakeSourceElementKind
import org.jetbrains.kotlin.analysis.api.fir.utils.firSymbol
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeOwner
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.withFirEntry
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.FirSimpleFunction
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticPropertyAccessor
import org.jetbrains.kotlin.fir.scopes.impl.importedFromObjectData
import org.jetbrains.kotlin.fir.scopes.impl.originalForWrappedIntegerOperator
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.analysis.utils.errors.buildErrorWithAttachment
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.isLocal
import org.jetbrains.kotlin.fir.resolve.getContainingDeclaration
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol
internal interface KtFirSymbol<out S : FirBasedSymbol<*>> : KtSymbol, KtLifetimeOwner {
val firSymbol: S
@@ -95,3 +99,18 @@ internal tailrec fun FirDeclaration.ktSymbolOrigin(): KtSymbolOrigin = when (ori
withFirEntry("firToGetOrigin", this@ktSymbolOrigin)
}
}
internal fun KtClassLikeSymbol.getSymbolKind(firResolveSession: LLFirResolveSession): KtSymbolKind {
val firSymbol = firSymbol as FirClassLikeSymbol<*>
return when {
// TODO: hack should be dropped after KT-54390
firSymbol.isLocal && (firSymbol.fir.getContainingDeclaration(firResolveSession.useSiteFirSession) as? FirClass)?.let { clazz ->
clazz.declarations.none { it === firSymbol.fir }
} == true -> KtSymbolKind.LOCAL
firSymbol.classId.isNestedClass -> KtSymbolKind.CLASS_MEMBER
firSymbol.isLocal -> KtSymbolKind.LOCAL
else -> KtSymbolKind.TOP_LEVEL
}
}
@@ -17,9 +17,11 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.declarations.utils.isLocal
import org.jetbrains.kotlin.fir.declarations.utils.visibility
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
import org.jetbrains.kotlin.name.ClassId
@@ -52,6 +54,8 @@ internal class KtFirTypeAliasSymbol(
KtFirAnnotationListForDeclaration.create(firSymbol, firResolveSession.useSiteFirSession, token)
}
override val symbolKind: KtSymbolKind get() = withValidityAssertion { getSymbolKind(firResolveSession) }
override fun createPointer(): KtSymbolPointer<KtTypeAliasSymbol> = withValidityAssertion {
KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it }
TODO("Creating symbols for library typealiases is not supported yet")
@@ -41,8 +41,6 @@ public abstract class KtTypeAliasSymbol : KtClassLikeSymbol(),
KtSymbolWithVisibility,
KtNamedSymbol {
final override val symbolKind: KtSymbolKind get() = withValidityAssertion { KtSymbolKind.TOP_LEVEL }
/**
* Returns type from right-hand site of type alias
* If type alias has type parameters, then those type parameters will be present in result type