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.sources.METADATA_CONFIGURATION_NAME_SUFFIX
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.util.*
import org.jetbrains.kotlin.konan.target.CompilerOutputKind
@@ -2104,6 +2105,14 @@ class NewMultiplatformIT : BaseGradleIT() {
// Native:
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
@@ -22,7 +22,10 @@ kotlin {
}
}
create("commonIntegrationTest")
create("commonIntegrationTest") {
requiresVisibilityOf(getByName("commonMain"))
requiresVisibilityOf(getByName("commonTest"))
}
}
jvm {
@@ -51,6 +54,9 @@ kotlin {
compilations.create("integrationTest") {
associateWith(compilations["test"])
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)
override fun requiresVisibilityOf(other: KotlinSourceSet) {
requiresVisibilityOf += other
_requiresVisibilityOf += other
}
//region IDE import for Granular source sets metadata
@@ -66,7 +66,7 @@ class UnsatisfiedSourceSetVisibilityException(
append(
"The source set ${sourceSet.name} requires visibility of the " +
singularOrPlural(requiredButNotVisible, "source set", "source sets:") + " " +
"${requiredButNotVisible.joinToString()}. " +
"${requiredButNotVisible.joinToString { it.name }}. " +
"This requirement was not satisfied.\n\n"
)
@@ -90,7 +90,7 @@ class UnsatisfiedSourceSetVisibilityException(
append(
if (isAssociatedCompilation)
", which compiles" +
", which compiles " +
singularOrPlural(allKotlinSourceSets, "source set ", "source sets: ") +
allKotlinSourceSets.joinToString { it.name } +
"\n"
@@ -109,9 +109,9 @@ class UnsatisfiedSourceSetVisibilityException(
} else {
append(
"${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: ") +
missingRequiredSourceSets.joinToString() + "\n"
missingRequiredSourceSets.joinToString { it.name } + "\n"
)
}
}
@@ -140,7 +140,7 @@ internal fun checkSourceSetVisibilityRequirements(
val inferredVisibility =
getVisibleSourceSetsFromAssociateCompilations(compilationsBySourceSet[sourceSet].orEmpty())
val requiredButNotVisible = requiredVisibility - inferredVisibility //TODO minus dependsOn?
val requiredButNotVisible = requiredVisibility - inferredVisibility - sourceSet.getSourceSetHierarchy()
if (requiredButNotVisible.isNotEmpty()) {
val compilations = compilationsBySourceSet.getValue(sourceSet)