[kpm] Introduce GradleKpm* naming convention (1/2)

All Gradle specific kpm entities shall be disambiguated by using
the `GradleKpm` prefix. For example `MyEntity` shall now be called
`GradleKpmMyEntity` and a subclass would be called like
`GradleKpmSpecialMyEntity`
This commit is contained in:
sebastian.sellmair
2022-05-24 14:30:16 +02:00
committed by Space
parent e55f00c3d9
commit dcd47a89dd
144 changed files with 1651 additions and 1573 deletions
@@ -11,4 +11,3 @@ package org.jetbrains.kotlin.project.model
interface KpmModuleDependencyResolver {
fun resolveDependency(requestingModule: KpmModule, moduleDependency: KpmModuleDependency): KpmModule?
}
@@ -7,36 +7,36 @@ package org.jetbrains.kotlin.project.model
import org.jetbrains.kotlin.project.model.utils.variantsContainingFragment
interface ModuleFragmentsResolver {
interface KpmFragmentsResolver {
fun getChosenFragments(
requestingFragment: KpmFragment,
dependencyModule: KpmModule
): FragmentResolution
): KpmFragmentResolution
}
sealed class FragmentResolution(val requestingFragment: KpmFragment, val dependencyModule: KpmModule) {
sealed class KpmFragmentResolution(val requestingFragment: KpmFragment, val dependencyModule: KpmModule) {
class ChosenFragments(
requestingFragment: KpmFragment,
dependencyModule: KpmModule,
val visibleFragments: Iterable<KpmFragment>,
val variantResolutions: Iterable<VariantResolution>
) : FragmentResolution(requestingFragment, dependencyModule)
val variantResolutions: Iterable<KpmVariantResolution>
) : KpmFragmentResolution(requestingFragment, dependencyModule)
class NotRequested(requestingFragment: KpmFragment, dependencyModule: KpmModule) :
FragmentResolution(requestingFragment, dependencyModule)
KpmFragmentResolution(requestingFragment, dependencyModule)
// TODO: think about restricting calls with the type system to avoid partial functions in resolvers?
class Unknown(requestingFragment: KpmFragment, dependencyModule: KpmModule) :
FragmentResolution(requestingFragment, dependencyModule)
KpmFragmentResolution(requestingFragment, dependencyModule)
}
class DefaultModuleFragmentsResolver(
private val variantResolver: ModuleVariantResolver
) : ModuleFragmentsResolver {
class KpmDefaultFragmentsResolver(
private val variantResolver: KpmModuleVariantResolver
) : KpmFragmentsResolver {
override fun getChosenFragments(
requestingFragment: KpmFragment,
dependencyModule: KpmModule
): FragmentResolution {
): KpmFragmentResolution {
val dependingModule = requestingFragment.containingModule
val containingVariants = dependingModule.variantsContainingFragment(requestingFragment)
@@ -44,12 +44,12 @@ class DefaultModuleFragmentsResolver(
// TODO: extend this to more cases with non-matching variants, revisit the behavior when no matching variant is found once we fix
// local publishing of libraries with missing host-specific parts (it breaks transitive dependencies now)
if (chosenVariants.none { it is VariantResolution.VariantMatch })
return FragmentResolution.NotRequested(requestingFragment, dependencyModule)
if (chosenVariants.none { it is KpmVariantResolution.KpmVariantMatch })
return KpmFragmentResolution.NotRequested(requestingFragment, dependencyModule)
val chosenFragments = chosenVariants.map { variantResolution ->
when (variantResolution) {
is VariantResolution.VariantMatch -> variantResolution.chosenVariant.withRefinesClosure
is KpmVariantResolution.KpmVariantMatch -> variantResolution.chosenVariant.withRefinesClosure
else -> emptySet()
}
}
@@ -61,6 +61,6 @@ class DefaultModuleFragmentsResolver(
.filter { it.isNotEmpty() }
.reduce { acc, it -> acc.intersect(it) }
return FragmentResolution.ChosenFragments(requestingFragment, dependencyModule, result, chosenVariants)
return KpmFragmentResolution.ChosenFragments(requestingFragment, dependencyModule, result, chosenVariants)
}
}
@@ -10,24 +10,24 @@ package org.jetbrains.kotlin.project.model
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
interface ModuleVariantResolver {
interface KpmModuleVariantResolver {
/**
* Find the matching module variant of the [dependencyModule] for the consumer's [requestingVariant].
*
* This is a partial function. A particular resolver may not be capable to do variant matching for some [dependencyModule] or
* some [requestingVariant] (to such an extent that a resolver may only know how to resolve a single [dependencyModule]'s variants, or
* how to resolve module variants for a particular [requestingVariant]).
* In this case it should return [VariantResolution.Unknown], and the caller (which might be an aggregating [ModuleVariantResolver])
* In this case it should return [KpmVariantResolution.Unknown], and the caller (which might be an aggregating [KpmModuleVariantResolver])
* may consult other sources to get the variant match.
*/
fun getChosenVariant(requestingVariant: KpmVariant, dependencyModule: KpmModule): VariantResolution
fun getChosenVariant(requestingVariant: KpmVariant, dependencyModule: KpmModule): KpmVariantResolution
}
/**
* Represents the results of [dependencyModule]'s variant resolution for the [requestingVariant],
* usually done by some [ModuleVariantResolver].
* usually done by some [KpmModuleVariantResolver].
*/
sealed class VariantResolution(
sealed class KpmVariantResolution(
val requestingVariant: KpmVariant,
val dependencyModule: KpmModule
) {
@@ -37,56 +37,56 @@ sealed class VariantResolution(
dependencyModule: KpmModule,
matchingVariants: Collection<KpmVariant>
) = when (matchingVariants.size) {
0 -> NoVariantMatch(requestingVariant, dependencyModule)
1 -> VariantMatch(requestingVariant, dependencyModule, matchingVariants.single())
else -> AmbiguousVariants(requestingVariant, dependencyModule, matchingVariants)
0 -> KpmNoVariantMatch(requestingVariant, dependencyModule)
1 -> KpmVariantMatch(requestingVariant, dependencyModule, matchingVariants.single())
else -> KpmAmbiguousVariants(requestingVariant, dependencyModule, matchingVariants)
}
}
override fun toString(): String = when (this) {
is VariantMatch -> "match: ${chosenVariant.fragmentName}"
is KpmVariantMatch -> "match: ${chosenVariant.fragmentName}"
is Unknown -> "unknown"
is NotRequested -> "not requested"
is NoVariantMatch -> "no match"
is AmbiguousVariants -> "ambiguity: ${matchingVariants.joinToString { it.fragmentName }}"
is KpmNoVariantMatch -> "no match"
is KpmAmbiguousVariants -> "ambiguity: ${matchingVariants.joinToString { it.fragmentName }}"
}
/**
* The resolver decided that the [chosenVariant] is the best variant match.
*/
class VariantMatch(
class KpmVariantMatch(
requestingVariant: KpmVariant,
dependencyModule: KpmModule,
val chosenVariant: KpmVariant
) : VariantResolution(requestingVariant, dependencyModule)
) : KpmVariantResolution(requestingVariant, dependencyModule)
// TODO: think about restricting calls with the type system to avoid partial functions in resolvers?
class Unknown(requestingVariant: KpmVariant, dependencyModule: KpmModule) :
VariantResolution(requestingVariant, dependencyModule)
KpmVariantResolution(requestingVariant, dependencyModule)
/**
* Returned when the resolver detects that the [requestingVariant] does not depend on [dependencyModule] and therefore should not get
* any variant of that module at all.
*/
class NotRequested(requestingVariant: KpmVariant, dependencyModule: KpmModule) :
VariantResolution(requestingVariant, dependencyModule)
KpmVariantResolution(requestingVariant, dependencyModule)
/**
* Returned when the resolver could not find any matching of the [dependencyModule] for the [requestingVariant], or variant matching was
* done externally and the external system did not provide any details of the failure.
*/
class NoVariantMatch(
class KpmNoVariantMatch(
requestingVariant: KpmVariant,
dependencyModule: KpmModule
) : VariantResolution(requestingVariant, dependencyModule)
) : KpmVariantResolution(requestingVariant, dependencyModule)
/**
* Returned when the resolver found multiple matching variants in the [dependencyModule] and failed to choose one of them as the
* best match for the [requestingVariant].
*/
class AmbiguousVariants(
class KpmAmbiguousVariants(
requestingVariant: KpmVariant,
dependencyModule: KpmModule,
val matchingVariants: Iterable<KpmVariant>
) : VariantResolution(requestingVariant, dependencyModule)
) : KpmVariantResolution(requestingVariant, dependencyModule)
}
@@ -14,7 +14,7 @@ internal class DefaultModuleFragmentsResolverTest {
val bundleFoo = simpleModuleBundle("foo")
val bundleBar = simpleModuleBundle("bar")
val fragmentResolver = DefaultModuleFragmentsResolver(MatchVariantsByExactAttributes())
val fragmentResolver = KpmDefaultFragmentsResolver(MatchVariantsByExactAttributes())
@Test
fun testFragmentVisibility() {
@@ -32,7 +32,7 @@ internal class DefaultModuleFragmentsResolverTest {
moduleBarMain.fragments.forEach { consumingFragment ->
val result = fragmentResolver.getChosenFragments(consumingFragment, moduleFooMain)
assertTrue(result is FragmentResolution.ChosenFragments)
assertTrue(result is KpmFragmentResolution.ChosenFragments)
val expected = expectedVisibleFragments.getValue(consumingFragment.fragmentName)
assertEquals(expected, result.visibleFragments.map { it.fragmentName }.toSet())
}
@@ -48,15 +48,15 @@ internal class DefaultModuleFragmentsResolverTest {
}
val moduleFooMain = bundleFoo.main
val variantResolution = MatchVariantsByExactAttributes().getChosenVariant(dependingModule.variant("linux"), moduleFooMain)
assumeTrue(variantResolution is VariantResolution.NoVariantMatch)
assumeTrue(variantResolution is KpmVariantResolution.KpmNoVariantMatch)
val (commonMainResult, jsAndLinuxResult) = listOf("common", "jsAndLinux").map {
val chosenFragments = fragmentResolver.getChosenFragments(dependingModule.fragment(it), moduleFooMain)
assertTrue(chosenFragments is FragmentResolution.ChosenFragments)
assertTrue(chosenFragments is KpmFragmentResolution.ChosenFragments)
chosenFragments.visibleFragments.map { it.fragmentName }.toSet()
}
assertEquals(setOf("common", "jvmAndJs"), commonMainResult)
assertEquals(setOf("common", "jvmAndJs", "jsAndLinux", "js"), jsAndLinuxResult)
}
}
}
@@ -5,14 +5,14 @@
package org.jetbrains.kotlin.project.model
class MatchVariantsByExactAttributes : ModuleVariantResolver {
override fun getChosenVariant(requestingVariant: KpmVariant, dependencyModule: KpmModule): VariantResolution {
class MatchVariantsByExactAttributes : KpmModuleVariantResolver {
override fun getChosenVariant(requestingVariant: KpmVariant, dependencyModule: KpmModule): KpmVariantResolution {
val candidates = dependencyModule.variants
return candidates.filter { candidate ->
candidate.variantAttributes.all { (attributeKey, candidateValue) ->
attributeKey !in requestingVariant.variantAttributes.keys ||
candidateValue == requestingVariant.variantAttributes.getValue(attributeKey)
}
}.let { VariantResolution.fromMatchingVariants(requestingVariant, dependencyModule, it) }
}.let { KpmVariantResolution.fromMatchingVariants(requestingVariant, dependencyModule, it) }
}
}