[FIR Serialization] Fix serialization of generated nested classifiers

^KT-55759 Fixed
This commit is contained in:
Ivan Kochurkin
2023-01-10 22:25:01 +01:00
parent c120b185af
commit 978f937fa9
4 changed files with 49 additions and 7 deletions
@@ -28,14 +28,14 @@ import org.jetbrains.kotlin.fir.extensions.typeAttributeExtensions
import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
import org.jetbrains.kotlin.fir.scopes.FakeOverrideTypeCalculator
import org.jetbrains.kotlin.fir.scopes.getSingleClassifier
import org.jetbrains.kotlin.fir.scopes.processAllFunctions
import org.jetbrains.kotlin.fir.scopes.processAllProperties
import org.jetbrains.kotlin.fir.serialization.constant.EnumValue
import org.jetbrains.kotlin.fir.serialization.constant.IntValue
import org.jetbrains.kotlin.fir.serialization.constant.StringValue
import org.jetbrains.kotlin.fir.serialization.constant.toConstantValue
import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
@@ -148,12 +148,19 @@ class FirElementSerializer private constructor(
}
}
val nestedClassifiers = klass.declarations.filterIsInstance<FirClassLikeDeclaration>()
fun FirClass.nestedClassifiers(): List<FirClassifierSymbol<*>> {
val scope = defaultType().scope(session, scopeSession, FakeOverrideTypeCalculator.DoNothing) ?: return emptyList()
return buildList {
scope.getClassifierNames().mapNotNullTo(this) { scope.getSingleClassifier(it) }
}
}
val nestedClassifiers = klass.nestedClassifiers()
for (nestedClassifier in nestedClassifiers) {
if (nestedClassifier is FirTypeAlias) {
typeAliasProto(nestedClassifier)?.let { builder.addTypeAlias(it) }
} else if (nestedClassifier is FirRegularClass) {
if (!extension.shouldSerializeNestedClass(nestedClassifier)) {
if (nestedClassifier is FirTypeAliasSymbol) {
typeAliasProto(nestedClassifier.fir)?.let { builder.addTypeAlias(it) }
} else if (nestedClassifier is FirRegularClassSymbol) {
if (!extension.shouldSerializeNestedClass(nestedClassifier.fir)) {
continue
}
@@ -0,0 +1,23 @@
// ISSUE: KT-55759
// TARGET_BACKEND: JVM_IR
// WITH_STDLIB
// MODULE: lib
// TARGET_PLATFORM: JVM
// FILE: lib.kt
import kotlinx.serialization.*
@Serializable
class Test
// MODULE: jvm(lib)()()
// TARGET_PLATFORM: JVM
// FILE: main.kt
import kotlinx.serialization.*
import kotlinx.serialization.descriptors.*
fun box(): String {
return if (Test.serializer().descriptor.toString() == "Test()") "OK" else "FAIL"
}
@@ -69,6 +69,12 @@ public class SerializationFirBlackBoxTestGenerated extends AbstractSerialization
runTest("plugins/kotlinx-serialization/testData/boxIr/externalSerialierJava.kt");
}
@Test
@TestMetadata("generatedClassifiersViaLibraryDependency.kt")
public void testGeneratedClassifiersViaLibraryDependency() throws Exception {
runTest("plugins/kotlinx-serialization/testData/boxIr/generatedClassifiersViaLibraryDependency.kt");
}
@Test
@TestMetadata("genericBaseClassMultiple.kt")
public void testGenericBaseClassMultiple() throws Exception {
@@ -67,6 +67,12 @@ public class SerializationIrBoxTestGenerated extends AbstractSerializationIrBoxT
runTest("plugins/kotlinx-serialization/testData/boxIr/externalSerialierJava.kt");
}
@Test
@TestMetadata("generatedClassifiersViaLibraryDependency.kt")
public void testGeneratedClassifiersViaLibraryDependency() throws Exception {
runTest("plugins/kotlinx-serialization/testData/boxIr/generatedClassifiersViaLibraryDependency.kt");
}
@Test
@TestMetadata("genericBaseClassMultiple.kt")
public void testGenericBaseClassMultiple() throws Exception {