@@ -9,27 +9,44 @@ import com.intellij.openapi.progress.Task
99import com.intellij.openapi.project.DumbService
1010import com.intellij.openapi.project.Project
1111import com.intellij.openapi.roots.OrderEnumerator
12+ import com.intellij.openapi.roots.ProjectFileIndex
1213import com.intellij.openapi.ui.Messages
1314import com.intellij.openapi.util.Computable
1415import com.intellij.openapi.util.text.StringUtil
16+ import com.intellij.openapi.vfs.VirtualFile
1517import com.intellij.psi.PsiClass
1618import com.intellij.psi.PsiMethod
1719import com.intellij.refactoring.util.classMembers.MemberInfo
20+ import com.intellij.task.ProjectTask
1821import com.intellij.task.ProjectTaskManager
22+ import com.intellij.task.impl.ModuleBuildTaskImpl
23+ import com.intellij.task.impl.ModuleFilesBuildTaskImpl
24+ import com.intellij.task.impl.ProjectTaskList
1925import com.intellij.util.concurrency.AppExecutorUtil
26+ import com.intellij.util.containers.ContainerUtil
2027import com.intellij.util.containers.nullize
2128import com.intellij.util.io.exists
29+ import java.io.File
30+ import java.nio.file.Path
31+ import java.nio.file.Paths
32+ import java.time.LocalDateTime
33+ import java.time.format.DateTimeFormatter
34+ import java.util.Arrays
35+ import java.util.concurrent.TimeUnit
36+ import java.util.stream.Collectors
37+ import kotlin.io.path.pathString
2238import mu.KotlinLogging
39+ import org.jetbrains.concurrency.Promise
40+ import org.jetbrains.idea.maven.project.MavenProjectsManager
2341import org.jetbrains.kotlin.idea.util.module
2442import org.utbot.framework.CancellationStrategyType.CANCEL_EVERYTHING
2543import org.utbot.framework.CancellationStrategyType.NONE
2644import org.utbot.framework.CancellationStrategyType.SAVE_PROCESSED_RESULTS
2745import org.utbot.framework.UtSettings
2846import org.utbot.framework.codegen.domain.ProjectType.*
29- import org.utbot.framework.codegen.domain.ProjectType
3047import org.utbot.framework.codegen.domain.TypeReplacementApproach
31- import org.utbot.framework.plugin.api.ClassId
3248import org.utbot.framework.plugin.api.ApplicationContext
49+ import org.utbot.framework.plugin.api.ClassId
3350import org.utbot.framework.plugin.api.JavaDocCommentStyle
3451import org.utbot.framework.plugin.api.SpringApplicationContext
3552import org.utbot.framework.plugin.api.util.LockFile
@@ -52,13 +69,6 @@ import org.utbot.intellij.plugin.util.PluginWorkingDirProvider
5269import org.utbot.intellij.plugin.util.assertIsNonDispatchThread
5370import org.utbot.intellij.plugin.util.extractClassMethodsIncludingNested
5471import org.utbot.rd.terminateOnException
55- import java.io.File
56- import java.nio.file.Path
57- import java.nio.file.Paths
58- import java.util.concurrent.TimeUnit
59- import kotlin.io.path.pathString
60- import java.time.LocalDateTime
61- import java.time.format.DateTimeFormatter
6272
6373object UtTestsDialogProcessor {
6474 private val logger = KotlinLogging .logger {}
@@ -127,11 +137,26 @@ object UtTestsDialogProcessor {
127137 return GenerateTestsDialogWindow (model)
128138 }
129139
140+ private fun compile (project : Project , files : Array <VirtualFile >): Promise <ProjectTaskManager .Result > {
141+ val wholeModules = MavenProjectsManager .getInstance(project)?.hasProjects()? : false
142+ val buildTasks = ContainerUtil .map<Map .Entry <Module ?, List <VirtualFile >>, ProjectTask > (
143+ Arrays .stream(files).collect(Collectors .groupingBy { file: VirtualFile ->
144+ ProjectFileIndex .getInstance(project).getModuleForFile(file, false )
145+ }).entries
146+ ) { (key, value): Map .Entry <Module ?, List <VirtualFile >? > ->
147+ if (wholeModules) {
148+ // Maven-specific case, we have to compile the whole module
149+ ModuleBuildTaskImpl (key!! , false )
150+ } else {
151+ // Compile only chosen classes and their dependencies before generation.
152+ ModuleFilesBuildTaskImpl (key, false , value)
153+ }
154+ }
155+ return ProjectTaskManager .getInstance(project).run (ProjectTaskList (buildTasks))
156+ }
157+
130158 private fun createTests (project : Project , model : GenerateTestsModel ) {
131- val promise = ProjectTaskManager .getInstance(project).compile(
132- // Compile only chosen classes and their dependencies before generation.
133- * model.srcClasses.map { it.containingFile.virtualFile }.toTypedArray()
134- )
159+ val promise = compile(project, model.srcClasses.map { it.containingFile.virtualFile }.toTypedArray())
135160 promise.onSuccess {
136161 if (it.hasErrors() || it.isAborted)
137162 return @onSuccess
0 commit comments