fun createGradleAndroidModelData()

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
    )
  }