[FIR] Get rid of JavaSymbolProvider.getJavaTopLevelClasses

This commit is contained in:
Dmitriy Novozhilov
2020-08-13 14:25:45 +03:00
parent d7cfb2fb13
commit 4b6193159c
3 changed files with 35 additions and 34 deletions
@@ -146,16 +146,14 @@ abstract class AbstractFirTypeEnhancementTest : KtUsefulTestCase() {
val symbolProvider = session.firSymbolProvider as FirCompositeSymbolProvider val symbolProvider = session.firSymbolProvider as FirCompositeSymbolProvider
val javaProvider = symbolProvider.providers.filterIsInstance<JavaSymbolProvider>().first() val javaProvider = symbolProvider.providers.filterIsInstance<JavaSymbolProvider>().first()
val topLevelJavaClasses = topPsiClasses.map { it.classId(FqName.ROOT) }
fun processClassWithChildren(psiClass: PsiClass, parentFqName: FqName) { fun processClassWithChildren(psiClass: PsiClass, parentFqName: FqName) {
val psiFile = psiClass.containingFile val classId = psiClass.classId(parentFqName)
val packageStatement = psiFile.children.filterIsInstance<PsiPackageStatement>().firstOrNull()
val packageName = packageStatement?.packageName
val fqName = parentFqName.child(Name.identifier(psiClass.name!!))
val classId = ClassId(packageName?.let { FqName(it) } ?: FqName.ROOT, fqName, false)
javaProvider.getClassLikeSymbolByFqName(classId) javaProvider.getClassLikeSymbolByFqName(classId)
?: throw AssertionError(classId.asString()) ?: throw AssertionError(classId.asString())
psiClass.innerClasses.forEach { psiClass.innerClasses.forEach {
processClassWithChildren(psiClass = it, parentFqName = fqName) processClassWithChildren(psiClass = it, parentFqName = classId.relativeClassName)
} }
} }
for (psiClass in topPsiClasses) { for (psiClass in topPsiClasses) {
@@ -163,7 +161,8 @@ abstract class AbstractFirTypeEnhancementTest : KtUsefulTestCase() {
} }
val processedJavaClasses = mutableSetOf<FirJavaClass>() val processedJavaClasses = mutableSetOf<FirJavaClass>()
for (javaClass in javaProvider.getJavaTopLevelClasses().sortedBy { it.name }) { for (javaClassId in topLevelJavaClasses.sortedBy { it.shortClassName }) {
val javaClass = javaProvider.getClassLikeSymbolByFqName(javaClassId)?.fir ?: continue
if (javaClass !is FirJavaClass || javaClass in processedJavaClasses) continue if (javaClass !is FirJavaClass || javaClass in processedJavaClasses) continue
renderJavaClass(renderer, javaClass, session) renderJavaClass(renderer, javaClass, session)
processedJavaClasses += javaClass processedJavaClasses += javaClass
@@ -174,6 +173,14 @@ abstract class AbstractFirTypeEnhancementTest : KtUsefulTestCase() {
KotlinTestUtils.assertEqualsToFile(expectedFile, javaFirDump) KotlinTestUtils.assertEqualsToFile(expectedFile, javaFirDump)
} }
private fun PsiClass.classId(parentFqName: FqName): ClassId {
val psiFile = this.containingFile
val packageStatement = psiFile.children.filterIsInstance<PsiPackageStatement>().firstOrNull()
val packageName = packageStatement?.packageName
val fqName = parentFqName.child(Name.identifier(this.name!!))
return ClassId(packageName?.let { FqName(it) } ?: FqName.ROOT, fqName, false)
}
companion object { companion object {
private const val FOREIGN_ANNOTATIONS_SOURCES_PATH = "third-party/annotations" private const val FOREIGN_ANNOTATIONS_SOURCES_PATH = "third-party/annotations"
} }
@@ -413,14 +413,6 @@ class JavaSymbolProvider(
} }
} }
@TestOnly
fun getJavaTopLevelClasses(): List<FirRegularClass> {
return classCache.values
.filterIsInstance<FirRegularClassSymbol>()
.filter { it.classId.relativeClassName.parent().isRoot }
.map { it.fir }
}
private val knownClassNamesInPackage = mutableMapOf<FqName, Set<String>?>() private val knownClassNamesInPackage = mutableMapOf<FqName, Set<String>?>()
private fun hasTopLevelClassOf(classId: ClassId): Boolean { private fun hasTopLevelClassOf(classId: ClassId): Boolean {
@@ -19,11 +19,8 @@ import org.jetbrains.kotlin.fir.extensions.BunchOfRegisteredExtensions
import org.jetbrains.kotlin.fir.extensions.extensionService import org.jetbrains.kotlin.fir.extensions.extensionService
import org.jetbrains.kotlin.fir.extensions.registerExtensions import org.jetbrains.kotlin.fir.extensions.registerExtensions
import org.jetbrains.kotlin.fir.java.* import org.jetbrains.kotlin.fir.java.*
import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass
import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.resolve.firProvider import org.jetbrains.kotlin.fir.resolve.firProvider
import org.jetbrains.kotlin.fir.resolve.firSymbolProvider
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCompositeSymbolProvider
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirProviderImpl import org.jetbrains.kotlin.fir.resolve.providers.impl.FirProviderImpl
import org.jetbrains.kotlin.fir.resolve.transformers.FirTransformerBasedResolveProcessor import org.jetbrains.kotlin.fir.resolve.transformers.FirTransformerBasedResolveProcessor
import org.jetbrains.kotlin.fir.resolve.transformers.createAllTransformerBasedResolveProcessors import org.jetbrains.kotlin.fir.resolve.transformers.createAllTransformerBasedResolveProcessors
@@ -140,22 +137,27 @@ abstract class AbstractFirMultiModuleResolveTest : AbstractMultiModuleTest() {
KotlinTestUtils.assertEqualsToFile(File(expectedPath), firFileDump) KotlinTestUtils.assertEqualsToFile(File(expectedPath), firFileDump)
} }
val processedJavaClasses = mutableSetOf<FirJavaClass>() /*
val javaFirDump = StringBuilder().also { builder -> * This code is commented due to deleted JavaSymbolProvider.getJavaTopLevelClasses() method
val renderer = FirRenderer(builder) * There is no replace for this code because of there are no tests for this test runner, so
for (session in sessions) { * it is questionable, do we need java class check (or that test runner at all)
val symbolProvider = session.firSymbolProvider as FirCompositeSymbolProvider */
val javaProvider = symbolProvider.providers.filterIsInstance<JavaSymbolProvider>().first() // val processedJavaClasses = mutableSetOf<FirJavaClass>()
for (javaClass in javaProvider.getJavaTopLevelClasses().sortedBy { it.name }) { // val javaFirDump = StringBuilder().also { builder ->
if (javaClass !is FirJavaClass || javaClass in processedJavaClasses) continue // val renderer = FirRenderer(builder)
renderJavaClass(renderer, javaClass, session) // for (session in sessions) {
processedJavaClasses += javaClass // val symbolProvider = session.firSymbolProvider as FirCompositeSymbolProvider
} // val javaProvider = symbolProvider.providers.filterIsInstance<JavaSymbolProvider>().first()
} // for (javaClass in javaProvider.getJavaTopLevelClasses().sortedBy { it.name }) {
}.toString() // if (javaClass !is FirJavaClass || javaClass in processedJavaClasses) continue
if (javaFirDump.isNotEmpty()) { // renderJavaClass(renderer, javaClass, session)
KotlinTestUtils.assertEqualsToFile(File("$dirPath/extraDump.java.txt"), javaFirDump) // processedJavaClasses += javaClass
} // }
// }
// }.toString()
// if (javaFirDump.isNotEmpty()) {
// KotlinTestUtils.assertEqualsToFile(File("$dirPath/extraDump.java.txt"), javaFirDump)
// }
} }
} }