Working recognition of JUnit annotation in MP tests

(cherry picked from commit 3a21781)
This commit is contained in:
Dmitry Jemerov
2017-10-31 14:42:54 +01:00
parent 2ed3e88561
commit 44260cdc7c
@@ -27,12 +27,14 @@ import org.jetbrains.kotlin.descriptors.annotations.AnnotationWithTarget
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor
import org.jetbrains.kotlin.idea.facet.implementingDescriptors
import org.jetbrains.kotlin.idea.highlighter.markers.actualsFor
import org.jetbrains.kotlin.idea.project.targetPlatform
import org.jetbrains.kotlin.idea.util.module
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.descriptorUtil.classId
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
import org.jetbrains.kotlin.resolve.scopes.getDescriptorsFiltered
class KotlinMultiplatformJUnitRecognizer : JUnitRecognizer() {
override fun isTestAnnotated(method: PsiMethod): Boolean {
@@ -54,10 +56,14 @@ class KotlinMultiplatformJUnitRecognizer : JUnitRecognizer() {
private fun AnnotationWithTarget.isExpectOfAnnotation(fqName: String, implModules: Collection<ModuleDescriptor>): Boolean {
val annotationClass = annotation.type.constructor.declarationDescriptor as? ClassifierDescriptorWithTypeParameters ?: return false
if (!annotationClass.isExpect) return false
val classId = annotationClass.classId ?: return false
val segments = classId.relativeClassName.pathSegments()
return implModules
.any { module ->
module.actualsFor(annotationClass, checkCompatible = false)
module
.getPackage(classId.packageFqName).memberScope
.getDescriptorsFiltered(DescriptorKindFilter.CLASSIFIERS) { it == segments.first() }
.filterIsInstance<TypeAliasDescriptor>()
.any { it.classDescriptor?.fqNameSafe?.asString() == fqName }
}