[FIR] Fix recursive annotation deserialization

This commit is contained in:
Dmitriy Novozhilov
2020-02-07 13:54:38 +03:00
parent d57fa859c8
commit dd67568cf6
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.declarations.builder.FirClassImplBuilder
import org.jetbrains.kotlin.fir.declarations.builder.FirSealedClassBuilder import org.jetbrains.kotlin.fir.declarations.builder.FirSealedClassBuilder
import org.jetbrains.kotlin.fir.declarations.builder.buildEnumEntry import org.jetbrains.kotlin.fir.declarations.builder.buildEnumEntry
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider
import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
@@ -58,15 +59,6 @@ fun deserializeClassToSymbol(
} }
val isSealed = modality == Modality.SEALED val isSealed = modality == Modality.SEALED
val classBuilder = if (isSealed) FirSealedClassBuilder() else FirClassImplBuilder() val classBuilder = if (isSealed) FirSealedClassBuilder() else FirClassImplBuilder()
classBuilder.apply {
this.session = session
name = classId.shortClassName
this.status = status
classKind = ProtoEnumFlags.classKind(kind)
this.scopeProvider = scopeProvider
this.symbol = symbol
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
val context = val context =
parentContext?.childContext( parentContext?.childContext(
classProto.typeParameterList, classProto.typeParameterList,
@@ -77,8 +69,17 @@ fun deserializeClassToSymbol(
classId, classProto, nameResolver, session, classId, classProto, nameResolver, session,
defaultAnnotationDeserializer ?: FirBuiltinAnnotationDeserializer(session) defaultAnnotationDeserializer ?: FirBuiltinAnnotationDeserializer(session)
) )
classBuilder.apply {
this.session = session
name = classId.shortClassName
this.status = status
classKind = ProtoEnumFlags.classKind(kind)
this.scopeProvider = scopeProvider
this.symbol = symbol
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
typeParameters += context.typeDeserializer.ownTypeParameters.map { it.fir } typeParameters += context.typeDeserializer.ownTypeParameters.map { it.fir }
annotations += context.annotationDeserializer.loadClassAnnotations(classProto, context.nameResolver) // annotations += context.annotationDeserializer.loadClassAnnotations(classProto, context.nameResolver)
val typeDeserializer = context.typeDeserializer val typeDeserializer = context.typeDeserializer
val classDeserializer = context.memberDeserializer val classDeserializer = context.memberDeserializer
@@ -134,5 +135,7 @@ fun deserializeClassToSymbol(
} }
} }
calculateSAM() calculateSAM()
}.build().also {
(it.annotations as MutableList<FirAnnotationCall>) += context.annotationDeserializer.loadClassAnnotations(classProto, context.nameResolver)
} }
} }