Android import: initial implementation

This commit is contained in:
Vyacheslav Karpukhin
2019-10-09 16:58:58 +02:00
parent 1911cbb077
commit 17059682e9
4 changed files with 160 additions and 17 deletions
@@ -276,7 +276,7 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() {
val sourceSetToCompilationData = LinkedHashMap<KotlinSourceSet, MutableSet<GradleSourceSetData>>()
for (target in mppModel.targets) {
if (target.platform == KotlinPlatform.ANDROID) continue
// if (target.platform == KotlinPlatform.ANDROID) continue
if (target.name == KotlinTarget.METADATA_TARGET_NAME) continue
val targetData = KotlinTargetData(target.name).also {
it.archiveFile = target.jar?.archiveFile
@@ -350,7 +350,7 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() {
val ignoreCommonSourceSets by lazy { externalProject.notImportedCommonSourceSets() }
for (sourceSet in mppModel.sourceSets.values) {
if (sourceSet.actualPlatforms.platforms.singleOrNull() == KotlinPlatform.ANDROID) continue
// if (sourceSet.actualPlatforms.platforms.singleOrNull() == KotlinPlatform.ANDROID) continue
if (sourceSet.actualPlatforms.supports(KotlinPlatform.COMMON) && ignoreCommonSourceSets) continue
val moduleId = getKotlinModuleId(gradleModule, sourceSet, resolverCtx)
val existingSourceSetDataNode = sourceSetMap[moduleId]?.first
@@ -448,7 +448,7 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() {
.toMap()
if (resolverCtx.getExtraProject(gradleModule, ExternalProject::class.java) == null) return
processSourceSets(gradleModule, mppModel, ideModule, resolverCtx) { dataNode, sourceSet ->
if (dataNode == null || sourceSet.actualPlatforms.platforms.singleOrNull() == KotlinPlatform.ANDROID) return@processSourceSets
if (dataNode == null /*|| sourceSet.actualPlatforms.platforms.singleOrNull() == KotlinPlatform.ANDROID*/) return@processSourceSets
createContentRootData(
sourceSet.sourceDirs,
sourceSet.sourceType,
@@ -558,7 +558,7 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() {
}
val closedSourceSetGraph = Graphs.transitiveClosure(sourceSetGraph)
for (sourceSet in closedSourceSetGraph.nodes()) {
val isAndroid = sourceSet.actualPlatforms.platforms.singleOrNull() == KotlinPlatform.ANDROID
val isAndroid = false //sourceSet.actualPlatforms.platforms.singleOrNull() == KotlinPlatform.ANDROID
val fromDataNode = if (isAndroid) {
ideModule
} else {
@@ -578,7 +578,7 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() {
sourceSetInfo.addSourceSets(dependeeSourceSets, selfName, gradleModule, resolverCtx)
}
}
if (sourceSet.actualPlatforms.platforms.singleOrNull() == KotlinPlatform.ANDROID) continue
// if (sourceSet.actualPlatforms.platforms.singleOrNull() == KotlinPlatform.ANDROID) continue
for (dependeeSourceSet in dependeeSourceSets) {
val toDataNode = getSiblingKotlinModuleData(dependeeSourceSet, gradleModule, ideModule, resolverCtx) ?: continue
addDependency(fromDataNode, toDataNode, dependeeSourceSet.isTestModule)
@@ -747,7 +747,7 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() {
}
}
for (target in mppModel.targets) {
if (target.platform == KotlinPlatform.ANDROID) continue
// if (target.platform == KotlinPlatform.ANDROID) continue
for (compilation in target.compilations) {
val moduleId = getKotlinModuleId(gradleModule, compilation, resolverCtx)
val moduleDataNode = sourceSetsMap[moduleId] ?: continue
@@ -141,11 +141,15 @@ class KotlinMPPGradleModelBuilder : ModelBuilderService {
val sourceSets =
(getSourceSets(kotlinExt) as? NamedDomainObjectContainer<Named>)?.asMap?.values ?: emptyList<Named>()
val getAndroidSourceSetDependencies = kotlinExt.javaClass.getMethodOrNull("getAndroidSourceSetDependencies", Project::class.java)
@Suppress("UNCHECKED_CAST") val androidDeps =
getAndroidSourceSetDependencies?.let { it(kotlinExt, project) } as Map<String, List<File>>?
// Some performance optimisation: do not build metadata dependencies if source set is not common
val doBuildMetadataDependencies =
project.properties["build_metadata_dependencies_for_actualised_source_sets"]?.toString()?.toBoolean()
?: DEFAULT_BUILD_METADATA_DEPENDENCIES_FOR_ACTUALISED_SOURCE_SETS
val allSourceSetsProtos = sourceSets.mapNotNull { buildSourceSet(it, dependencyResolver, project, dependencyMapper) }
val allSourceSetsProtos = sourceSets.mapNotNull { buildSourceSet(it, dependencyResolver, project, dependencyMapper, androidDeps) }
val allSourceSets = if (doBuildMetadataDependencies) {
allSourceSetsProtos.map { proto -> proto.buildKotlinSourceSetImpl(true) }
} else {
@@ -173,7 +177,8 @@ class KotlinMPPGradleModelBuilder : ModelBuilderService {
gradleSourceSet: Named,
dependencyResolver: DependencyResolver,
project: Project,
dependencyMapper: KotlinDependencyMapper
dependencyMapper: KotlinDependencyMapper,
androidDeps: Map<String, List<File>>?
): KotlinSourceSetProto? {
val sourceSetClass = gradleSourceSet.javaClass
val getLanguageSettings = sourceSetClass.getMethodOrNull("getLanguageSettings") ?: return null
@@ -188,7 +193,7 @@ class KotlinMPPGradleModelBuilder : ModelBuilderService {
val dependsOnSourceSets = (getDependsOn(gradleSourceSet) as? Set<Named>)?.mapTo(LinkedHashSet()) { it.name } ?: emptySet<String>()
val sourceSetDependenciesBuilder: () -> Array<KotlinDependencyId> = {
buildSourceSetDependencies(gradleSourceSet, dependencyResolver, project).map { dependencyMapper.getId(it) }.distinct()
buildSourceSetDependencies(gradleSourceSet, dependencyResolver, project, androidDeps).map { dependencyMapper.getId(it) }.distinct()
.toTypedArray()
}
return KotlinSourceSetProto(
@@ -592,7 +597,8 @@ class KotlinMPPGradleModelBuilder : ModelBuilderService {
private fun buildSourceSetDependencies(
gradleSourceSet: Named,
dependencyResolver: DependencyResolver,
project: Project
project: Project,
androidDeps: Map<String, List<File>>?
): List<KotlinDependency> {
return ArrayList<KotlinDependency>().apply {
val transformationBuilder = MetadataDependencyTransformationBuilder(gradleSourceSet)
@@ -608,6 +614,8 @@ class KotlinMPPGradleModelBuilder : ModelBuilderService {
this += buildDependencies(
gradleSourceSet, dependencyResolver, "getRuntimeOnlyMetadataConfigurationName", "RUNTIME", project, transformationBuilder
)
androidDeps?.get(gradleSourceSet.name)?.let { this += DefaultFileCollectionDependency(it) }
}
}