diff --git a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/ui/actions/GenerateTestsAction.kt b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/ui/actions/GenerateTestsAction.kt index 34e7540c5f..635b347ec6 100644 --- a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/ui/actions/GenerateTestsAction.kt +++ b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/ui/actions/GenerateTestsAction.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.idea.core.getPackage import org.jetbrains.kotlin.idea.core.util.toPsiDirectory import org.jetbrains.kotlin.idea.core.util.toPsiFile import org.utbot.intellij.plugin.util.extractFirstLevelMembers +import org.utbot.intellij.plugin.util.isVisible import java.util.* import org.jetbrains.kotlin.j2k.getContainingClass import org.jetbrains.kotlin.utils.addIfNotNull @@ -52,7 +53,7 @@ class GenerateTestsAction : AnAction(), UpdateInBackground { if (psiElementHandler.isCreateTestActionAvailable(element)) { val srcClass = psiElementHandler.containingClass(element) ?: return null - if (srcClass.isInterface) return null + if (srcClass.isInterface || !srcClass.isVisible) return null val srcSourceRoot = srcClass.getSourceRoot() ?: return null val srcMembers = srcClass.extractFirstLevelMembers(false) val focusedMethod = focusedMethodOrNull(element, srcMembers, psiElementHandler) diff --git a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/ExtractMembersHelper.kt b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/PsiClassHelper.kt similarity index 61% rename from utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/ExtractMembersHelper.kt rename to utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/PsiClassHelper.kt index b19b0b0e71..1de5b012a7 100644 --- a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/ExtractMembersHelper.kt +++ b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/PsiClassHelper.kt @@ -17,10 +17,24 @@ private fun Iterable.filterTestableMethods(): List = thi .filterWhen(UtSettings.skipTestGenerationForSyntheticMethods) { it.member !is SyntheticElement } .filterNot { it.isAbstract } +private val PsiClass.isPrivateOrProtected: Boolean + get() = this.modifierList?.let { + hasModifierProperty(PsiModifier.PRIVATE) || hasModifierProperty(PsiModifier.PROTECTED) + } ?: false + + // TODO: maybe we need to delete [includeInherited] param here (always false when calling)? -fun PsiClass.extractClassMethodsIncludingNested(includeInherited: Boolean): List = - TestIntegrationUtils.extractClassMethods(this, includeInherited) - .filterTestableMethods() + innerClasses.flatMap { it.extractClassMethodsIncludingNested(includeInherited) } +fun PsiClass.extractClassMethodsIncludingNested(includeInherited: Boolean): List { + val ourMethods = TestIntegrationUtils.extractClassMethods(this, includeInherited) + .filterTestableMethods() + + val methodsFromNestedClasses = + innerClasses + .filter { !it.isPrivateOrProtected } + .flatMap { it.extractClassMethodsIncludingNested(includeInherited) } + + return ourMethods + methodsFromNestedClasses +} fun PsiClass.extractFirstLevelMembers(includeInherited: Boolean): List { val methods = TestIntegrationUtils.extractClassMethods(this, includeInherited) @@ -29,5 +43,8 @@ fun PsiClass.extractFirstLevelMembers(includeInherited: Boolean): List