Skip to content

Commit 0be3e02

Browse files
Compile whole modules before generation for Maven projects (#2081)
Project is not built automatically before UnitTestBot reads classes #2021
1 parent d93fd56 commit 0be3e02

File tree

1 file changed

+38
-13
lines changed

1 file changed

+38
-13
lines changed

utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/generator/UtTestsDialogProcessor.kt

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,27 +9,44 @@ import com.intellij.openapi.progress.Task
99
import com.intellij.openapi.project.DumbService
1010
import com.intellij.openapi.project.Project
1111
import com.intellij.openapi.roots.OrderEnumerator
12+
import com.intellij.openapi.roots.ProjectFileIndex
1213
import com.intellij.openapi.ui.Messages
1314
import com.intellij.openapi.util.Computable
1415
import com.intellij.openapi.util.text.StringUtil
16+
import com.intellij.openapi.vfs.VirtualFile
1517
import com.intellij.psi.PsiClass
1618
import com.intellij.psi.PsiMethod
1719
import com.intellij.refactoring.util.classMembers.MemberInfo
20+
import com.intellij.task.ProjectTask
1821
import 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
1925
import com.intellij.util.concurrency.AppExecutorUtil
26+
import com.intellij.util.containers.ContainerUtil
2027
import com.intellij.util.containers.nullize
2128
import 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
2238
import mu.KotlinLogging
39+
import org.jetbrains.concurrency.Promise
40+
import org.jetbrains.idea.maven.project.MavenProjectsManager
2341
import org.jetbrains.kotlin.idea.util.module
2442
import org.utbot.framework.CancellationStrategyType.CANCEL_EVERYTHING
2543
import org.utbot.framework.CancellationStrategyType.NONE
2644
import org.utbot.framework.CancellationStrategyType.SAVE_PROCESSED_RESULTS
2745
import org.utbot.framework.UtSettings
2846
import org.utbot.framework.codegen.domain.ProjectType.*
29-
import org.utbot.framework.codegen.domain.ProjectType
3047
import org.utbot.framework.codegen.domain.TypeReplacementApproach
31-
import org.utbot.framework.plugin.api.ClassId
3248
import org.utbot.framework.plugin.api.ApplicationContext
49+
import org.utbot.framework.plugin.api.ClassId
3350
import org.utbot.framework.plugin.api.JavaDocCommentStyle
3451
import org.utbot.framework.plugin.api.SpringApplicationContext
3552
import org.utbot.framework.plugin.api.util.LockFile
@@ -52,13 +69,6 @@ import org.utbot.intellij.plugin.util.PluginWorkingDirProvider
5269
import org.utbot.intellij.plugin.util.assertIsNonDispatchThread
5370
import org.utbot.intellij.plugin.util.extractClassMethodsIncludingNested
5471
import 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

6373
object 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

Comments
 (0)