@@ -2,6 +2,7 @@ package org.utbot.intellij.plugin.util
22
33import com.intellij.psi.PsiClass
44import com.intellij.psi.PsiMember
5+ import com.intellij.psi.PsiMethod
56import com.intellij.psi.PsiModifier
67import com.intellij.psi.SyntheticElement
78import com.intellij.refactoring.util.classMembers.MemberInfo
@@ -17,6 +18,9 @@ import org.utbot.framework.UtSettings
1718val PsiMember .isAbstract: Boolean
1819 get() = modifierList?.hasModifierProperty(PsiModifier .ABSTRACT )? : false
1920
21+ val PsiMember .isStatic: Boolean
22+ get() = modifierList?.hasModifierProperty(PsiModifier .STATIC )? : false
23+
2024private val PsiMember .isKotlinGetterOrSetter: Boolean
2125 get() {
2226 if (this !is KtLightMethod )
@@ -32,11 +36,20 @@ private val PsiMember.isKotlinAndProtected: Boolean
3236private val PsiMember .isKotlinAutogeneratedMethod: Boolean
3337 get() = this is KtLightMethod && navigationElement is KtClass
3438
35- fun Iterable<MemberInfo>.filterTestableMethods (): List <MemberInfo > = this
39+ private val PsiMethod .canBeCalledStatically: Boolean
40+ get() = isStatic || containingClass?.isStatic ? : throw IllegalStateException (" No containing class found for method $this " )
41+
42+ private val PsiMethod .isUntestableMethodOfAbstractOrInterface: Boolean
43+ get() {
44+ val hasAbstractContext = generateSequence(containingClass) { it.containingClass }.any { it.isAbstract || it.isInterface }
45+ return hasAbstractContext && ! canBeCalledStatically
46+ }
47+
48+ private fun Iterable<MemberInfo>.filterTestableMethods (): List <MemberInfo > = this
3649 .filterWhen(UtSettings .skipTestGenerationForSyntheticAndImplicitlyDeclaredMethods) {
3750 it.member !is SyntheticElement && ! it.member.isKotlinAutogeneratedMethod
3851 }
39- .filterNot { it.member.isAbstract }
52+ .filterNot { ( it.member as PsiMethod ).isUntestableMethodOfAbstractOrInterface }
4053 .filterNot { it.member.isKotlinGetterOrSetter }
4154 .filterNot { it.member.isKotlinAndProtected }
4255
0 commit comments