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:
Sergey Igushkin
2019-10-11 18:37:08 +03:00
parent d7a48e7229
commit d0604ffde8
4 changed files with 22 additions and 7 deletions
@@ -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
@@ -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"])
} }
} }
} }
@@ -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
@@ -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)