SLC: ROOT package exists no matter what

^KT-59843 Fixed
This commit is contained in:
Jinseong Jeon
2023-07-01 00:16:50 -07:00
committed by Ilya Kirillov
parent 076305bb78
commit 6fc02c3408
3 changed files with 42 additions and 2 deletions
@@ -6,11 +6,17 @@
package org.jetbrains.kotlin.light.classes.symbol.base
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiEnumConstantInitializer
import com.intellij.psi.search.GlobalSearchScope
import junit.framework.TestCase
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator
import org.jetbrains.kotlin.asJava.LightClassTestCommon
import org.jetbrains.kotlin.asJava.finder.JavaElementFinder
import org.jetbrains.kotlin.asJava.renderClass
import org.jetbrains.kotlin.light.classes.symbol.base.service.getLightClassesFromFile
import org.jetbrains.kotlin.light.classes.symbol.base.service.withExtendedTypeRenderer
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.isValidJavaFqName
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.test.model.TestModule
import java.nio.file.Path
@@ -21,8 +27,33 @@ abstract class AbstractSymbolLightClassesByPsiTest(
override val isTestAgainstCompiledCode: Boolean,
) : AbstractSymbolLightClassesTestBase(configurator) {
override fun getRenderResult(ktFile: KtFile, ktFiles: List<KtFile>, testDataFile: Path, module: TestModule, project: Project): String {
val finder = JavaElementFinder.getInstance(project)
val lightClasses = ktFiles.flatMap { getLightClassesFromFile(it) }
if (lightClasses.isEmpty()) return LightClassTestCommon.NOT_GENERATED_DIRECTIVE
if (lightClasses.isEmpty()) {
// ROOT package exists
TestCase.assertNotNull("ROOT package not found", finder.findPackage(""))
return LightClassTestCommon.NOT_GENERATED_DIRECTIVE
}
val scope = GlobalSearchScope.allScope(project)
for (lc in lightClasses) {
val path = lc.containingFile.virtualFile.path
val containingKtFile = ktFiles.find { it.virtualFilePath == path }
TestCase.assertNotNull(containingKtFile)
val packageFqName = containingKtFile?.packageDirective?.fqName ?: FqName.ROOT
TestCase.assertNotNull("package $packageFqName not found", finder.findPackage(packageFqName.asString()))
// [JavaElementFinder#findClass] finds facade classes and regular classes, not ones in a script.
if (containingKtFile!!.isScript()) continue
// Skip enum entries
if (lc is PsiEnumConstantInitializer) continue
val fqName = lc.qualifiedName ?: continue
// [JavaElementFinder#findClass] declines to create a light class for invalid fqName.
if (!isValidJavaFqName(fqName)) continue
val lcViaFinder = finder.findClass(lc.qualifiedName!!, scope)
TestCase.assertEquals(lc, lcViaFinder)
}
return withExtendedTypeRenderer(testDataFile) {
lightClasses.sortedBy { it.name }.joinToString("\n\n") { it.renderClass() }
}