SLC: ROOT package exists no matter what
^KT-59843 Fixed
This commit is contained in:
committed by
Ilya Kirillov
parent
076305bb78
commit
6fc02c3408
+1
-1
@@ -33,7 +33,7 @@ public class KotlinStaticPackageProvider(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun doesKotlinOnlyPackageExist(packageFqName: FqName): Boolean {
|
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> {
|
override fun getKotlinOnlySubPackagesFqNames(packageFqName: FqName, nameFilter: (Name) -> Boolean): Set<Name> {
|
||||||
|
|||||||
+32
-1
@@ -6,11 +6,17 @@
|
|||||||
package org.jetbrains.kotlin.light.classes.symbol.base
|
package org.jetbrains.kotlin.light.classes.symbol.base
|
||||||
|
|
||||||
import com.intellij.openapi.project.Project
|
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.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator
|
||||||
import org.jetbrains.kotlin.asJava.LightClassTestCommon
|
import org.jetbrains.kotlin.asJava.LightClassTestCommon
|
||||||
|
import org.jetbrains.kotlin.asJava.finder.JavaElementFinder
|
||||||
import org.jetbrains.kotlin.asJava.renderClass
|
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.getLightClassesFromFile
|
||||||
import org.jetbrains.kotlin.light.classes.symbol.base.service.withExtendedTypeRenderer
|
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.psi.KtFile
|
||||||
import org.jetbrains.kotlin.test.model.TestModule
|
import org.jetbrains.kotlin.test.model.TestModule
|
||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
@@ -21,8 +27,33 @@ abstract class AbstractSymbolLightClassesByPsiTest(
|
|||||||
override val isTestAgainstCompiledCode: Boolean,
|
override val isTestAgainstCompiledCode: Boolean,
|
||||||
) : AbstractSymbolLightClassesTestBase(configurator) {
|
) : AbstractSymbolLightClassesTestBase(configurator) {
|
||||||
override fun getRenderResult(ktFile: KtFile, ktFiles: List<KtFile>, testDataFile: Path, module: TestModule, project: Project): String {
|
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) }
|
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) {
|
return withExtendedTypeRenderer(testDataFile) {
|
||||||
lightClasses.sortedBy { it.name }.joinToString("\n\n") { it.renderClass() }
|
lightClasses.sortedBy { it.name }.joinToString("\n\n") { it.renderClass() }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.asJava;
|
package org.jetbrains.kotlin.asJava;
|
||||||
|
|
||||||
import com.intellij.psi.PsiClass;
|
import com.intellij.psi.PsiClass;
|
||||||
|
import com.intellij.psi.PsiPackage;
|
||||||
import com.intellij.psi.search.GlobalSearchScope;
|
import com.intellij.psi.search.GlobalSearchScope;
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
@@ -48,6 +49,8 @@ public class JavaElementFinderTest extends KotlinAsJavaTestBase {
|
|||||||
|
|
||||||
public void testEmptyQualifiedName() {
|
public void testEmptyQualifiedName() {
|
||||||
assertNoClass("");
|
assertNoClass("");
|
||||||
|
// ROOT package exists
|
||||||
|
assertPackage("");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testRepeatableAnnotation() {
|
public void testRepeatableAnnotation() {
|
||||||
@@ -56,6 +59,12 @@ public class JavaElementFinderTest extends KotlinAsJavaTestBase {
|
|||||||
assertNoClass("RepeatableAnnotation2.Container");
|
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) {
|
private void assertClass(String qualifiedName) {
|
||||||
PsiClass psiClass = finder.findClass(qualifiedName, GlobalSearchScope.allScope(getProject()));
|
PsiClass psiClass = finder.findClass(qualifiedName, GlobalSearchScope.allScope(getProject()));
|
||||||
TestCase.assertNotNull(String.format("Class with fqn='%s' wasn't found.", qualifiedName), psiClass);
|
TestCase.assertNotNull(String.format("Class with fqn='%s' wasn't found.", qualifiedName), psiClass);
|
||||||
|
|||||||
Reference in New Issue
Block a user