diff --git a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/language/JavaLanguage.kt b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/language/JavaLanguage.kt index 5fed1159cc..0895eb73cf 100644 --- a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/language/JavaLanguage.kt +++ b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/language/JavaLanguage.kt @@ -28,7 +28,6 @@ import org.jetbrains.kotlin.utils.addIfNotNull import org.utbot.framework.plugin.api.util.LockFile import org.utbot.intellij.plugin.models.packageName import org.utbot.intellij.plugin.ui.InvalidClassNotifier -import org.utbot.intellij.plugin.util.isAbstract import org.utbot.intellij.plugin.language.agnostic.LanguageAssistant import org.utbot.intellij.plugin.util.findSdkVersionOrNull @@ -170,12 +169,6 @@ object JvmLanguageAssistant : LanguageAssistant() { return true } - val isAbstractOrInterface = this.isInterface || this.isAbstract - if (isAbstractOrInterface) { - if (withWarnings) InvalidClassNotifier.notify("abstract class or interface ${this.name}") - return true - } - val isInvisible = !this.isVisible if (isInvisible) { if (withWarnings) InvalidClassNotifier.notify("private or protected class ${this.name}") diff --git a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/PsiClassHelper.kt b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/PsiClassHelper.kt index 2ce3fc0eb7..f5d921f38a 100644 --- a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/PsiClassHelper.kt +++ b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/PsiClassHelper.kt @@ -2,6 +2,7 @@ package org.utbot.intellij.plugin.util import com.intellij.psi.PsiClass import com.intellij.psi.PsiMember +import com.intellij.psi.PsiMethod import com.intellij.psi.PsiModifier import com.intellij.psi.SyntheticElement import com.intellij.refactoring.util.classMembers.MemberInfo @@ -17,6 +18,9 @@ import org.utbot.framework.UtSettings val PsiMember.isAbstract: Boolean get() = modifierList?.hasModifierProperty(PsiModifier.ABSTRACT)?: false +val PsiMember.isStatic: Boolean + get() = modifierList?.hasModifierProperty(PsiModifier.STATIC)?: false + private val PsiMember.isKotlinGetterOrSetter: Boolean get() { if (this !is KtLightMethod) @@ -32,11 +36,20 @@ private val PsiMember.isKotlinAndProtected: Boolean private val PsiMember.isKotlinAutogeneratedMethod: Boolean get() = this is KtLightMethod && navigationElement is KtClass -fun Iterable.filterTestableMethods(): List = this +private val PsiMethod.canBeCalledStatically: Boolean + get() = isStatic || containingClass?.isStatic ?: throw IllegalStateException("No containing class found for method $this") + +private val PsiMethod.isUntestableMethodOfAbstractOrInterface: Boolean + get() { + val hasAbstractContext = generateSequence(containingClass) { it.containingClass }.any { it.isAbstract || it.isInterface } + return hasAbstractContext && !canBeCalledStatically + } + +private fun Iterable.filterTestableMethods(): List = this .filterWhen(UtSettings.skipTestGenerationForSyntheticAndImplicitlyDeclaredMethods) { it.member !is SyntheticElement && !it.member.isKotlinAutogeneratedMethod } - .filterNot { it.member.isAbstract } + .filterNot { (it.member as PsiMethod).isUntestableMethodOfAbstractOrInterface } .filterNot { it.member.isKotlinGetterOrSetter } .filterNot { it.member.isKotlinAndProtected }