[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:
committed by
Space
parent
e55f00c3d9
commit
dcd47a89dd
@@ -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)
|
||||
}
|
||||
|
||||
+5
-5
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+3
-3
@@ -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) }
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user