FIR deserializer: remove cycle in annotations loading

This commit is contained in:
Simon Ogorodnik
2019-04-23 04:21:40 +03:00
committed by Mikhail Glukhikh
parent e3e7eea3fe
commit cec10dac85
2 changed files with 44 additions and 38 deletions
@@ -280,7 +280,10 @@ class KotlinDeserializedJvmSymbolsProvider(
parentContext: FirDeserializationContext? = null parentContext: FirDeserializationContext? = null
): FirClassSymbol? { ): FirClassSymbol? {
if (!hasTopLevelClassOf(classId)) return null if (!hasTopLevelClassOf(classId)) return null
return classesCache.getOrPut(classId) { if (classesCache.containsKey(classId)) return classesCache[classId]
// return classesCache.getOrPut(classId) {
//return null //return null
val kotlinJvmBinaryClass = kotlinClassFinder.findKotlinClass(classId) val kotlinJvmBinaryClass = kotlinClassFinder.findKotlinClass(classId)
if (kotlinJvmBinaryClass == null) { if (kotlinJvmBinaryClass == null) {
@@ -294,7 +297,7 @@ class KotlinDeserializedJvmSymbolsProvider(
val symbol = FirClassSymbol(classId) val symbol = FirClassSymbol(classId)
FirEnumEntryImpl(session, null, symbol, classId.shortClassName) FirEnumEntryImpl(session, null, symbol, classId.shortClassName)
symbol classesCache[classId] = symbol
} else { } else {
if (kotlinJvmBinaryClass.classHeader.kind != KotlinClassHeader.Kind.CLASS) return null if (kotlinJvmBinaryClass.classHeader.kind != KotlinClassHeader.Kind.CLASS) return null
val (nameResolver, classProto) = kotlinJvmBinaryClass.readClassDataFrom() ?: return null val (nameResolver, classProto) = kotlinJvmBinaryClass.readClassDataFrom() ?: return null
@@ -308,6 +311,7 @@ class KotlinDeserializedJvmSymbolsProvider(
), ),
this::findAndDeserializeClass this::findAndDeserializeClass
) )
classesCache[classId] = symbol
val annotations = mutableListOf<FirAnnotationCall>() val annotations = mutableListOf<FirAnnotationCall>()
kotlinJvmBinaryClass.loadClassAnnotations(object : KotlinJvmBinaryClass.AnnotationVisitor { kotlinJvmBinaryClass.loadClassAnnotations(object : KotlinJvmBinaryClass.AnnotationVisitor {
override fun visitAnnotation(classId: ClassId, source: SourceElement): KotlinJvmBinaryClass.AnnotationArgumentVisitor? { override fun visitAnnotation(classId: ClassId, source: SourceElement): KotlinJvmBinaryClass.AnnotationArgumentVisitor? {
@@ -317,11 +321,13 @@ class KotlinDeserializedJvmSymbolsProvider(
override fun visitEnd() { override fun visitEnd() {
} }
}, null) }, null)
(symbol.fir as FirAbstractAnnotatedElement).annotations += annotations (symbol.fir as FirAbstractAnnotatedElement).annotations += annotations
symbol
}
} }
return classesCache[classId]
// }
} }
private fun loadFunctionsByName(part: PackagePartsCacheData, name: Name): List<FirCallableSymbol> { private fun loadFunctionsByName(part: PackagePartsCacheData, name: Name): List<FirCallableSymbol> {
@@ -1,4 +1,4 @@
public final annotation class AnnotatedAnnotation : R|kotlin/Annotation| { @R|test/AnnotatedAnnotation|() public final annotation class AnnotatedAnnotation : R|kotlin/Annotation| {
public constructor(): R|test/AnnotatedAnnotation| public constructor(): R|test/AnnotatedAnnotation|
} }