FIR deserializer: remove cycle in annotations loading
This commit is contained in:
committed by
Mikhail Glukhikh
parent
e3e7eea3fe
commit
cec10dac85
+43
-37
@@ -280,48 +280,54 @@ 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 null
|
|
||||||
val kotlinJvmBinaryClass = kotlinClassFinder.findKotlinClass(classId)
|
|
||||||
if (kotlinJvmBinaryClass == null) {
|
// return classesCache.getOrPut(classId) {
|
||||||
val outerClassId = classId.outerClassId ?: return null
|
//return null
|
||||||
val outerJvmBinaryClass = kotlinClassFinder.findKotlinClass(outerClassId) ?: return null
|
val kotlinJvmBinaryClass = kotlinClassFinder.findKotlinClass(classId)
|
||||||
if (outerJvmBinaryClass.classHeader.kind != KotlinClassHeader.Kind.CLASS) return null
|
if (kotlinJvmBinaryClass == null) {
|
||||||
val (nameResolver, outerClassProto) = outerJvmBinaryClass.readClassDataFrom() ?: return null
|
val outerClassId = classId.outerClassId ?: return null
|
||||||
if (outerClassProto.enumEntryList.none { nameResolver.getName(it.name) == classId.shortClassName }) {
|
val outerJvmBinaryClass = kotlinClassFinder.findKotlinClass(outerClassId) ?: return null
|
||||||
return null
|
if (outerJvmBinaryClass.classHeader.kind != KotlinClassHeader.Kind.CLASS) return null
|
||||||
|
val (nameResolver, outerClassProto) = outerJvmBinaryClass.readClassDataFrom() ?: return null
|
||||||
|
if (outerClassProto.enumEntryList.none { nameResolver.getName(it.name) == classId.shortClassName }) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
val symbol = FirClassSymbol(classId)
|
||||||
|
FirEnumEntryImpl(session, null, symbol, classId.shortClassName)
|
||||||
|
classesCache[classId] = symbol
|
||||||
|
} else {
|
||||||
|
if (kotlinJvmBinaryClass.classHeader.kind != KotlinClassHeader.Kind.CLASS) return null
|
||||||
|
val (nameResolver, classProto) = kotlinJvmBinaryClass.readClassDataFrom() ?: return null
|
||||||
|
|
||||||
|
val symbol = FirClassSymbol(classId)
|
||||||
|
deserializeClassToSymbol(
|
||||||
|
classId, classProto, symbol, nameResolver, session,
|
||||||
|
parentContext ?: FirDeserializationContext.createForClass(
|
||||||
|
classId, classProto, nameResolver, session,
|
||||||
|
JvmBinaryAnnotationDeserializer(session, nameResolver)
|
||||||
|
),
|
||||||
|
this::findAndDeserializeClass
|
||||||
|
)
|
||||||
|
classesCache[classId] = symbol
|
||||||
|
val annotations = mutableListOf<FirAnnotationCall>()
|
||||||
|
kotlinJvmBinaryClass.loadClassAnnotations(object : KotlinJvmBinaryClass.AnnotationVisitor {
|
||||||
|
override fun visitAnnotation(classId: ClassId, source: SourceElement): KotlinJvmBinaryClass.AnnotationArgumentVisitor? {
|
||||||
|
return loadAnnotationIfNotSpecial(classId, annotations)
|
||||||
}
|
}
|
||||||
|
|
||||||
val symbol = FirClassSymbol(classId)
|
override fun visitEnd() {
|
||||||
FirEnumEntryImpl(session, null, symbol, classId.shortClassName)
|
}
|
||||||
symbol
|
|
||||||
} else {
|
|
||||||
if (kotlinJvmBinaryClass.classHeader.kind != KotlinClassHeader.Kind.CLASS) return null
|
|
||||||
val (nameResolver, classProto) = kotlinJvmBinaryClass.readClassDataFrom() ?: return null
|
|
||||||
|
|
||||||
val symbol = FirClassSymbol(classId)
|
|
||||||
deserializeClassToSymbol(
|
|
||||||
classId, classProto, symbol, nameResolver, session,
|
|
||||||
parentContext ?: FirDeserializationContext.createForClass(
|
|
||||||
classId, classProto, nameResolver, session,
|
|
||||||
JvmBinaryAnnotationDeserializer(session, nameResolver)
|
|
||||||
),
|
|
||||||
this::findAndDeserializeClass
|
|
||||||
)
|
|
||||||
val annotations = mutableListOf<FirAnnotationCall>()
|
|
||||||
kotlinJvmBinaryClass.loadClassAnnotations(object : KotlinJvmBinaryClass.AnnotationVisitor {
|
|
||||||
override fun visitAnnotation(classId: ClassId, source: SourceElement): KotlinJvmBinaryClass.AnnotationArgumentVisitor? {
|
|
||||||
return loadAnnotationIfNotSpecial(classId, annotations)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun visitEnd() {
|
}, null)
|
||||||
}
|
(symbol.fir as FirAbstractAnnotatedElement).annotations += annotations
|
||||||
|
|
||||||
}, null)
|
|
||||||
(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
-1
@@ -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|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user