[FIR] Make FirTypeParameter.containingDeclarationSymbol not null

Also fix initializing this property in all places
This commit is contained in:
Dmitriy Novozhilov
2022-02-22 12:52:41 +03:00
committed by teamcity
parent 35a2a6bcec
commit 18fc2802e5
10 changed files with 24 additions and 17 deletions
@@ -45,10 +45,7 @@ internal class KtFirSymbolContainingDeclarationProvider(
} }
return when (symbol) { return when (symbol) {
is KtFirTypeParameterSymbol -> { is KtFirTypeParameterSymbol -> {
symbol.firSymbol.containingDeclarationSymbol?.let { containingDeclaration -> firSymbolBuilder.buildSymbol(symbol.firSymbol.containingDeclarationSymbol) as KtSymbolWithKind
firSymbolBuilder.buildSymbol(containingDeclaration) as KtSymbolWithKind
}
} }
is KtSymbolWithKind -> when (symbol.origin) { is KtSymbolWithKind -> when (symbol.origin) {
KtSymbolOrigin.SOURCE, KtSymbolOrigin.SOURCE_MEMBER_GENERATED -> KtSymbolOrigin.SOURCE, KtSymbolOrigin.SOURCE_MEMBER_GENERATED ->
@@ -73,7 +73,7 @@ class FirTypeDeserializer(
origin = FirDeclarationOrigin.Library origin = FirDeclarationOrigin.Library
this.name = name this.name = name
this.symbol = symbol this.symbol = symbol
this.containingDeclarationSymbol = containingSymbol this.containingDeclarationSymbol = containingSymbol ?: error("Top-level type parameter ???")
variance = proto.variance.convertVariance() variance = proto.variance.convertVariance()
isReified = proto.reified isReified = proto.reified
} }
@@ -35,6 +35,7 @@ import org.jetbrains.kotlin.fir.resolve.constructType
import org.jetbrains.kotlin.fir.resolve.defaultType import org.jetbrains.kotlin.fir.resolve.defaultType
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
@@ -89,7 +90,10 @@ class FirJavaFacade(
return classId.relativeClassName.topLevelName() in knownNames return classId.relativeClassName.topLevelName() in knownNames
} }
private fun JavaTypeParameter.toFirTypeParameter(javaTypeParameterStack: JavaTypeParameterStack): FirTypeParameter { private fun JavaTypeParameter.toFirTypeParameter(
javaTypeParameterStack: JavaTypeParameterStack,
containingDeclarationSymbol: FirBasedSymbol<*>
): FirTypeParameter {
return buildTypeParameter { return buildTypeParameter {
moduleData = baseModuleData moduleData = baseModuleData
origin = FirDeclarationOrigin.Java origin = FirDeclarationOrigin.Java
@@ -101,6 +105,7 @@ class FirJavaFacade(
javaTypeParameterStack.addParameter(this@toFirTypeParameter, symbol) javaTypeParameterStack.addParameter(this@toFirTypeParameter, symbol)
// TODO: should be lazy (in case annotations refer to the containing class) // TODO: should be lazy (in case annotations refer to the containing class)
annotations.addFromJava(session, this@toFirTypeParameter, javaTypeParameterStack) annotations.addFromJava(session, this@toFirTypeParameter, javaTypeParameterStack)
this.containingDeclarationSymbol = containingDeclarationSymbol
for (upperBound in this@toFirTypeParameter.upperBounds) { for (upperBound in this@toFirTypeParameter.upperBounds) {
bounds += upperBound.toFirJavaTypeRef(session, javaTypeParameterStack) bounds += upperBound.toFirJavaTypeRef(session, javaTypeParameterStack)
} }
@@ -113,8 +118,12 @@ class FirJavaFacade(
} }
} }
private fun List<JavaTypeParameter>.convertTypeParameters(stack: JavaTypeParameterStack): List<FirTypeParameter> = private fun List<JavaTypeParameter>.convertTypeParameters(
map { it.toFirTypeParameter(stack) } stack: JavaTypeParameterStack,
containingDeclarationSymbol: FirBasedSymbol<*>
): List<FirTypeParameter> {
return map { it.toFirTypeParameter(stack, containingDeclarationSymbol) }
}
private fun JavaClass.hasMetadataAnnotation(): Boolean = private fun JavaClass.hasMetadataAnnotation(): Boolean =
annotations.any { it.classId?.asSingleFqName() == JvmAnnotationNames.METADATA_FQ_NAME } annotations.any { it.classId?.asSingleFqName() == JvmAnnotationNames.METADATA_FQ_NAME }
@@ -235,7 +244,7 @@ class FirJavaFacade(
val effectiveVisibility = parentEffectiveVisibility.lowerBound(selfEffectiveVisibility, session.typeContext) val effectiveVisibility = parentEffectiveVisibility.lowerBound(selfEffectiveVisibility, session.typeContext)
parentClassEffectiveVisibilityCache[classSymbol] = effectiveVisibility parentClassEffectiveVisibilityCache[classSymbol] = effectiveVisibility
val classTypeParameters = javaClass.typeParameters.convertTypeParameters(javaTypeParameterStack) val classTypeParameters = javaClass.typeParameters.convertTypeParameters(javaTypeParameterStack, classSymbol)
typeParameters += classTypeParameters typeParameters += classTypeParameters
if (!isStatic && parentClassSymbol != null) { if (!isStatic && parentClassSymbol != null) {
typeParameters += parentClassSymbol.fir.typeParameters.map { typeParameters += parentClassSymbol.fir.typeParameters.map {
@@ -445,7 +454,7 @@ class FirJavaFacade(
name = methodName name = methodName
returnTypeRef = returnType.toFirJavaTypeRef(session, javaTypeParameterStack) returnTypeRef = returnType.toFirJavaTypeRef(session, javaTypeParameterStack)
isStatic = javaMethod.isStatic isStatic = javaMethod.isStatic
typeParameters += javaMethod.typeParameters.convertTypeParameters(javaTypeParameterStack) typeParameters += javaMethod.typeParameters.convertTypeParameters(javaTypeParameterStack, methodSymbol)
for ((index, valueParameter) in javaMethod.valueParameters.withIndex()) { for ((index, valueParameter) in javaMethod.valueParameters.withIndex()) {
valueParameters += valueParameter.toFirValueParameter(session, moduleData, index, javaTypeParameterStack) valueParameters += valueParameter.toFirValueParameter(session, moduleData, index, javaTypeParameterStack)
} }
@@ -526,7 +535,7 @@ class FirJavaFacade(
typeParameters += classTypeParameters.map { buildConstructedClassTypeParameterRef { symbol = it.symbol } } typeParameters += classTypeParameters.map { buildConstructedClassTypeParameterRef { symbol = it.symbol } }
if (javaConstructor != null) { if (javaConstructor != null) {
this.typeParameters += javaConstructor.typeParameters.convertTypeParameters(javaTypeParameterStack) this.typeParameters += javaConstructor.typeParameters.convertTypeParameters(javaTypeParameterStack, constructorSymbol)
annotationBuilder = { javaConstructor.convertAnnotationsToFir(session, javaTypeParameterStack) } annotationBuilder = { javaConstructor.convertAnnotationsToFir(session, javaTypeParameterStack) }
for ((index, valueParameter) in javaConstructor.valueParameters.withIndex()) { for ((index, valueParameter) in javaConstructor.valueParameters.withIndex()) {
valueParameters += valueParameter.toFirValueParameter(session, moduleData, index, javaTypeParameterStack) valueParameters += valueParameter.toFirValueParameter(session, moduleData, index, javaTypeParameterStack)
@@ -142,6 +142,7 @@ class FirSamResolverImpl(
variance = Variance.INVARIANT variance = Variance.INVARIANT
isReified = false isReified = false
annotations += declaredTypeParameter.annotations annotations += declaredTypeParameter.annotations
containingDeclarationSymbol = symbol
} }
} }
@@ -158,7 +158,7 @@ private fun createToFreshVariableSubstitutorAndAddInitialConstraints(
} }
private fun FirTypeParameter.getTypeParameterFromExpandedClass(index: Int, session: FirSession): FirTypeParameter { private fun FirTypeParameter.getTypeParameterFromExpandedClass(index: Int, session: FirSession): FirTypeParameter {
val containingDeclaration = containingDeclarationSymbol?.fir val containingDeclaration = containingDeclarationSymbol.fir
if (containingDeclaration is FirRegularClass) { if (containingDeclaration is FirRegularClass) {
return containingDeclaration.typeParameters.elementAtOrNull(index)?.symbol?.fir ?: this return containingDeclaration.typeParameters.elementAtOrNull(index)?.symbol?.fir ?: this
} else if (containingDeclaration is FirTypeAlias) { } else if (containingDeclaration is FirTypeAlias) {
@@ -29,7 +29,7 @@ abstract class FirTypeParameter : FirTypeParameterRef, FirDeclaration() {
abstract override val attributes: FirDeclarationAttributes abstract override val attributes: FirDeclarationAttributes
abstract val name: Name abstract val name: Name
abstract override val symbol: FirTypeParameterSymbol abstract override val symbol: FirTypeParameterSymbol
abstract val containingDeclarationSymbol: FirBasedSymbol<*>? abstract val containingDeclarationSymbol: FirBasedSymbol<*>
abstract val variance: Variance abstract val variance: Variance
abstract val isReified: Boolean abstract val isReified: Boolean
abstract val bounds: List<FirTypeRef> abstract val bounds: List<FirTypeRef>
@@ -37,7 +37,7 @@ class FirTypeParameterBuilder : FirAnnotationContainerBuilder {
var attributes: FirDeclarationAttributes = FirDeclarationAttributes() var attributes: FirDeclarationAttributes = FirDeclarationAttributes()
lateinit var name: Name lateinit var name: Name
lateinit var symbol: FirTypeParameterSymbol lateinit var symbol: FirTypeParameterSymbol
var containingDeclarationSymbol: FirBasedSymbol<*>? = null lateinit var containingDeclarationSymbol: FirBasedSymbol<*>
lateinit var variance: Variance lateinit var variance: Variance
var isReified: Boolean by kotlin.properties.Delegates.notNull<Boolean>() var isReified: Boolean by kotlin.properties.Delegates.notNull<Boolean>()
val bounds: MutableList<FirTypeRef> = mutableListOf() val bounds: MutableList<FirTypeRef> = mutableListOf()
@@ -33,7 +33,7 @@ internal class FirTypeParameterImpl(
override val attributes: FirDeclarationAttributes, override val attributes: FirDeclarationAttributes,
override val name: Name, override val name: Name,
override val symbol: FirTypeParameterSymbol, override val symbol: FirTypeParameterSymbol,
override val containingDeclarationSymbol: FirBasedSymbol<*>?, override val containingDeclarationSymbol: FirBasedSymbol<*>,
override val variance: Variance, override val variance: Variance,
override val isReified: Boolean, override val isReified: Boolean,
override val bounds: MutableList<FirTypeRef>, override val bounds: MutableList<FirTypeRef>,
@@ -37,7 +37,7 @@ class FirTypeParameterSymbol : FirClassifierSymbol<FirTypeParameter>() {
val isReified: Boolean val isReified: Boolean
get() = fir.isReified get() = fir.isReified
val containingDeclarationSymbol: FirBasedSymbol<*>? val containingDeclarationSymbol: FirBasedSymbol<*>
get() = fir.containingDeclarationSymbol get() = fir.containingDeclarationSymbol
} }
@@ -294,7 +294,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
typeParameter.configure { typeParameter.configure {
+name +name
+symbol("FirTypeParameterSymbol") +symbol("FirTypeParameterSymbol")
+field("containingDeclarationSymbol", firBasedSymbolType, "*", nullable = true).apply { +field("containingDeclarationSymbol", firBasedSymbolType, "*").apply {
withBindThis = false withBindThis = false
} }
+field(varianceType) +field(varianceType)