Fix running tests from expect class by using FakeLightClasses
Unfortunately, IJ API requires us to return instances of PsiClass/PsiMethod in order to proceed with run configuration creation. In fact, those instances will be queried only by trivial requests, like containingFile or name. Therefore, full-blown LightClasses are not needed and even harmful, because for some declarations we can not build proper light classes (like for expect declarations, for example) Previously it mostly worked because most of declarations in common indeed have corresponding Light-instances (because common source-set can be seen from Java through JVM-part of a project). ^KT-34503 Fixed
This commit is contained in:
@@ -9,6 +9,8 @@ import com.intellij.execution.Location
|
||||
import com.intellij.psi.PsiClass
|
||||
import com.intellij.psi.PsiMethod
|
||||
import org.jetbrains.kotlin.asJava.toLightClass
|
||||
import org.jetbrains.kotlin.idea.caches.lightClasses.KtFakeLightClass
|
||||
import org.jetbrains.kotlin.idea.caches.lightClasses.KtFakeLightMethod
|
||||
import org.jetbrains.kotlin.psi.KtClass
|
||||
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||
import org.jetbrains.kotlin.psi.KtNamedFunction
|
||||
@@ -17,13 +19,11 @@ import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
|
||||
internal fun getTestMethodForKotlinTest(location: Location<*>): PsiMethod? {
|
||||
val leaf = location.psiElement
|
||||
val function = leaf?.getParentOfType<KtNamedFunction>(false) ?: return null
|
||||
val owner = function.getParentOfType<KtDeclaration>(true) as? KtClass ?: return null
|
||||
val delegate = owner.toLightClass() ?: return null
|
||||
return delegate.methods.firstOrNull { it.navigationElement == function } ?: return null
|
||||
return KtFakeLightMethod.get(function)
|
||||
}
|
||||
|
||||
internal fun getTestClassForKotlinTest(location: Location<*>): PsiClass? {
|
||||
val leaf = location.psiElement
|
||||
val owner = leaf?.getParentOfType<KtDeclaration>(true) as? KtClass ?: return null
|
||||
return owner.toLightClass()
|
||||
return KtFakeLightClass(owner)
|
||||
}
|
||||
+2
-2
@@ -3,7 +3,7 @@ package sample
|
||||
import kotlin.test.Test
|
||||
import kotlin.test.assertTrue
|
||||
|
||||
expect class <lineMarker descr="Run Test" settings="Nothing here"><lineMarker descr="Has actuals in JS, JVM">SampleTests</lineMarker></lineMarker> {
|
||||
expect class <lineMarker descr="Run Test" settings=" cleanJsBrowserTest jsBrowserTest --tests \"sample.SampleTests\" cleanJsNodeTest jsNodeTest --tests \"sample.SampleTests\" cleanJvmTest jvmTest --tests \"sample.SampleTests\" --continue"><lineMarker descr="Has actuals in JS, JVM">SampleTests</lineMarker></lineMarker> {
|
||||
@Test
|
||||
fun <lineMarker descr="Run Test" settings="Nothing here"><lineMarker descr="Has actuals in JS, JVM">testMe</lineMarker></lineMarker>()
|
||||
fun <lineMarker descr="Run Test" settings=" cleanJsBrowserTest jsBrowserTest --tests \"sample.SampleTests.testMe\" cleanJsNodeTest jsNodeTest --tests \"sample.SampleTests.testMe\" cleanJvmTest jvmTest --tests \"sample.SampleTests.testMe\" --continue"><lineMarker descr="Has actuals in JS, JVM">testMe</lineMarker></lineMarker>()
|
||||
}
|
||||
Reference in New Issue
Block a user