From d18846201afd2241a086e07b50749fcc483466e9 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Fri, 1 Jun 2018 18:22:14 +0200 Subject: [PATCH] JavaElementFinder: avoid returning fake light class in findClass* findClass* are supposed to return a single visible class from given scope with given fqname After sorting FakeFileForLightClass would sometimes be first in the list leading to exceptions like KT-24704 #KT-24704 Fixed --- .../kotlin/asJava/finder/JavaElementFinder.kt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/finder/JavaElementFinder.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/finder/JavaElementFinder.kt index 6eb191b8861..4f594a62573 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/finder/JavaElementFinder.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/finder/JavaElementFinder.kt @@ -25,6 +25,7 @@ import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.util.PsiUtilCore import com.intellij.util.SmartList import org.jetbrains.kotlin.asJava.KotlinAsJavaSupport +import org.jetbrains.kotlin.asJava.classes.FakeLightClassForFileOfPackage import org.jetbrains.kotlin.asJava.toLightClass import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.name.FqName @@ -56,7 +57,7 @@ class JavaElementFinder( answer.addAll(kotlinAsJavaSupport.getFacadeClasses(qualifiedName, scope)) answer.addAll(kotlinAsJavaSupport.getKotlinInternalClasses(qualifiedName, scope)) - return answer.sortByClasspath(scope).toTypedArray() + return answer.sortByClasspathPreferringNonFakeFiles(scope).toTypedArray() } // Finds explicitly declared classes and objects, not package classes @@ -139,7 +140,7 @@ class JavaElementFinder( answer.add(aClass) } - return answer.sortByClasspath(scope).toTypedArray() + return answer.sortByClasspathPreferringNonFakeFiles(scope).toTypedArray() } override fun getPackageFiles(psiPackage: PsiPackage, scope: GlobalSearchScope): Array { @@ -183,8 +184,10 @@ class JavaElementFinder( } } - private fun List.sortByClasspath(searchScope: GlobalSearchScope): Collection { - return this.sortedWith(byClasspathComparator(searchScope)) + private fun List.sortByClasspathPreferringNonFakeFiles(searchScope: GlobalSearchScope): List { + return this.sortedWith(byClasspathComparator(searchScope)).sortedBy { + this is FakeLightClassForFileOfPackage + } } } }