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:
pyos
2021-08-14 11:12:28 +02:00
committed by TeamCityServer
parent c2b575505a
commit a12e31daf1
149 changed files with 1787 additions and 16 deletions
@@ -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()
@@ -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()
}
}
@@ -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|