diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt index 0c2557c35b7..c15512add2c 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt @@ -45,10 +45,7 @@ internal class KtFirSymbolContainingDeclarationProvider( } return when (symbol) { is KtFirTypeParameterSymbol -> { - symbol.firSymbol.containingDeclarationSymbol?.let { containingDeclaration -> - firSymbolBuilder.buildSymbol(containingDeclaration) as KtSymbolWithKind - } - + firSymbolBuilder.buildSymbol(symbol.firSymbol.containingDeclarationSymbol) as KtSymbolWithKind } is KtSymbolWithKind -> when (symbol.origin) { KtSymbolOrigin.SOURCE, KtSymbolOrigin.SOURCE_MEMBER_GENERATED -> diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirTypeDeserializer.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirTypeDeserializer.kt index 57070460cb1..e64c6d8357c 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirTypeDeserializer.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirTypeDeserializer.kt @@ -73,7 +73,7 @@ class FirTypeDeserializer( origin = FirDeclarationOrigin.Library this.name = name this.symbol = symbol - this.containingDeclarationSymbol = containingSymbol + this.containingDeclarationSymbol = containingSymbol ?: error("Top-level type parameter ???") variance = proto.variance.convertVariance() isReified = proto.reified } diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt index 3c70e68e3b7..16695f91509 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt @@ -35,6 +35,7 @@ import org.jetbrains.kotlin.fir.resolve.constructType import org.jetbrains.kotlin.fir.resolve.defaultType import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider 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.types.* import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef @@ -89,7 +90,10 @@ class FirJavaFacade( return classId.relativeClassName.topLevelName() in knownNames } - private fun JavaTypeParameter.toFirTypeParameter(javaTypeParameterStack: JavaTypeParameterStack): FirTypeParameter { + private fun JavaTypeParameter.toFirTypeParameter( + javaTypeParameterStack: JavaTypeParameterStack, + containingDeclarationSymbol: FirBasedSymbol<*> + ): FirTypeParameter { return buildTypeParameter { moduleData = baseModuleData origin = FirDeclarationOrigin.Java @@ -101,6 +105,7 @@ class FirJavaFacade( javaTypeParameterStack.addParameter(this@toFirTypeParameter, symbol) // TODO: should be lazy (in case annotations refer to the containing class) annotations.addFromJava(session, this@toFirTypeParameter, javaTypeParameterStack) + this.containingDeclarationSymbol = containingDeclarationSymbol for (upperBound in this@toFirTypeParameter.upperBounds) { bounds += upperBound.toFirJavaTypeRef(session, javaTypeParameterStack) } @@ -113,8 +118,12 @@ class FirJavaFacade( } } - private fun List.convertTypeParameters(stack: JavaTypeParameterStack): List = - map { it.toFirTypeParameter(stack) } + private fun List.convertTypeParameters( + stack: JavaTypeParameterStack, + containingDeclarationSymbol: FirBasedSymbol<*> + ): List { + return map { it.toFirTypeParameter(stack, containingDeclarationSymbol) } + } private fun JavaClass.hasMetadataAnnotation(): Boolean = annotations.any { it.classId?.asSingleFqName() == JvmAnnotationNames.METADATA_FQ_NAME } @@ -235,7 +244,7 @@ class FirJavaFacade( val effectiveVisibility = parentEffectiveVisibility.lowerBound(selfEffectiveVisibility, session.typeContext) parentClassEffectiveVisibilityCache[classSymbol] = effectiveVisibility - val classTypeParameters = javaClass.typeParameters.convertTypeParameters(javaTypeParameterStack) + val classTypeParameters = javaClass.typeParameters.convertTypeParameters(javaTypeParameterStack, classSymbol) typeParameters += classTypeParameters if (!isStatic && parentClassSymbol != null) { typeParameters += parentClassSymbol.fir.typeParameters.map { @@ -445,7 +454,7 @@ class FirJavaFacade( name = methodName returnTypeRef = returnType.toFirJavaTypeRef(session, javaTypeParameterStack) isStatic = javaMethod.isStatic - typeParameters += javaMethod.typeParameters.convertTypeParameters(javaTypeParameterStack) + typeParameters += javaMethod.typeParameters.convertTypeParameters(javaTypeParameterStack, methodSymbol) for ((index, valueParameter) in javaMethod.valueParameters.withIndex()) { valueParameters += valueParameter.toFirValueParameter(session, moduleData, index, javaTypeParameterStack) } @@ -526,7 +535,7 @@ class FirJavaFacade( typeParameters += classTypeParameters.map { buildConstructedClassTypeParameterRef { symbol = it.symbol } } if (javaConstructor != null) { - this.typeParameters += javaConstructor.typeParameters.convertTypeParameters(javaTypeParameterStack) + this.typeParameters += javaConstructor.typeParameters.convertTypeParameters(javaTypeParameterStack, constructorSymbol) annotationBuilder = { javaConstructor.convertAnnotationsToFir(session, javaTypeParameterStack) } for ((index, valueParameter) in javaConstructor.valueParameters.withIndex()) { valueParameters += valueParameter.toFirValueParameter(session, moduleData, index, javaTypeParameterStack) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt index 26cc5c25dcf..715d6b4d004 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt @@ -142,6 +142,7 @@ class FirSamResolverImpl( variance = Variance.INVARIANT isReified = false annotations += declaredTypeParameter.annotations + containingDeclarationSymbol = symbol } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CreateFreshTypeVariableSubstitutorStage.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CreateFreshTypeVariableSubstitutorStage.kt index 4d75b3b0e65..3c444e7336f 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CreateFreshTypeVariableSubstitutorStage.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CreateFreshTypeVariableSubstitutorStage.kt @@ -158,7 +158,7 @@ private fun createToFreshVariableSubstitutorAndAddInitialConstraints( } private fun FirTypeParameter.getTypeParameterFromExpandedClass(index: Int, session: FirSession): FirTypeParameter { - val containingDeclaration = containingDeclarationSymbol?.fir + val containingDeclaration = containingDeclarationSymbol.fir if (containingDeclaration is FirRegularClass) { return containingDeclaration.typeParameters.elementAtOrNull(index)?.symbol?.fir ?: this } else if (containingDeclaration is FirTypeAlias) { diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirTypeParameter.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirTypeParameter.kt index 45b0d31e509..3bc6edf91ba 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirTypeParameter.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirTypeParameter.kt @@ -29,7 +29,7 @@ abstract class FirTypeParameter : FirTypeParameterRef, FirDeclaration() { abstract override val attributes: FirDeclarationAttributes abstract val name: Name abstract override val symbol: FirTypeParameterSymbol - abstract val containingDeclarationSymbol: FirBasedSymbol<*>? + abstract val containingDeclarationSymbol: FirBasedSymbol<*> abstract val variance: Variance abstract val isReified: Boolean abstract val bounds: List diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirTypeParameterBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirTypeParameterBuilder.kt index 30178036bcb..d0bf5c9b42b 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirTypeParameterBuilder.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirTypeParameterBuilder.kt @@ -37,7 +37,7 @@ class FirTypeParameterBuilder : FirAnnotationContainerBuilder { var attributes: FirDeclarationAttributes = FirDeclarationAttributes() lateinit var name: Name lateinit var symbol: FirTypeParameterSymbol - var containingDeclarationSymbol: FirBasedSymbol<*>? = null + lateinit var containingDeclarationSymbol: FirBasedSymbol<*> lateinit var variance: Variance var isReified: Boolean by kotlin.properties.Delegates.notNull() val bounds: MutableList = mutableListOf() diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirTypeParameterImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirTypeParameterImpl.kt index b490152e947..5936e951e09 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirTypeParameterImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirTypeParameterImpl.kt @@ -33,7 +33,7 @@ internal class FirTypeParameterImpl( override val attributes: FirDeclarationAttributes, override val name: Name, override val symbol: FirTypeParameterSymbol, - override val containingDeclarationSymbol: FirBasedSymbol<*>?, + override val containingDeclarationSymbol: FirBasedSymbol<*>, override val variance: Variance, override val isReified: Boolean, override val bounds: MutableList, diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirTypeParameterSymbol.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirTypeParameterSymbol.kt index 387214f5db2..03cdfd08a53 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirTypeParameterSymbol.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirTypeParameterSymbol.kt @@ -37,7 +37,7 @@ class FirTypeParameterSymbol : FirClassifierSymbol() { val isReified: Boolean get() = fir.isReified - val containingDeclarationSymbol: FirBasedSymbol<*>? + val containingDeclarationSymbol: FirBasedSymbol<*> get() = fir.containingDeclarationSymbol } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt index 85989684771..41208b9130f 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt @@ -294,7 +294,7 @@ object NodeConfigurator : AbstractFieldConfigurator(FirTreeBuild typeParameter.configure { +name +symbol("FirTypeParameterSymbol") - +field("containingDeclarationSymbol", firBasedSymbolType, "*", nullable = true).apply { + +field("containingDeclarationSymbol", firBasedSymbolType, "*").apply { withBindThis = false } +field(varianceType)