All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jetbrains.kotlin.gradle.plugin.sources.android.KotlinAndroidSourceSets.kt Maven / Gradle / Ivy

There is a newer version: 2.1.0-Beta1
Show newest version
/*
 * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
 * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
 */

package org.jetbrains.kotlin.gradle.plugin.sources.android

import org.gradle.api.logging.Logging
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
import org.jetbrains.kotlin.gradle.plugin.sources.android.checker.KotlinAndroidSourceSetLayoutChecker
import org.jetbrains.kotlin.gradle.utils.androidExtension
import org.jetbrains.kotlin.gradle.utils.forAllAndroidVariants
import org.jetbrains.kotlin.gradle.utils.runProjectConfigurationHealthCheck

internal object KotlinAndroidSourceSets {

    private val logger = Logging.getLogger(this::class.java)

    fun applyKotlinAndroidSourceSetLayout(
        target: KotlinAndroidTarget,
        layout: KotlinAndroidSourceSetLayout = target.project.kotlinAndroidSourceSetLayout
    ) {
        logger.debug("Applying ${KotlinAndroidSourceSetLayout::class.java.simpleName}: ${layout.name}")

        val android = target.project.androidExtension
        val diagnosticReporter = KotlinAndroidSourceSetLayoutChecker.DiagnosticReporter.create(target.project, logger, layout)
        val factory = KotlinAndroidSourceSetFactory(target, target.project.kotlinExtension, layout, diagnosticReporter)

        target.project.runProjectConfigurationHealthCheck {
            layout.checker.checkBeforeLayoutApplied(diagnosticReporter, target, layout)
        }

        /*
        Hook eagerly into AndroidSourceSet creation
        Some 'base' source sets shall be created eagerly, as soon as available, too also
        make them available in the buildscript dsl immediately.
         */
        android.sourceSets.all { androidSourceSet ->
            val kotlinSourceSetName = layout.naming.kotlinSourceSetName(
                target.disambiguationClassifier, androidSourceSet.name,
                AndroidBaseSourceSetName.byName(androidSourceSet.name)?.variantType
            ) ?: return@all

            factory.getOrCreateConfiguredKotlinSourceSet(kotlinSourceSetName, androidSourceSet)
        }

        /* Hook into Android's variant creation: This is invoked in 'afterEvaluate' */
        target.project.forAllAndroidVariants { variant ->
            variant.sourceSets.forEach { sourceProvider ->
                val androidSourceSet = android.sourceSets.findByName(sourceProvider.name) ?: return@forEach

                val kotlinSourceSetName = layout.naming.kotlinSourceSetName(
                    target.disambiguationClassifier, sourceProvider.name, variant.type
                ) ?: return@forEach

                val kotlinSourceSet = factory.getOrCreateConfiguredKotlinSourceSet(kotlinSourceSetName, androidSourceSet)
                layout.sourceSetConfigurator.configureWithVariant(target, kotlinSourceSet, variant)
            }
        }
    }
}






© 2015 - 2024 Weber Informatics LLC | Privacy Policy