KtFile.getClasses() returns empty array for non-jvm files

This commit is contained in:
Pavel V. Talanov
2018-07-11 21:47:00 +02:00
parent 3a2d25a422
commit 3da9d79fc2
2 changed files with 11 additions and 2 deletions
@@ -12,11 +12,13 @@ import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade
import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName
import org.jetbrains.kotlin.idea.caches.project.getModuleInfo
import org.jetbrains.kotlin.idea.caches.resolve.util.isInDumbMode
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtFileClassProvider
import org.jetbrains.kotlin.psi.analysisContext
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
class KtFileClassProviderImpl(val kotlinAsJavaSupport: KotlinAsJavaSupport) :
KtFileClassProvider {
@@ -33,7 +35,13 @@ class KtFileClassProviderImpl(val kotlinAsJavaSupport: KotlinAsJavaSupport) :
val result = arrayListOf<PsiClass>()
file.declarations.filterIsInstance<KtClassOrObject>().map { it.toLightClass() }.filterNotNullTo(result)
val moduleInfo = file.getModuleInfoPreferringJvmPlatform()
val moduleInfo = file.getModuleInfo()
// prohibit obtaining light classes for non-jvm modules trough KtFiles
// common files might be in fact compiled to jvm and thus correspond to a PsiClass
// this API does not provide context (like GSS) to be able to determine if this file is in fact seen through a jvm module
// this also fixes a problem where a Java JUnit run configuration producer would produce run configurations for a common file
if (moduleInfo.platform !is JvmPlatform) return emptyArray()
val jvmClassInfo = JvmFileClassUtil.getFileClassInfoNoResolve(file)
val fileClassFqName = file.javaFileFacadeFqName
@@ -28,6 +28,7 @@ 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.name.FqName
import org.jetbrains.kotlin.psi.KtClass
import org.jetbrains.kotlin.psi.KtFile
class KtFileLightClassTest : KotlinLightCodeInsightFixtureTestCase() {
@@ -93,7 +94,7 @@ class KtFileLightClassTest : KotlinLightCodeInsightFixtureTestCase() {
val injectedFile = (editor as? EditorWindow)?.injectedFile
assertEquals("Wrong injection language", "kotlin", injectedFile?.language?.id)
assertEquals("Injected class should be `A`", "A", (injectedFile as KtFile).classes.single().name)
assertEquals("Injected class should be `A`", "A", ((injectedFile as KtFile).declarations.single() as KtClass).toLightClass()!!.name)
}