diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt index d57e0c360d2..8ca320c7baa 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt @@ -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().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() + } + + facadeClasses.filterTo(result) { it is KtLightClassForFacade && file in it.files } + return result.toTypedArray() } } diff --git a/idea/testData/asJava/fileLightClass/multifile1.kt b/idea/testData/asJava/fileLightClass/multifile1.kt new file mode 100644 index 00000000000..477d5ec4787 --- /dev/null +++ b/idea/testData/asJava/fileLightClass/multifile1.kt @@ -0,0 +1,6 @@ +@file:kotlin.jvm.JvmMultifileClass +@file:kotlin.jvm.JvmName("Foo") + +fun foo() { +} + diff --git a/idea/testData/asJava/fileLightClass/multifile2.kt b/idea/testData/asJava/fileLightClass/multifile2.kt new file mode 100644 index 00000000000..facc885c90e --- /dev/null +++ b/idea/testData/asJava/fileLightClass/multifile2.kt @@ -0,0 +1,6 @@ +@file:kotlin.jvm.JvmMultifileClass +@file:kotlin.jvm.JvmName("Foo") + +fun bar() { +} + diff --git a/idea/tests/org/jetbrains/kotlin/asJava/KtFileLightClassTest.kt b/idea/tests/org/jetbrains/kotlin/asJava/KtFileLightClassTest.kt index fef23a88e66..5170d0fdeb5 100644 --- a/idea/tests/org/jetbrains/kotlin/asJava/KtFileLightClassTest.kt +++ b/idea/tests/org/jetbrains/kotlin/asJava/KtFileLightClassTest.kt @@ -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/" + } }