avoid index access in KtFile.getClasses() when the file isn't part of a multi-file class (helps with KT-10684)
This commit is contained in:
+17
-1
@@ -29,6 +29,7 @@ import com.intellij.psi.search.GlobalSearchScope
|
||||
import com.intellij.psi.util.PsiTreeUtil
|
||||
import org.jetbrains.kotlin.asJava.*
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
|
||||
import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName
|
||||
import org.jetbrains.kotlin.idea.decompiler.classFile.KtClsFile
|
||||
import org.jetbrains.kotlin.idea.decompiler.navigation.SourceNavigationHelper
|
||||
@@ -37,6 +38,7 @@ import org.jetbrains.kotlin.idea.stubindex.*
|
||||
import org.jetbrains.kotlin.idea.stubindex.KotlinSourceFilterScope.sourceAndClassFiles
|
||||
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
|
||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||
import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext
|
||||
@@ -362,10 +364,24 @@ class KtFileClassProviderImpl(val lightClassGenerationSupport: LightClassGenerat
|
||||
file.declarations.filterIsInstance<KtClassOrObject>().map { lightClassGenerationSupport.getPsiClass(it) }.filterNotNullTo(result)
|
||||
|
||||
val moduleInfo = file.getModuleInfo()
|
||||
val jvmClassInfo = JvmFileClassUtil.getFileClassInfoNoResolve(file)
|
||||
val fileClassFqName = file.javaFileFacadeFqName
|
||||
lightClassGenerationSupport.getFacadeClasses(fileClassFqName, moduleInfo.contentScope()).filterTo(result) {
|
||||
|
||||
val facadeClasses = when {
|
||||
jvmClassInfo.withJvmMultifileClass ->
|
||||
lightClassGenerationSupport.getFacadeClasses(fileClassFqName, moduleInfo.contentScope())
|
||||
|
||||
PackagePartClassUtils.fileHasTopLevelCallables(file) ->
|
||||
(lightClassGenerationSupport as IDELightClassGenerationSupport).createLightClassForFileFacade(
|
||||
fileClassFqName, listOf(file), moduleInfo)
|
||||
|
||||
else -> emptyList<PsiClass>()
|
||||
}
|
||||
|
||||
facadeClasses.filterTo(result) {
|
||||
it is KtLightClassForFacade && file in it.files
|
||||
}
|
||||
|
||||
return result.toTypedArray()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
@file:kotlin.jvm.JvmMultifileClass
|
||||
@file:kotlin.jvm.JvmName("Foo")
|
||||
|
||||
fun foo() {
|
||||
}
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
@file:kotlin.jvm.JvmMultifileClass
|
||||
@file:kotlin.jvm.JvmName("Foo")
|
||||
|
||||
fun bar() {
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.asJava
|
||||
import com.intellij.testFramework.LightProjectDescriptor
|
||||
import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase
|
||||
import org.jetbrains.kotlin.idea.test.KotlinLightProjectDescriptor
|
||||
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
|
||||
class KtFileLightClassTest : KotlinLightCodeInsightFixtureTestCase() {
|
||||
@@ -38,4 +39,15 @@ class KtFileLightClassTest : KotlinLightCodeInsightFixtureTestCase() {
|
||||
assertEquals(1, classes.size)
|
||||
assertEquals("AKt", classes[0].qualifiedName)
|
||||
}
|
||||
|
||||
fun testMultifileClass() {
|
||||
val file = myFixture.configureByFiles("multifile1.kt", "multifile2.kt")[0] as KtFile
|
||||
val aClass = file.classes.single()
|
||||
assertEquals(1, aClass.findMethodsByName("foo", false).size)
|
||||
assertEquals(1, aClass.findMethodsByName("bar", false).size)
|
||||
}
|
||||
|
||||
override fun getTestDataPath(): String? {
|
||||
return PluginTestCaseBase.getTestDataPathBase() + "/asJava/fileLightClass/"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user