in plugin-bazel/src/main/kotlin/org/jetbrains/bazel/hotswap/ClassFileManifestBuilder.kt [69:115]
fun buildManifest(session: HotSwappableDebugSession, progress: HotSwapProgress?): ClassFileManifest.Diff? {
val env = session.env
val configuration = getConfiguration(env) ?: return null
val project = configuration.getProject()
if (!HotSwapUtils.canHotSwap(env, project)) {
return null
}
val jvmEnvDeferred: Deferred<JvmEnvironmentItem?> =
BazelCoroutineService.getInstance(project).startAsync fn@{
val targets = configuration.getAffectedTargets()
if (targets.isEmpty()) {
progress?.addMessage(
session.session,
MessageCategory.WARNING,
BazelHotSwapBundle.message("hotswap.message.manifest.empty.target.error"),
)
return@fn null
}
val target = targets.first()
val isTest = target.isTestTarget(project)
return@fn queryJvmEnvironment(project, target)
}
progress?.setCancelWorker { jvmEnvDeferred.cancel() }
val result =
try {
runBlocking { jvmEnvDeferred.await() }
} catch (_: InterruptedException) {
jvmEnvDeferred.cancel()
throw RunCanceledByUserException()
} catch (_: CancellationException) {
jvmEnvDeferred.cancel()
throw RunCanceledByUserException()
} catch (e: ExecutionException) {
throw com.intellij.execution.ExecutionException(e)
}
if (result == null) {
return null
}
val jars =
result.classpath
.distinct()
.filter { Files.isRegularFile(it) && it.extension == "jar" }
val oldManifest = env.getManifest()
val newManifest = ClassFileManifest.build(jars, oldManifest)
env.getManifestRef()?.set(newManifest)
return ClassFileManifest.modifiedClasses(oldManifest, newManifest)
}