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:
Dmitry Jemerov
2016-01-19 18:07:43 +01:00
parent ede4b61980
commit 4ab6436f93
4 changed files with 41 additions and 1 deletions
@@ -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()
}
}
+6
View File
@@ -0,0 +1,6 @@
@file:kotlin.jvm.JvmMultifileClass
@file:kotlin.jvm.JvmName("Foo")
fun foo() {
}
+6
View File
@@ -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/"
}
}