in project-system-gradle/src/org/jetbrains/kotlin/android/models/KotlinModelConverter.kt [425:703]
fun createGradleAndroidModelData(
moduleName: String,
rootModulePath: File?,
targetInfo: AndroidTarget,
compilationInfoMap: Map<AndroidCompilation.CompilationType, Pair<KotlinCompilation, AndroidCompilation>>,
sourceSetDependenciesMap: Map<String, Set<LibraryReference>>,
): GradleAndroidModelData {
val (mainKotlinCompilation, mainAndroidCompilation) = compilationInfoMap[AndroidCompilation.CompilationType.MAIN]!!
val (unitTestKotlinCompilation, unitTestAndroidCompilation) = compilationInfoMap[AndroidCompilation.CompilationType.UNIT_TEST] ?: Pair(null, null)
val (androidTestKotlinCompilation, androidTestAndroidCompilation) = compilationInfoMap[AndroidCompilation.CompilationType.INSTRUMENTED_TEST] ?: Pair(null, null)
val mainSourceSetDependencies = sourceSetDependenciesMap[mainAndroidCompilation.defaultSourceSetName]!!.map {
IdeDependencyCoreImpl(
target = it,
dependencies = null
)
}
val unitTestSourceSetDependencies = unitTestAndroidCompilation?.let { sourceSetDependenciesMap[unitTestAndroidCompilation.defaultSourceSetName] }?.map {
IdeDependencyCoreImpl(
target = it,
dependencies = null
)
}
val androidTestSourceSetDependencies = androidTestAndroidCompilation?.let { sourceSetDependenciesMap[androidTestAndroidCompilation.defaultSourceSetName] }?.map {
IdeDependencyCoreImpl(
target = it,
dependencies = null
)
}
val mainKotlinCompilerOptions =
parseCommandLineArguments<K2JVMCompilerArguments>(mainKotlinCompilation.compilerArguments ?: emptyList())
val mainBuildInformation = IdeBuildTasksAndOutputInformationImpl(
assembleTaskName = mainAndroidCompilation.assembleTaskName,
assembleTaskOutputListingFile = null,
bundleTaskName = null,
bundleTaskOutputListingFile = null,
apkFromBundleTaskName = null,
apkFromBundleTaskOutputListingFile = null,
)
val mainArtifact = IdeAndroidArtifactCoreImpl(
name = IdeArtifactName.MAIN,
compileTaskName = mainAndroidCompilation.kotlinCompileTaskName,
assembleTaskName = mainAndroidCompilation.assembleTaskName,
classesFolder = mainKotlinCompilation.output.classesDirs.toList(),
variantSourceProvider = null,
multiFlavorSourceProvider = null,
ideSetupTaskNames = emptyList(), // For now, there is no source generation tasks
generatedSourceFolders = emptyList(), // For now, there is no generated sourced
isTestArtifact = false,
compileClasspathCore = IdeDependenciesCoreDirect(
dependencies = mainSourceSetDependencies
),
runtimeClasspathCore = IdeDependenciesCoreDirect(
dependencies = mainSourceSetDependencies
),
unresolvedDependencies = emptyList(),
applicationId = null,
signingConfigName = null,
isSigned = false,
generatedResourceFolders = emptyList(),
additionalRuntimeApks = emptyList(),
testOptions = null,
abiFilters = emptySet(),
buildInformation = mainBuildInformation,
codeShrinker = CodeShrinker.R8.takeIf { mainAndroidCompilation.mainInfo.minificationEnabled },
privacySandboxSdkInfo = null,
desugaredMethodsFiles = targetInfo.desugaredMethodsFilesList.convertAndDeduplicate(),
generatedClassPaths = emptyMap(),
bytecodeTransforms = null,
generatedAssetFolders = emptyList(),
mappingR8TextFile = null,
mappingR8PartitionFile = null,
)
val unitTestArtifact = unitTestAndroidCompilation?.let {
IdeJavaArtifactCoreImpl(
name = IdeArtifactName.UNIT_TEST,
compileTaskName = unitTestAndroidCompilation.kotlinCompileTaskName,
assembleTaskName = unitTestAndroidCompilation.assembleTaskName,
classesFolder = unitTestKotlinCompilation?.output?.classesDirs?.toList() ?: emptyList(),
variantSourceProvider = null,
multiFlavorSourceProvider = null,
ideSetupTaskNames = emptyList(), // For now, there is no source generation tasks
generatedSourceFolders = emptyList(), // For now, there is no generated sourced
isTestArtifact = true,
compileClasspathCore = IdeDependenciesCoreDirect(
dependencies = unitTestSourceSetDependencies!!
),
runtimeClasspathCore = IdeDependenciesCoreDirect(
dependencies = unitTestSourceSetDependencies
),
unresolvedDependencies = emptyList(),
mockablePlatformJar = unitTestAndroidCompilation.unitTestInfo.mockablePlatformJar.convertAndDeduplicate(),
generatedClassPaths = emptyMap(),
bytecodeTransforms = null,
)
}
val androidTestArtifact = androidTestAndroidCompilation?.let {
IdeAndroidArtifactCoreImpl(
name = IdeArtifactName.ANDROID_TEST,
compileTaskName = androidTestAndroidCompilation.kotlinCompileTaskName,
assembleTaskName = androidTestAndroidCompilation.assembleTaskName,
classesFolder = androidTestKotlinCompilation?.output?.classesDirs?.toList() ?: emptyList(),
variantSourceProvider = null,
multiFlavorSourceProvider = null,
ideSetupTaskNames = emptyList(), // For now, there is no source generation tasks
generatedSourceFolders = emptyList(), // For now, there is no generated sourced
isTestArtifact = true,
compileClasspathCore = IdeDependenciesCoreDirect(
dependencies = androidTestSourceSetDependencies!!
),
runtimeClasspathCore = IdeDependenciesCoreDirect(
dependencies = androidTestSourceSetDependencies
),
unresolvedDependencies = emptyList(),
applicationId = androidTestAndroidCompilation.instrumentedTestInfo.namespace,
signingConfigName = androidTestAndroidCompilation.instrumentedTestInfo.signingConfig?.name,
isSigned = androidTestAndroidCompilation.instrumentedTestInfo.signingConfig != null,
generatedResourceFolders = emptyList(),
additionalRuntimeApks = emptyList(),
testOptions = targetInfo.testInfo.convert(),
abiFilters = emptySet(),
buildInformation = IdeBuildTasksAndOutputInformationImpl(
assembleTaskName = androidTestAndroidCompilation.assembleTaskName,
assembleTaskOutputListingFile = androidTestAndroidCompilation.instrumentedTestInfo.assembleTaskOutputListingFile.absolutePath.deduplicate(),
bundleTaskName = null,
bundleTaskOutputListingFile = null,
apkFromBundleTaskName = null,
apkFromBundleTaskOutputListingFile = null
),
codeShrinker = mainArtifact.codeShrinker,
privacySandboxSdkInfo = null,
desugaredMethodsFiles = targetInfo.desugaredMethodsFilesList.convertAndDeduplicate(),
generatedClassPaths = emptyMap(),
bytecodeTransforms = null,
generatedAssetFolders = emptyList(),
mappingR8TextFile = null,
mappingR8PartitionFile = null,
)
}
val androidMainVariant = IdeVariantCoreImpl(
name = kotlinMultiplatformAndroidVariantName,
displayName = kotlinMultiplatformAndroidVariantName,
mainArtifact = mainArtifact,
hostTestArtifacts = listOfNotNull(unitTestArtifact),
deviceTestArtifacts = listOfNotNull(androidTestArtifact),
testSuiteArtifacts = listOfNotNull(),
testFixturesArtifact = null,
buildType = "", // TODO(b/288062702): figure out what will this affect
productFlavors = emptyList(),
minSdkVersion = mainAndroidCompilation.mainInfo.minSdkVersion.convert(),
targetSdkVersion = null,
maxSdkVersion = mainAndroidCompilation.mainInfo.maxSdkVersion,
versionCode = null,
versionNameSuffix = null,
versionNameWithSuffix = null,
instantAppCompatible = false,
vectorDrawablesUseSupportLibrary = false,
resourceConfigurations = emptyList(),
resValues = emptyMap(),
proguardFiles = mainAndroidCompilation.mainInfo.proguardFilesList.convertAndDeduplicate(),
consumerProguardFiles = mainAndroidCompilation.mainInfo.consumerProguardFilesList.convertAndDeduplicate(),
manifestPlaceholders = emptyMap(),
testInstrumentationRunner = androidTestAndroidCompilation?.instrumentedTestInfo?.testInstrumentationRunner,
testInstrumentationRunnerArguments = androidTestAndroidCompilation?.instrumentedTestInfo?.testInstrumentationRunnerArgumentsMap?.toMap() ?: emptyMap(),
testedTargetVariants = emptyList(),
runTestInSeparateProcess = false,
deprecatedPreMergedApplicationId = null,
deprecatedPreMergedTestApplicationId = null,
desugaredMethodsFiles = targetInfo.desugaredMethodsFilesList.convertAndDeduplicate(),
experimentalProperties = emptyMap()
)
val variants = listOf(androidMainVariant)
val androidProject = IdeAndroidProjectImpl(
agpVersion = targetInfo.agpVersion,
projectPath = IdeProjectPathImpl(
rootBuildId = targetInfo.rootBuildId.convertAndDeduplicate(),
buildId = targetInfo.buildId.convertAndDeduplicate(),
projectPath = targetInfo.projectPath.deduplicate()
),
buildFolder = File(targetInfo.buildDir.absolutePath).deduplicateFile(),
projectType = IdeAndroidProjectType.PROJECT_TYPE_KOTLIN_MULTIPLATFORM,
defaultSourceProvider = IdeSourceProviderContainerImpl(
sourceProvider = mainKotlinCompilation.declaredSourceSets.firstOrNull {
it.name == mainAndroidCompilation.defaultSourceSetName
}?.let { sourceSet ->
sourceSet.extras[androidSourceSetKey]?.sourceProvider?.convert(sourceSet, targetInfo.withJava)
},
extraSourceProviders = listOf(
ARTIFACT_NAME_UNIT_TEST to unitTestKotlinCompilation?.declaredSourceSets?.firstOrNull {
it.name == unitTestAndroidCompilation?.defaultSourceSetName
}?.let { sourceSet ->
sourceSet.extras[androidSourceSetKey]?.sourceProvider?.convert(sourceSet, targetInfo.withJava)
},
ARTIFACT_NAME_ANDROID_TEST to androidTestKotlinCompilation?.declaredSourceSets?.firstOrNull {
it.name == androidTestAndroidCompilation?.defaultSourceSetName
}?.let { sourceSet ->
sourceSet.extras[androidSourceSetKey]?.sourceProvider?.convert(sourceSet, targetInfo.withJava)
}
).mapNotNull { (artifactName, sourceProvider) ->
sourceProvider?.let {
IdeExtraSourceProviderImpl(
artifactName = artifactName,
sourceProvider = sourceProvider
)
}
}
),
multiVariantData = IdeMultiVariantDataImpl(
defaultConfig = createDefaultConfigForKmp(),
buildTypes = listOf(createBuildTypeForKmp(mainAndroidCompilation)),
productFlavors = emptyList()
),
flavorDimensions = emptyList(),
compileTarget = mainAndroidCompilation.mainInfo.compileSdkTarget,
bootClasspath = targetInfo.bootClasspathList.map { it.absolutePath.deduplicate() },
signingConfigs = listOfNotNull(
androidTestAndroidCompilation?.instrumentedTestInfo?.signingConfig?.convert()
),
aaptOptions = IdeAaptOptionsImpl(IdeAaptOptions.Namespacing.DISABLED),
lintOptions = IdeLintOptionsImpl(), // TODO(b/269755640): support lint in the IDE
javaCompileOptions = IdeJavaCompileOptionsImpl(
encoding = Charset.defaultCharset().name(),
sourceCompatibility = mainKotlinCompilerOptions.jvmTarget ?: "1.8",
targetCompatibility = mainKotlinCompilerOptions.jvmTarget ?: "1.8",
isCoreLibraryDesugaringEnabled = targetInfo.isCoreLibraryDesugaringEnabled,
),
resourcePrefix = null,
buildToolsVersion = targetInfo.buildToolsVersion,
isBaseSplit = false,
dynamicFeatures = emptyList(),
viewBindingOptions = null,
dependenciesInfo = null,
groupId = targetInfo.groupId,
namespace = mainAndroidCompilation.mainInfo.namespace,
agpFlags = targetInfo.flags.convert(),
variantsBuildInformation = listOf(
IdeVariantBuildInformationImpl(
variantName = kotlinMultiplatformAndroidVariantName,
mainBuildInformation
)
),
lintChecksJars = targetInfo.lintChecksJarsList.convertAndDeduplicate(),
testNamespace = androidTestAndroidCompilation?.instrumentedTestInfo?.namespace,
isKaptEnabled = false,
desugarLibraryConfigFiles = targetInfo.desugarLibConfigList.convertAndDeduplicate(),
baseFeature = null,
basicVariants = listOf(
IdeBasicVariantImpl(
name = kotlinMultiplatformAndroidVariantName,
applicationId = null,
testApplicationId = androidTestAndroidCompilation?.instrumentedTestInfo?.namespace,
buildType = null,
false,
)
),
defaultVariantName = kotlinMultiplatformAndroidVariantName,
lintJar = null,
coreVariants = variants,
testSuites = emptyList()
)
return GradleAndroidModelData(
androidSyncVersion = ourAndroidSyncVersion,
moduleNameField = moduleName,
rootDirPath = rootModulePath!!.toImpl(),
androidProject = androidProject,
selectedVariantName = kotlinMultiplatformAndroidVariantName,
declaredDependencies = IdeDeclaredDependenciesImpl(mapOf()),
variants = variants
)
}