diff --git a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/types/ClassLiteralArgument.txt b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/types/ClassLiteralArgument.txt index aec8d698534..98364bdb620 100644 --- a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/types/ClassLiteralArgument.txt +++ b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/types/ClassLiteralArgument.txt @@ -27,8 +27,8 @@ public final class Generic : R|kotlin/Any| { public final class InnerGeneric : R|kotlin/Any| { public constructor(): R|test/InnerGeneric| - public final inner class Inner : R|kotlin/Any| { - public constructor(): R|test/InnerGeneric.Inner| + public final inner class Inner : R|kotlin/Any| { + public constructor(): R|test/InnerGeneric.Inner| } @@ -38,3 +38,4 @@ public final class Simple : R|kotlin/Any| { public constructor(): R|test/Simple| } + diff --git a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/class/InnerTypes.txt b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/class/InnerTypes.txt index 176caf4530a..afdb71ec891 100644 --- a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/class/InnerTypes.txt +++ b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/class/InnerTypes.txt @@ -3,21 +3,22 @@ public final class Outer : R|kotlin/Any| { public constructor(): R|test/Outer| - public final inner class Inner : R|kotlin/Any| { - public constructor(): R|test/Outer.Inner| + public final inner class Inner : R|kotlin/Any| { + public constructor(): R|test/Outer.Inner| - public final inner class Inner3 : R|kotlin/Any| { + public final inner class Inner3 : R|kotlin/Any| { public final fun foo(x: R|test/Outer.Inner|, y: R|test/Outer.Inner|, z: R|test/Outer.Inner.Inner3|, w: R|test/Outer.Inner.Inner3<*, G, H, E, F>|): R|kotlin/Unit| - public constructor(): R|test/Outer.Inner.Inner3| + public constructor(): R|test/Outer.Inner.Inner3| } } - public final inner class Inner2 : R|kotlin/Any| { - public constructor(): R|test/Outer.Inner2| + public final inner class Inner2 : R|kotlin/Any| { + public constructor(): R|test/Outer.Inner2| } } + diff --git a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/nested/DeepInnerGeneric.txt b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/nested/DeepInnerGeneric.txt index c9f296a6e18..a86b0c70b06 100644 --- a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/nested/DeepInnerGeneric.txt +++ b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/nested/DeepInnerGeneric.txt @@ -1,18 +1,18 @@ public final class A : R|kotlin/Any| { public constructor(): R|test/A| - public final inner class B : R|kotlin/Any| { - public constructor(): R|test/A.B| + public final inner class B : R|kotlin/Any| { + public constructor(): R|test/A.B| - public final inner class C : R|kotlin/Any| { - public constructor(): R|test/A.B.C| + public final inner class C : R|kotlin/Any| { + public constructor(): R|test/A.B.C| - public final inner class D : R|kotlin/Any| { + public final inner class D : R|kotlin/Any| { public final fun bar(ta: R|TA|, tb: R|TB|, tc: R|TC|, td: R|TD|): R|test/A.B.C.D| public final fun foo(p1: R|P1|, p2: R|P2|, p3: R|P3|, p4: R|P4|): R|kotlin/Nothing| - public constructor(): R|test/A.B.C.D| + public constructor(): R|test/A.B.C.D| } diff --git a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/nested/InnerClassReferencesOuterTP.txt b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/nested/InnerClassReferencesOuterTP.txt index 6f36127b838..feff60b9e81 100644 --- a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/nested/InnerClassReferencesOuterTP.txt +++ b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/nested/InnerClassReferencesOuterTP.txt @@ -1,9 +1,10 @@ public final class InnerClassReferencesOuterTP

: R|kotlin/Any| { public constructor

(): R|test/InnerClassReferencesOuterTP

| - public final inner class Inner : R|kotlin/Any| { - public constructor(): R|test/InnerClassReferencesOuterTP.Inner| + public final inner class Inner : R|kotlin/Any| { + public constructor(): R|test/InnerClassReferencesOuterTP.Inner| } } + diff --git a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/nested/MembersReferenceOuterTP.txt b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/nested/MembersReferenceOuterTP.txt index 3e043df36dc..13b5abf7da5 100644 --- a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/nested/MembersReferenceOuterTP.txt +++ b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/nested/MembersReferenceOuterTP.txt @@ -1,7 +1,7 @@ public final class MembersReferenceOuterTP

: R|kotlin/Any| { public constructor

(): R|test/MembersReferenceOuterTP

| - public final inner class Inner : R|kotlin/Any| { + public final inner class Inner

: R|kotlin/Any| { public final fun f(): R|kotlin/Unit| public final fun g(p: R|P|): R|P| @@ -12,8 +12,9 @@ public final class MembersReferenceOuterTP

: R|kotlin/Any| { public final val R|Q|.w: R|Q| public get(): R|Q| - public constructor(): R|test/MembersReferenceOuterTP.Inner| + public constructor(): R|test/MembersReferenceOuterTP.Inner

| } } + diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt index 67f90f653b7..ed583968ce2 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt @@ -75,7 +75,8 @@ fun deserializeClassToSymbol( classProto.typeParameterList, nameResolver, TypeTable(classProto.typeTable), - classId.relativeClassName + classId.relativeClassName, + status.isInner ) ?: FirDeserializationContext.createForClass( classId, classProto, nameResolver, session, defaultAnnotationDeserializer ?: FirBuiltinAnnotationDeserializer(session), @@ -90,7 +91,10 @@ fun deserializeClassToSymbol( this.symbol = symbol resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES + typeParameters += context.typeDeserializer.ownTypeParameters.map { it.fir } + if (status.isInner) + typeParameters += parentContext?.allTypeParameters?.map { buildOuterClassTypeParameterRef { this.symbol = it } }.orEmpty() // annotations += context.annotationDeserializer.loadClassAnnotations(classProto, context.nameResolver) val typeDeserializer = context.typeDeserializer diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt index 00dca48c38e..425eb4fd399 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource import org.jetbrains.kotlin.serialization.deserialization.getName +import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance class FirDeserializationContext( val nameResolver: NameResolver, @@ -39,19 +40,24 @@ class FirDeserializationContext( val typeDeserializer: FirTypeDeserializer, val annotationDeserializer: AbstractAnnotationDeserializer, val containerSource: DeserializedContainerSource?, + outerTypeParameters: List, val components: FirDeserializationComponents ) { + val allTypeParameters: List = + typeDeserializer.ownTypeParameters + outerTypeParameters + fun childContext( typeParameterProtos: List, nameResolver: NameResolver = this.nameResolver, typeTable: TypeTable = this.typeTable, - relativeClassName: FqName? = this.relativeClassName + relativeClassName: FqName? = this.relativeClassName, + capturesTypeParameters: Boolean = true ): FirDeserializationContext = FirDeserializationContext( nameResolver, typeTable, versionRequirementTable, session, packageFqName, relativeClassName, FirTypeDeserializer( session, nameResolver, typeTable, typeParameterProtos, typeDeserializer ), - annotationDeserializer, containerSource, components + annotationDeserializer, containerSource, if (capturesTypeParameters) allTypeParameters else emptyList(), components ) val memberDeserializer: FirMemberDeserializer = FirMemberDeserializer(this) @@ -118,6 +124,7 @@ class FirDeserializationContext( ), annotationDeserializer, containerSource, + emptyList(), FirDeserializationComponents() ) } @@ -284,7 +291,9 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { } this.symbol = symbol resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES - this.typeParameters += typeParameters.map { buildConstructedClassTypeParameterRef { this.symbol = it.symbol } } + this.typeParameters += + typeParameters.filterIsInstance() + .map { buildConstructedClassTypeParameterRef { this.symbol = it.symbol } } valueParameters += local.memberDeserializer.valueParameters( proto.valueParameterList, addDefaultValue = classBuilder.symbol.classId == StandardClassIds.Enum )