KtFile.getClasses() returns empty array for non-jvm files
This commit is contained in:
+9
-1
@@ -12,11 +12,13 @@ import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade
|
|||||||
import org.jetbrains.kotlin.asJava.toLightClass
|
import org.jetbrains.kotlin.asJava.toLightClass
|
||||||
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
|
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
|
||||||
import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName
|
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.idea.caches.resolve.util.isInDumbMode
|
||||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
import org.jetbrains.kotlin.psi.KtFileClassProvider
|
import org.jetbrains.kotlin.psi.KtFileClassProvider
|
||||||
import org.jetbrains.kotlin.psi.analysisContext
|
import org.jetbrains.kotlin.psi.analysisContext
|
||||||
|
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
|
||||||
|
|
||||||
class KtFileClassProviderImpl(val kotlinAsJavaSupport: KotlinAsJavaSupport) :
|
class KtFileClassProviderImpl(val kotlinAsJavaSupport: KotlinAsJavaSupport) :
|
||||||
KtFileClassProvider {
|
KtFileClassProvider {
|
||||||
@@ -33,7 +35,13 @@ class KtFileClassProviderImpl(val kotlinAsJavaSupport: KotlinAsJavaSupport) :
|
|||||||
val result = arrayListOf<PsiClass>()
|
val result = arrayListOf<PsiClass>()
|
||||||
file.declarations.filterIsInstance<KtClassOrObject>().map { it.toLightClass() }.filterNotNullTo(result)
|
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 jvmClassInfo = JvmFileClassUtil.getFileClassInfoNoResolve(file)
|
||||||
val fileClassFqName = file.javaFileFacadeFqName
|
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.KotlinLightProjectDescriptor
|
||||||
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
|
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
import org.jetbrains.kotlin.psi.KtClass
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
|
|
||||||
class KtFileLightClassTest : KotlinLightCodeInsightFixtureTestCase() {
|
class KtFileLightClassTest : KotlinLightCodeInsightFixtureTestCase() {
|
||||||
@@ -93,7 +94,7 @@ class KtFileLightClassTest : KotlinLightCodeInsightFixtureTestCase() {
|
|||||||
|
|
||||||
val injectedFile = (editor as? EditorWindow)?.injectedFile
|
val injectedFile = (editor as? EditorWindow)?.injectedFile
|
||||||
assertEquals("Wrong injection language", "kotlin", injectedFile?.language?.id)
|
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user