IDEA-390110 [gradle] fix: add message and description fallbacks to GradleIssueFailure

(cherry picked from commit 4637926451f81bddd052b9997181bebd425f6f92)
IJ-CR-214557

GitOrigin-RevId: ad16edc376009210a59d421cf91054fe5904f93a
This commit is contained in:
Sergei Vorobyov
2026-08-11 10:29:34 +00:00
committed by intellij-monorepo-bot
parent dd487f45e3
commit 7a605c737f
2 changed files with 40 additions and 10 deletions
@@ -7,37 +7,41 @@ import java.nio.file.Path
import java.util.regex.Pattern
internal class GradleIssueFailureImpl(
override val message: String?,
override val description: String?,
message: String?,
description: String?,
override val causes: List<GradleIssueFailure>,
) : GradleIssueFailure {
override val message: String? = message ?: causes.resolveForNonEmptyCauses { it.message }
override val description: String? = description ?: causes.resolveForNonEmptyCauses { it.description }
override val rootCause: GradleIssueFailure = causes.resolveForNonEmptyCauses { it.rootCause } ?: this
override val filePosition: FilePosition? = resolveFilePosition(message, description, causes)
override val className: String? = resolveClassName(description)
override val text: String = resolveFailureText(message, description, className) ?: ""
override val text: String = resolveFailureText(message, description, className)
}
internal class GradleThrowableIssueFailure(
val throwable: Throwable,
) : GradleIssueFailure {
override val message: String? = throwable.message
override val causes: List<GradleThrowableIssueFailure> = resolveCauses(throwable)
override val message: String? = throwable.message ?: causes.resolveForNonEmptyCauses { it.message }
override val description: String = throwable.stackTraceToString()
override val causes: List<GradleThrowableIssueFailure> = resolveCauses(throwable)
override val rootCause: GradleThrowableIssueFailure = causes.resolveForNonEmptyCauses { it.rootCause } ?: this
override val filePosition: FilePosition? = resolveFilePosition(message, description, causes)
override val filePosition: FilePosition? = resolveFilePosition(throwable.message, description, causes)
override val className: String = throwable.javaClass.name
override val text: String = resolveFailureText(message, description, className) ?: ""
override val text: String = resolveFailureText(throwable.message, description, className)
}
private fun resolveCauses(throwable: Throwable): List<GradleThrowableIssueFailure> {
@@ -64,14 +68,14 @@ private fun resolveClassName(description: String?): String? {
return candidate
}
private fun resolveFailureText(message: String?, description: String?, className: String?): String? {
private fun resolveFailureText(message: String?, description: String?, className: String?): String {
return when {
className != null && message != null -> "$className: $message"
className != null && description != null -> "$className: $description"
message != null -> message
description != null -> description
className != null -> className
else -> null
else -> ""
}
}
@@ -87,6 +87,32 @@ class GradleIssueFailureTest {
assertSame(rootCause, failure.rootCause)
}
@Test
fun `GradleIssueFailure resolves message from cause when own message is null`() {
val cause = GradleIssueFailure.createIssueFailure("cause message", null)
val failure = GradleIssueFailure.createIssueFailure(null, null, listOf(cause))
assertEquals("cause message", failure.message)
}
@Test
fun `GradleIssueFailure resolves description from cause when own description is null`() {
val cause = GradleIssueFailure.createIssueFailure(null, "cause description")
val failure = GradleIssueFailure.createIssueFailure(null, null, listOf(cause))
assertEquals("cause description", failure.description)
}
@Test
fun `GradleIssueFailure created from Throwable resolves message from cause when throwable message is null`() {
val causeThrowable = RuntimeException("root cause message")
val throwable = RuntimeException(null, causeThrowable)
val failure = GradleIssueFailure.createIssueFailure(throwable)
assertEquals("root cause message", failure.message)
}
@Test
fun `GradleIssueFailure resolves class name from description`() {
val failureMessage = "failed to find target current"