diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CinteropIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CinteropIT.kt index 55ee16f5914..2f573a75542 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CinteropIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CinteropIT.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.native import org.gradle.util.GradleVersion import org.jetbrains.kotlin.gradle.testbase.* +import org.jetbrains.kotlin.gradle.util.replaceText import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.condition.OS import kotlin.io.path.createDirectories @@ -95,6 +96,23 @@ class CinteropIT : KGPBaseTest() { } } + @DisplayName("KT-62800: validation fails if neither definitionFile nor packageName was specified") + @GradleTest + fun cinteropWithoutDefinitionFileAndPackageName(gradleVersion: GradleVersion) { + nativeProject("cinterop-with-header", gradleVersion = gradleVersion) { + buildGradleKts.replaceText("packageName(\"cinterop\")", "") + buildAndFail(":cinteropCinteropNative") { + assertOutputContains( + """ + |For the Cinterop task, either the `definitionFile` or `packageName` parameter must be specified, however, neither has been provided. + | + |More info here: https://kotlinlang.org/docs/multiplatform-dsl-reference.html#cinterops + """.trimMargin() + ) + } + } + } + @DisplayName("KT-62800: check that optional .def file in cinterop works well with configuration cache") @GradleTestVersions(minVersion = TestVersions.Gradle.G_8_1) // Gradle supports checking file existence with configuration cache only since 8.1 version @GradleTest 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 72502dbf035..c1e148e206c 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 @@ -679,6 +679,18 @@ object KotlinToolingDiagnostics { } } + object CInteropRequiredParametersNotSpecifiedError : ToolingDiagnosticFactory(ERROR) { + operator fun invoke(): ToolingDiagnostic { + return build( + """ + |For the Cinterop task, either the `definitionFile` or `packageName` parameter must be specified, however, neither has been provided. + | + |More info here: https://kotlinlang.org/docs/multiplatform-dsl-reference.html#cinterops + """.trimMargin() + ) + } + } + object IncorrectNativeDependenciesWarning : ToolingDiagnosticFactory(WARNING) { operator fun invoke(targetName: String, compilationName: String, dependencies: List) = build( """ diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/checkers/CInteropInputChecker.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/checkers/CInteropInputChecker.kt new file mode 100644 index 00000000000..ebaa243dc6f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/checkers/CInteropInputChecker.kt @@ -0,0 +1,32 @@ +/* + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.plugin.diagnostics.checkers + +import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle +import org.jetbrains.kotlin.gradle.plugin.await +import org.jetbrains.kotlin.gradle.plugin.diagnostics.* +import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinGradleProjectChecker +import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinGradleProjectCheckerContext +import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnosticsCollector +import org.jetbrains.kotlin.gradle.plugin.diagnostics.reportDiagnostic +import org.jetbrains.kotlin.gradle.tasks.CInteropProcess + +/** + * This class is made for checking if the required parameters for the CInteropProcess task are specified in the Gradle project. + */ +internal object CInteropInputChecker : KotlinGradleProjectChecker { + + override suspend fun KotlinGradleProjectCheckerContext.runChecks(collector: KotlinToolingDiagnosticsCollector) { + // We use "Ready for Execution" stage to ensure that any task parameters are finalized prior to execution. + KotlinPluginLifecycle.Stage.ReadyForExecution.await() + + project.tasks.withType(CInteropProcess::class.java).configureEach { + if (!it.definitionFile.isPresent && it.packageName.isNullOrBlank()) { + project.reportDiagnostic(KotlinToolingDiagnostics.CInteropRequiredParametersNotSpecifiedError()) + } + } + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/registerKotlinPluginExtensions.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/registerKotlinPluginExtensions.kt index b7d41c5cf13..f51b1651168 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/registerKotlinPluginExtensions.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/registerKotlinPluginExtensions.kt @@ -128,6 +128,7 @@ internal fun Project.registerKotlinPluginExtensions() { register(project, InternalGradlePropertiesUsageChecker) register(project, WasmSourceSetsNotFoundChecker) register(project, DuplicateSourceSetChecker) + register(project, CInteropInputChecker) register(project, IncorrectNativeDependenciesChecker) if (isMultiplatform) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt index c30cd2e828c..f6745396fb5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt @@ -1200,4 +1200,5 @@ abstract class CInteropProcess @Inject internal constructor(params: Params) : ).run(args) } } + }