SLC: ROOT package exists no matter what

^KT-59843 Fixed
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 c0c72eb..7651a5d 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 @@
     }
 
     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<Name> {
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 9bb1327..cb43e9d 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 @@
     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() }
         }
diff --git a/compiler/tests/org/jetbrains/kotlin/asJava/JavaElementFinderTest.java b/compiler/tests/org/jetbrains/kotlin/asJava/JavaElementFinderTest.java
index 8c4793c..59db857 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 void testEmptyQualifiedName() {
         assertNoClass("");
+        // ROOT package exists
+        assertPackage("");
     }
 
     public void testRepeatableAnnotation() {
@@ -56,6 +59,12 @@
         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);