From 71c1abde5ccac40a8ac306f0583c1f40bb8a520b Mon Sep 17 00:00:00 2001 From: Dmitry Savvinov Date: Mon, 26 Jun 2023 15:45:00 +0300 Subject: [PATCH] [mpp] Minor: use ToolingDiagnostic for reporting cyclic dependsOn-edges --- .../plugin/diagnostics/KotlinToolingDiagnostics.kt | 8 ++++++++ .../gradle/plugin/sources/CircularDependsOnChecker.kt | 10 ++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnostics.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnostics.kt index 8a4632348e6..0e4c7bda5e9 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnostics.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnostics.kt @@ -594,6 +594,14 @@ object KotlinToolingDiagnostics { throwable = trace, ) } + + object CircularDependsOnEdges : ToolingDiagnosticFactory(FATAL) { + operator fun invoke(sourceSetsOnCycle: Collection) = build( + """ + Circular dependsOn hierarchy found in the Kotlin source sets: ${sourceSetsOnCycle.joinToString(" -> ")} + """.trimIndent() + ) + } } private fun String.indentLines(nSpaces: Int = 4, skipFirstLine: Boolean = true): String { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/CircularDependsOnChecker.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/CircularDependsOnChecker.kt index ba0330df40e..5d52d05b114 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/CircularDependsOnChecker.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/CircularDependsOnChecker.kt @@ -5,8 +5,9 @@ package org.jetbrains.kotlin.gradle.plugin.sources -import org.gradle.api.InvalidUserCodeException import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet +import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics +import org.jetbrains.kotlin.gradle.plugin.diagnostics.reportDiagnostic internal fun KotlinSourceSet.checkForCircularDependsOnEdges(other: KotlinSourceSet): Nothing? { val stack = mutableListOf(this) @@ -15,9 +16,10 @@ internal fun KotlinSourceSet.checkForCircularDependsOnEdges(other: KotlinSourceS fun checkReachableRecursively(from: KotlinSourceSet) { if (!visited.add(from)) return stack += from - if (this == from) throw InvalidUserCodeException( - "Circular dependsOn hierarchy found in the Kotlin source sets: ${(stack.toList()).joinToString(" -> ") { it.name }}" - ) + if (this == from) { + // CircularDependsOnEdges has severity FATAL, so this call will throw an exception + project.reportDiagnostic(KotlinToolingDiagnostics.CircularDependsOnEdges(stack.map { it.name })) + } from.dependsOn.forEach { next -> checkReachableRecursively(next) } stack -= from }