diff --git a/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticPackageProvider.kt b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticPackageProvider.kt index c0c72ebde60..7651a5db14f 100644 --- a/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticPackageProvider.kt +++ b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticPackageProvider.kt @@ -33,7 +33,7 @@ public class KotlinStaticPackageProvider( } override fun doesKotlinOnlyPackageExist(packageFqName: FqName): Boolean { - return packageFqName in kotlinPackageToSubPackages + return packageFqName.isRoot || packageFqName in kotlinPackageToSubPackages } override fun getKotlinOnlySubPackagesFqNames(packageFqName: FqName, nameFilter: (Name) -> Boolean): Set { diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesByPsiTest.kt b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesByPsiTest.kt index 9bb13274af8..cb43e9d95e4 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesByPsiTest.kt +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesByPsiTest.kt @@ -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, 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() } } diff --git a/compiler/tests/org/jetbrains/kotlin/asJava/JavaElementFinderTest.java b/compiler/tests/org/jetbrains/kotlin/asJava/JavaElementFinderTest.java index 8c4793c40a5..59db857c2bc 100644 --- a/compiler/tests/org/jetbrains/kotlin/asJava/JavaElementFinderTest.java +++ b/compiler/tests/org/jetbrains/kotlin/asJava/JavaElementFinderTest.java @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.asJava; import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiPackage; import com.intellij.psi.search.GlobalSearchScope; import junit.framework.TestCase; import org.jetbrains.annotations.NotNull; @@ -48,6 +49,8 @@ public class JavaElementFinderTest extends KotlinAsJavaTestBase { public void testEmptyQualifiedName() { assertNoClass(""); + // ROOT package exists + assertPackage(""); } public void testRepeatableAnnotation() { @@ -56,6 +59,12 @@ public class JavaElementFinderTest extends KotlinAsJavaTestBase { assertNoClass("RepeatableAnnotation2.Container"); } + private void assertPackage(String qualifiedName) { + PsiPackage psiPackage = finder.findPackage(qualifiedName); + TestCase.assertNotNull(String.format("Package with fqn='%s' wasn't found.", qualifiedName), psiPackage); + TestCase.assertTrue(String.format("Package with fqn='%s' is not valid.", qualifiedName), psiPackage.isValid()); + } + private void assertClass(String qualifiedName) { PsiClass psiClass = finder.findClass(qualifiedName, GlobalSearchScope.allScope(getProject())); TestCase.assertNotNull(String.format("Class with fqn='%s' wasn't found.", qualifiedName), psiClass);