Fix requiresVisibilityOf in the Gradle plugin (KT-34312)
* Fix adding new items (which was untested, as the logic was only tested by unit tests) * Exclude the source set's dependsOn transitive closure from the requiresVisibilityOf checks (i.e. these source sets are considered visible) * Fix minor issues in the `UnsatisfiedSourceSetVisibilityException` message * Add `requiresVisibilityOf` to integration tests Issue #KT-34312 Fixed
This commit is contained in:
+9
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.NativeOutputKind
|
|||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.UnusedSourceSetsChecker
|
import org.jetbrains.kotlin.gradle.plugin.mpp.UnusedSourceSetsChecker
|
||||||
import org.jetbrains.kotlin.gradle.plugin.sources.METADATA_CONFIGURATION_NAME_SUFFIX
|
import org.jetbrains.kotlin.gradle.plugin.sources.METADATA_CONFIGURATION_NAME_SUFFIX
|
||||||
import org.jetbrains.kotlin.gradle.plugin.sources.SourceSetConsistencyChecks
|
import org.jetbrains.kotlin.gradle.plugin.sources.SourceSetConsistencyChecks
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.sources.UnsatisfiedSourceSetVisibilityException
|
||||||
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
|
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
|
||||||
import org.jetbrains.kotlin.gradle.util.*
|
import org.jetbrains.kotlin.gradle.util.*
|
||||||
import org.jetbrains.kotlin.konan.target.CompilerOutputKind
|
import org.jetbrains.kotlin.konan.target.CompilerOutputKind
|
||||||
@@ -2104,6 +2105,14 @@ class NewMultiplatformIT : BaseGradleIT() {
|
|||||||
// Native:
|
// Native:
|
||||||
assertFileExists("build/classes/kotlin/$nativeHostTargetName/integrationTest/integrationTest.klib")
|
assertFileExists("build/classes/kotlin/$nativeHostTargetName/integrationTest/integrationTest.klib")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gradleBuildScript().appendText(
|
||||||
|
"\nkotlin.sourceSets { getByName(\"commonTest\").requiresVisibilityOf(getByName(\"commonIntegrationTest\")) }"
|
||||||
|
)
|
||||||
|
build {
|
||||||
|
assertFailed()
|
||||||
|
assertContains(UnsatisfiedSourceSetVisibilityException::class.java.simpleName)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
+7
-1
@@ -22,7 +22,10 @@ kotlin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
create("commonIntegrationTest")
|
create("commonIntegrationTest") {
|
||||||
|
requiresVisibilityOf(getByName("commonMain"))
|
||||||
|
requiresVisibilityOf(getByName("commonTest"))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
jvm {
|
jvm {
|
||||||
@@ -51,6 +54,9 @@ kotlin {
|
|||||||
compilations.create("integrationTest") {
|
compilations.create("integrationTest") {
|
||||||
associateWith(compilations["test"])
|
associateWith(compilations["test"])
|
||||||
defaultSourceSet.dependsOn(sourceSets["commonIntegrationTest"])
|
defaultSourceSet.dependsOn(sourceSets["commonIntegrationTest"])
|
||||||
|
defaultSourceSet.requiresVisibilityOf(sourceSets["commonMain"])
|
||||||
|
defaultSourceSet.requiresVisibilityOf(sourceSets["commonTest"])
|
||||||
|
defaultSourceSet.requiresVisibilityOf(sourceSets["commonIntegrationTest"])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -124,7 +124,7 @@ class DefaultKotlinSourceSet(
|
|||||||
get() = Collections.unmodifiableSet(_requiresVisibilityOf)
|
get() = Collections.unmodifiableSet(_requiresVisibilityOf)
|
||||||
|
|
||||||
override fun requiresVisibilityOf(other: KotlinSourceSet) {
|
override fun requiresVisibilityOf(other: KotlinSourceSet) {
|
||||||
requiresVisibilityOf += other
|
_requiresVisibilityOf += other
|
||||||
}
|
}
|
||||||
|
|
||||||
//region IDE import for Granular source sets metadata
|
//region IDE import for Granular source sets metadata
|
||||||
|
|||||||
+5
-5
@@ -66,7 +66,7 @@ class UnsatisfiedSourceSetVisibilityException(
|
|||||||
append(
|
append(
|
||||||
"The source set ${sourceSet.name} requires visibility of the " +
|
"The source set ${sourceSet.name} requires visibility of the " +
|
||||||
singularOrPlural(requiredButNotVisible, "source set", "source sets:") + " " +
|
singularOrPlural(requiredButNotVisible, "source set", "source sets:") + " " +
|
||||||
"${requiredButNotVisible.joinToString()}. " +
|
"${requiredButNotVisible.joinToString { it.name }}. " +
|
||||||
"This requirement was not satisfied.\n\n"
|
"This requirement was not satisfied.\n\n"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -90,7 +90,7 @@ class UnsatisfiedSourceSetVisibilityException(
|
|||||||
|
|
||||||
append(
|
append(
|
||||||
if (isAssociatedCompilation)
|
if (isAssociatedCompilation)
|
||||||
", which compiles" +
|
", which compiles " +
|
||||||
singularOrPlural(allKotlinSourceSets, "source set ", "source sets: ") +
|
singularOrPlural(allKotlinSourceSets, "source set ", "source sets: ") +
|
||||||
allKotlinSourceSets.joinToString { it.name } +
|
allKotlinSourceSets.joinToString { it.name } +
|
||||||
"\n"
|
"\n"
|
||||||
@@ -109,9 +109,9 @@ class UnsatisfiedSourceSetVisibilityException(
|
|||||||
} else {
|
} else {
|
||||||
append(
|
append(
|
||||||
"${indent}To ensure the required visibility, the compilation " + compilationWithTarget(compilation) +
|
"${indent}To ensure the required visibility, the compilation " + compilationWithTarget(compilation) +
|
||||||
"must have a direct or indirect associate that compiles the source " +
|
" must have a direct or indirect associate that compiles the source " +
|
||||||
singularOrPlural(missingRequiredSourceSets, "set ", "sets: ") +
|
singularOrPlural(missingRequiredSourceSets, "set ", "sets: ") +
|
||||||
missingRequiredSourceSets.joinToString() + "\n"
|
missingRequiredSourceSets.joinToString { it.name } + "\n"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -140,7 +140,7 @@ internal fun checkSourceSetVisibilityRequirements(
|
|||||||
val inferredVisibility =
|
val inferredVisibility =
|
||||||
getVisibleSourceSetsFromAssociateCompilations(compilationsBySourceSet[sourceSet].orEmpty())
|
getVisibleSourceSetsFromAssociateCompilations(compilationsBySourceSet[sourceSet].orEmpty())
|
||||||
|
|
||||||
val requiredButNotVisible = requiredVisibility - inferredVisibility //TODO minus dependsOn?
|
val requiredButNotVisible = requiredVisibility - inferredVisibility - sourceSet.getSourceSetHierarchy()
|
||||||
|
|
||||||
if (requiredButNotVisible.isNotEmpty()) {
|
if (requiredButNotVisible.isNotEmpty()) {
|
||||||
val compilations = compilationsBySourceSet.getValue(sourceSet)
|
val compilations = compilationsBySourceSet.getValue(sourceSet)
|
||||||
|
|||||||
Reference in New Issue
Block a user