FIR: dump nested classes in loadJava tests
Because those test are single Java files, many of them use a top-level class as a container for multiple classes to be tested. Such tests do almost nothing if those nested classes aren't handled.
This commit is contained in:
+13
-15
@@ -145,26 +145,24 @@ abstract class AbstractFirTypeEnhancementTest : KtUsefulTestCase() {
|
||||
val symbolProvider = session.symbolProvider as FirCompositeSymbolProvider
|
||||
val javaProvider = symbolProvider.providers.filterIsInstance<JavaSymbolProvider>().first()
|
||||
|
||||
val topLevelJavaClasses = topPsiClasses.map { it.classId(FqName.ROOT) }
|
||||
|
||||
val processedJavaClasses = mutableSetOf<FirJavaClass>()
|
||||
fun processClassWithChildren(psiClass: PsiClass, parentFqName: FqName) {
|
||||
val classId = psiClass.classId(parentFqName)
|
||||
javaProvider.getClassLikeSymbolByFqName(classId)
|
||||
val javaClass = javaProvider.getClassLikeSymbolByFqName(classId)?.fir
|
||||
?: throw AssertionError(classId.asString())
|
||||
psiClass.innerClasses.forEach {
|
||||
processClassWithChildren(psiClass = it, parentFqName = classId.relativeClassName)
|
||||
if (javaClass !is FirJavaClass || javaClass in processedJavaClasses) {
|
||||
return
|
||||
}
|
||||
}
|
||||
for (psiClass in topPsiClasses) {
|
||||
processClassWithChildren(psiClass, FqName.ROOT)
|
||||
}
|
||||
|
||||
val processedJavaClasses = mutableSetOf<FirJavaClass>()
|
||||
for (javaClassId in topLevelJavaClasses.sortedBy { it.shortClassName }) {
|
||||
val javaClass = javaProvider.getClassLikeSymbolByFqName(javaClassId)?.fir ?: continue
|
||||
if (javaClass !is FirJavaClass || javaClass in processedJavaClasses) continue
|
||||
renderJavaClass(renderer, javaClass, session)
|
||||
processedJavaClasses += javaClass
|
||||
renderJavaClass(renderer, javaClass, session) {
|
||||
for (innerClass in psiClass.innerClasses.sortedBy { it.name }) {
|
||||
processClassWithChildren(innerClass, classId.relativeClassName)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
for (psiClass in topPsiClasses.sortedBy { it.name }) {
|
||||
processClassWithChildren(psiClass, FqName.ROOT)
|
||||
}
|
||||
}.toString()
|
||||
|
||||
|
||||
+3
-1
@@ -20,7 +20,7 @@ import org.jetbrains.kotlin.fir.symbols.SymbolInternals
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
|
||||
@OptIn(SymbolInternals::class)
|
||||
fun renderJavaClass(renderer: FirRenderer, javaClass: FirJavaClass, session: FirSession) {
|
||||
fun renderJavaClass(renderer: FirRenderer, javaClass: FirJavaClass, session: FirSession, renderInnerClasses: () -> Unit) {
|
||||
val memberScope = javaClass.unsubstitutedScope(session, ScopeSession(), withForcedTypeCalculator = true)
|
||||
|
||||
val staticScope = javaClass.scopeProvider.getStaticScope(javaClass, session, ScopeSession())
|
||||
@@ -61,5 +61,7 @@ fun renderJavaClass(renderer: FirRenderer, javaClass: FirJavaClass, session: Fir
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
renderInnerClasses()
|
||||
}
|
||||
}
|
||||
|
||||
+28
@@ -11,6 +11,34 @@
|
||||
|
||||
public constructor(): R|A|
|
||||
|
||||
@R|NullableApi|() public open inner class B : R|kotlin/Any| {
|
||||
public open field field: R|kotlin/String?|
|
||||
|
||||
public open fun foo(x: R|kotlin/String?|, @R|javax/annotation/Nonnull|() y: R|@EnhancedNullability kotlin/CharSequence|): R|kotlin/String?|
|
||||
|
||||
@R|NonNullApi|() public open fun foobar(x: R|@EnhancedNullability kotlin/String|, @R|NullableApi|() y: R|kotlin/CharSequence?|): R|@EnhancedNullability kotlin/String|
|
||||
|
||||
public open fun bar(): R|kotlin/String?|
|
||||
|
||||
@R|javax/annotation/Nullable|() public open fun baz(): R|ft<kotlin/collections/MutableList<ft<kotlin/String, kotlin/String?>>?, kotlin/collections/List<ft<kotlin/String, kotlin/String?>>?>|
|
||||
|
||||
public constructor(): R|A.B|
|
||||
|
||||
}
|
||||
@R|FieldsAreNullable|() public open inner class C : R|kotlin/Any| {
|
||||
public open field field: R|kotlin/String?|
|
||||
|
||||
public open fun foo(x: R|ft<kotlin/String, kotlin/String?>|, @R|javax/annotation/Nullable|() y: R|kotlin/CharSequence?|): R|ft<kotlin/String, kotlin/String?>|
|
||||
|
||||
@R|NullableApi|() public open fun foobar(x: R|kotlin/String?|, @R|javax/annotation/Nullable|() y: R|kotlin/CharSequence?|): R|kotlin/String?|
|
||||
|
||||
public open fun bar(): R|ft<kotlin/String, kotlin/String?>|
|
||||
|
||||
@R|javax/annotation/Nullable|() public open fun baz(): R|ft<kotlin/collections/MutableList<ft<kotlin/String, kotlin/String?>>?, kotlin/collections/List<ft<kotlin/String, kotlin/String?>>?>|
|
||||
|
||||
public constructor(): R|A.C|
|
||||
|
||||
}
|
||||
}
|
||||
@R|kotlin/annotation/Retention|(R|kotlin/annotation/AnnotationRetention.RUNTIME|()) @R|kotlin/annotation/MustBeDocumented|() @R|javax/annotation/CheckForNull|() @R|javax/annotation/meta/TypeQualifierDefault|(<implicitArrayOf>(R|java/lang/annotation/ElementType.FIELD|())) public final annotation class FieldsAreNullable : R|kotlin/Annotation| {
|
||||
public constructor(): R|FieldsAreNullable|
|
||||
|
||||
Reference in New Issue
Block a user