[Gradle] Validation for definitionFile and packageName in cinterop

^KT-62800 Fixed
This commit is contained in:
Dmitrii Krasnov
2023-12-14 11:14:23 +01:00
committed by Space Team
parent cef46a9dd1
commit 7e61f9cb42
5 changed files with 64 additions and 0 deletions
@@ -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
@@ -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<String>) = build(
"""
@@ -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())
}
}
}
}
@@ -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) {
@@ -1200,4 +1200,5 @@ abstract class CInteropProcess @Inject internal constructor(params: Params) :
).run(args)
}
}
}