Skip to content

Commit f229c8a

Browse files
authored
Kotlin generation fix (#1544)
[utbot-rd] As JavaFileManager does not work with kotlin files - form now all kotlin srcClasses that are used in test generation are cached in advance Fix #1451
1 parent 6e16f85 commit f229c8a

File tree

2 files changed

+23
-19
lines changed

2 files changed

+23
-19
lines changed

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

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package org.utbot.intellij.plugin.generator
22

3-
import com.intellij.openapi.application.ApplicationManager
4-
import com.intellij.openapi.application.PathManager
5-
import com.intellij.openapi.application.ReadAction
6-
import com.intellij.openapi.application.invokeLater
3+
import com.intellij.openapi.application.*
74
import com.intellij.openapi.compiler.CompilerPaths
85
import com.intellij.openapi.components.service
96
import com.intellij.openapi.module.Module
@@ -166,7 +163,12 @@ object UtTestsDialogProcessor {
166163
val psi2KClass = mutableMapOf<PsiClass, ClassId>()
167164
var processedClasses = 0
168165
val totalClasses = model.srcClasses.size
169-
val process = EngineProcess.createBlocking(project)
166+
val classNameToPath = runReadAction {
167+
model.srcClasses.map { psiClass ->
168+
psiClass.canonicalName to psiClass.containingFile.virtualFile.canonicalPath
169+
}.toMap()
170+
}
171+
val process = EngineProcess.createBlocking(project, classNameToPath)
170172

171173
process.terminateOnException { _ ->
172174
process.setupUtContext(buildDirs + classpathList)
@@ -191,12 +193,14 @@ object UtTestsDialogProcessor {
191193
}
192194
}
193195

194-
val (methods, className) = process.executeWithTimeoutSuspended {
196+
val (methods, classNameForLog) = process.executeWithTimeoutSuspended {
195197
var canonicalName = ""
196198
var srcMethods: List<MemberInfo> = emptyList()
199+
var srcNameForLog: String? = null
197200
DumbService.getInstance(project)
198201
.runReadActionInSmartMode(Computable {
199202
canonicalName = srcClass.canonicalName
203+
srcNameForLog = srcClass.name
200204
srcMethods = if (model.extractMembersFromSrcClasses) {
201205
val chosenMethods =
202206
model.selectedMembers.filter { it.member is PsiMethod }
@@ -214,11 +218,11 @@ object UtTestsDialogProcessor {
214218
process.findMethodsInClassMatchingSelected(
215219
classId,
216220
srcMethods
217-
) to srcClass.name
221+
) to srcNameForLog
218222
}
219223

220224
if (methods.isEmpty()) {
221-
logger.error { "No methods matching selected found in class $className." }
225+
logger.error { "No methods matching selected found in class $classNameForLog." }
222226
continue
223227
}
224228

@@ -227,7 +231,7 @@ object UtTestsDialogProcessor {
227231
updateIndicator(
228232
indicator,
229233
ProgressRange.SOLVING,
230-
"Generate test cases for class $className",
234+
"Generate test cases for class $classNameForLog",
231235
processedClasses.toDouble() / totalClasses
232236
)
233237

@@ -250,7 +254,7 @@ object UtTestsDialogProcessor {
250254
updateIndicator(
251255
indicator,
252256
ProgressRange.SOLVING,
253-
"Generate test cases for class $className",
257+
"Generate test cases for class $classNameForLog",
254258
(processedClasses.toDouble() + innerTimeoutRatio) / totalClasses
255259
)
256260
}, 0, 500, TimeUnit.MILLISECONDS)
@@ -273,16 +277,16 @@ object UtTestsDialogProcessor {
273277
if (rdGenerateResult.notEmptyCases == 0) {
274278
if (!indicator.isCanceled) {
275279
if (model.srcClasses.size > 1) {
276-
logger.error { "Failed to generate any tests cases for class $className" }
280+
logger.error { "Failed to generate any tests cases for class $classNameForLog" }
277281
} else {
278282
showErrorDialogLater(
279283
model.project,
280-
errorMessage(className, secondsTimeout),
281-
title = "Failed to generate unit tests for class $className"
284+
errorMessage(classNameForLog, secondsTimeout),
285+
title = "Failed to generate unit tests for class $classNameForLog"
282286
)
283287
}
284288
} else {
285-
logger.warn { "Generation was cancelled for class $className" }
289+
logger.warn { "Generation was cancelled for class $classNameForLog" }
286290
}
287291
} else {
288292
testSetsByClass[srcClass] = rdGenerateResult

utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/process/EngineProcess.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ data class RdTestGenerationResult(val notEmptyCases: Int, val testSetsId: Long)
6161
class EngineProcessInstantDeathException :
6262
InstantProcessDeathException(UtSettings.engineProcessDebugPort, UtSettings.runEngineProcessWithDebug)
6363

64-
class EngineProcess private constructor(val project: Project, rdProcess: ProcessWithRdServer) :
64+
class EngineProcess private constructor(val project: Project, private val classNameToPath: Map<String, String?>, rdProcess: ProcessWithRdServer) :
6565
ProcessWithRdServer by rdProcess {
6666
companion object {
6767
private val log4j2ConfigFile: File
@@ -125,9 +125,9 @@ class EngineProcess private constructor(val project: Project, rdProcess: Process
125125
add(rdPortArgument(port))
126126
}
127127

128-
fun createBlocking(project: Project): EngineProcess = runBlocking { EngineProcess(project) }
128+
fun createBlocking(project: Project, classNameToPath: Map<String, String?>): EngineProcess = runBlocking { EngineProcess(project, classNameToPath) }
129129

130-
suspend operator fun invoke(project: Project): EngineProcess =
130+
suspend operator fun invoke(project: Project, classNameToPath: Map<String, String?>): EngineProcess =
131131
LifetimeDefinition().terminateOnException { lifetime ->
132132
val rdProcess = startUtProcessWithRdServer(lifetime) { port ->
133133
val cmd = obtainEngineProcessCommandLine(port)
@@ -152,7 +152,7 @@ class EngineProcess private constructor(val project: Project, rdProcess: Process
152152
}
153153
rdProcess.awaitProcessReady()
154154

155-
return EngineProcess(project, rdProcess)
155+
return EngineProcess(project, classNameToPath, rdProcess)
156156
}
157157
}
158158

@@ -177,7 +177,7 @@ class EngineProcess private constructor(val project: Project, rdProcess: Process
177177
val sourceFile = psiClass?.navigationElement?.containingFile?.virtualFile?.canonicalPath
178178

179179
logger.debug { "computeSourceFileByClass result: $sourceFile" }
180-
sourceFile
180+
sourceFile ?: classNameToPath[params.canonicalClassName]
181181
}
182182

183183
fun createTestGenerator(

0 commit comments

Comments
 (0)