From 7a605c737f018ffdcccf2bb43f8bf8eb165c548b Mon Sep 17 00:00:00 2001 From: Sergei Vorobyov Date: Mon, 6 Jul 2026 18:45:46 +0200 Subject: [PATCH] IDEA-390110 [gradle] fix: add message and description fallbacks to GradleIssueFailure (cherry picked from commit 4637926451f81bddd052b9997181bebd425f6f92) IJ-CR-214557 GitOrigin-RevId: ad16edc376009210a59d421cf91054fe5904f93a --- .../gradle/issue/GradleIssueFailureImpl.kt | 24 ++++++++++------- .../gradle/issue/GradleIssueFailureTest.kt | 26 +++++++++++++++++++ 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/issue/GradleIssueFailureImpl.kt b/plugins/gradle/src/org/jetbrains/plugins/gradle/issue/GradleIssueFailureImpl.kt index 16d13dcf1b06..ee44c831b05d 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/issue/GradleIssueFailureImpl.kt +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/issue/GradleIssueFailureImpl.kt @@ -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 { + 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 = resolveCauses(throwable) + + override val message: String? = throwable.message ?: causes.resolveForNonEmptyCauses { it.message } override val description: String = throwable.stackTraceToString() - override val causes: List = 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 { @@ -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 -> "" } } diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/issue/GradleIssueFailureTest.kt b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/issue/GradleIssueFailureTest.kt index a4236fb1964c..fe9d40f5056e 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/issue/GradleIssueFailureTest.kt +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/issue/GradleIssueFailureTest.kt @@ -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"