@@ -5,6 +5,7 @@ import org.utbot.intellij.plugin.ui.utils.PsiElementHandler
5
5
import com.intellij.openapi.actionSystem.AnAction
6
6
import com.intellij.openapi.actionSystem.AnActionEvent
7
7
import com.intellij.openapi.actionSystem.CommonDataKeys
8
+ import com.intellij.openapi.actionSystem.PlatformDataKeys
8
9
import com.intellij.openapi.editor.Editor
9
10
import com.intellij.openapi.module.ModuleUtil
10
11
import com.intellij.openapi.project.Project
@@ -19,19 +20,21 @@ import org.jetbrains.kotlin.idea.core.util.toPsiDirectory
19
20
import org.jetbrains.kotlin.idea.core.util.toPsiFile
20
21
import org.utbot.intellij.plugin.util.extractFirstLevelMembers
21
22
import java.util.*
23
+ import org.jetbrains.kotlin.j2k.getContainingClass
24
+ import org.jetbrains.kotlin.utils.addIfNotNull
22
25
23
26
class GenerateTestsAction : AnAction () {
24
27
override fun actionPerformed (e : AnActionEvent ) {
25
28
val project = e.project ? : return
26
- val (srcClasses, focusedMethod , extractMembersFromSrcClasses) = getPsiTargets(e) ? : return
27
- UtTestsDialogProcessor .createDialogAndGenerateTests(project, srcClasses, extractMembersFromSrcClasses, focusedMethod )
29
+ val (srcClasses, focusedMethods , extractMembersFromSrcClasses) = getPsiTargets(e) ? : return
30
+ UtTestsDialogProcessor .createDialogAndGenerateTests(project, srcClasses, extractMembersFromSrcClasses, focusedMethods )
28
31
}
29
32
30
33
override fun update (e : AnActionEvent ) {
31
34
e.presentation.isEnabled = getPsiTargets(e) != null
32
35
}
33
36
34
- private fun getPsiTargets (e : AnActionEvent ): Triple <Set <PsiClass >, MemberInfo? , Boolean>? {
37
+ private fun getPsiTargets (e : AnActionEvent ): Triple <Set <PsiClass >, Set< MemberInfo> , Boolean>? {
35
38
val project = e.project ? : return null
36
39
val editor = e.getData(CommonDataKeys .EDITOR )
37
40
if (editor != null ) {
@@ -56,19 +59,19 @@ class GenerateTestsAction : AnAction() {
56
59
return null
57
60
}
58
61
59
- return Triple (setOf (srcClass), focusedMethod, true )
62
+ return Triple (setOf (srcClass), if ( focusedMethod != null ) setOf (focusedMethod) else emptySet() , true )
60
63
}
61
64
} else {
62
65
// The action is being called from 'Project' tool window
63
66
val srcClasses = mutableSetOf<PsiClass >()
64
- var selectedMethod : MemberInfo ? = null
67
+ val selectedMethods = mutableSetOf< MemberInfo >()
65
68
var extractMembersFromSrcClasses = false
66
- val element = e.getData(CommonDataKeys .PSI_ELEMENT ) ? : return null
69
+ val element = e.getData(CommonDataKeys .PSI_ELEMENT )
67
70
if (element is PsiFileSystemItem ) {
68
71
e.getData(CommonDataKeys .VIRTUAL_FILE_ARRAY )?.let {
69
72
srcClasses + = getAllClasses(project, it)
70
73
}
71
- } else {
74
+ } else if (element is PsiElement ) {
72
75
val file = element.containingFile ? : return null
73
76
val psiElementHandler = PsiElementHandler .makePsiElementHandler(file)
74
77
@@ -81,11 +84,29 @@ class GenerateTestsAction : AnAction() {
81
84
}
82
85
83
86
if (element is PsiMethod ) {
84
- selectedMethod = MemberInfo (element)
87
+ selectedMethods.add(MemberInfo (element))
88
+ }
89
+ }
90
+ } else {
91
+ val someSelection = e.getData(PlatformDataKeys .SELECTED_ITEMS )? : return null
92
+ someSelection.forEach {
93
+ when (it) {
94
+ is PsiFileSystemItem -> srcClasses + = getAllClasses(project, arrayOf(it.virtualFile))
95
+ is PsiClass -> srcClasses.add(it)
96
+ is PsiElement -> {
97
+ srcClasses.addIfNotNull(it.getContainingClass())
98
+ if (it is PsiMethod ) {
99
+ selectedMethods.add(MemberInfo (it))
100
+ extractMembersFromSrcClasses = true
101
+ }
102
+ }
85
103
}
86
104
}
87
105
}
88
106
srcClasses.removeIf { it.isInterface }
107
+ if (srcClasses.size > 1 ) {
108
+ extractMembersFromSrcClasses = false
109
+ }
89
110
var commonSourceRoot = null as VirtualFile ?
90
111
for (srcClass in srcClasses) {
91
112
if (commonSourceRoot == null ) {
@@ -100,7 +121,7 @@ class GenerateTestsAction : AnAction() {
100
121
.filter { folder -> ! folder.rootType.isForTests && folder.file == commonSourceRoot}
101
122
.findAny().isPresent ) return null
102
123
103
- return Triple (srcClasses.toSet(), selectedMethod , extractMembersFromSrcClasses)
124
+ return Triple (srcClasses.toSet(), selectedMethods.toSet() , extractMembersFromSrcClasses)
104
125
}
105
126
return null
106
127
}
0 commit comments