Wizard: fix android project template

It was not able to be built as lint task required com.android.tools.build:gradle
in classpath to work

#KT-38579 fixed
This commit is contained in:
Ilya Kirillov
2020-04-25 13:33:35 +03:00
parent 72030ee94e
commit 47125553cb
18 changed files with 120 additions and 38 deletions
@@ -1,6 +1,6 @@
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android' version 'KOTLIN_VERSION'
id 'org.jetbrains.kotlin.android'
id 'kotlin-android-extensions'
}
group = 'testGroupId'
@@ -1,6 +1,6 @@
plugins {
id("com.android.application")
kotlin("android") version "KOTLIN_VERSION"
kotlin("android")
id("kotlin-android-extensions")
}
group = "testGroupId"
@@ -1,3 +1,17 @@
buildscript {
repositories {
gradlePluginPortal()
jcenter()
google()
maven {
url 'https://dl.bintray.com/kotlin/kotlin-dev'
}
}
dependencies {
classpath('org.jetbrains.kotlin:kotlin-gradle-plugin:KOTLIN_VERSION')
classpath('com.android.tools.build:gradle:3.5.2')
}
}
group = 'testGroupId'
version = '1.0-SNAPSHOT'
@@ -1,3 +1,17 @@
buildscript {
repositories {
gradlePluginPortal()
jcenter()
google()
maven {
url = uri("https://dl.bintray.com/kotlin/kotlin-dev")
}
}
dependencies {
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:KOTLIN_VERSION")
classpath("com.android.tools.build:gradle:3.5.2")
}
}
group = "testGroupId"
version = "1.0-SNAPSHOT"
@@ -1,6 +1,6 @@
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android' version 'KOTLIN_VERSION'
id 'org.jetbrains.kotlin.android'
id 'kotlin-android-extensions'
}
group = 'me.user'
@@ -1,6 +1,6 @@
plugins {
id("com.android.application")
kotlin("android") version "KOTLIN_VERSION"
kotlin("android")
id("kotlin-android-extensions")
}
group = "me.user"
@@ -1,4 +1,17 @@
buildscript {
repositories {
gradlePluginPortal()
jcenter()
google()
maven {
url 'https://dl.bintray.com/kotlin/kotlin-dev'
}
}
dependencies {
classpath('org.jetbrains.kotlin:kotlin-gradle-plugin:KOTLIN_VERSION')
classpath('com.android.tools.build:gradle:3.5.2')
}
}
group = 'me.user'
version = '1.0-SNAPSHOT'
@@ -1,3 +1,17 @@
buildscript {
repositories {
gradlePluginPortal()
jcenter()
google()
maven {
url = uri("https://dl.bintray.com/kotlin/kotlin-dev")
}
}
dependencies {
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:KOTLIN_VERSION")
classpath("com.android.tools.build:gradle:3.5.2")
}
}
group = "me.user"
version = "1.0-SNAPSHOT"
@@ -1,7 +1,7 @@
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
plugins {
id 'org.jetbrains.kotlin.multiplatform' version 'KOTLIN_VERSION'
id 'org.jetbrains.kotlin.multiplatform'
id 'com.android.library'
id 'kotlin-android-extensions'
}
@@ -1,7 +1,7 @@
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
plugins {
kotlin("multiplatform") version "KOTLIN_VERSION"
kotlin("multiplatform")
id("com.android.library")
id("kotlin-android-extensions")
}
@@ -8,6 +8,10 @@ interface BuildSystemIR : IR {
fun BuildFilePrinter.render()
}
interface BuildSystemIRWithPriority : BuildSystemIR {
val priority: Int? get() = null
}
// IR element, which is not hardcoded into the parent IR structure and can be printed
// In any place of the parent IR
interface FreeIR : BuildSystemIR
@@ -8,7 +8,7 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.MavenPrinter
import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version
interface BuildSystemPluginIR : BuildSystemIR
interface BuildSystemPluginIR : BuildSystemIR, BuildSystemIRWithPriority
interface DefaultBuildSystemPluginIR : BuildSystemPluginIR
@@ -31,7 +31,7 @@ data class ApplicationPluginIR(val mainClass: String) : DefaultBuildSystemPlugin
}
}
data class GradleOnlyPluginByNameIR(@NonNls val pluginId: String) : BuildSystemPluginIR, GradleIR {
data class GradleOnlyPluginByNameIR(@NonNls val pluginId: String, override val priority: Int? = null) : BuildSystemPluginIR, GradleIR {
override fun GradlePrinter.renderGradle() {
call("id") { +pluginId.quotified }
}
@@ -39,7 +39,8 @@ data class GradleOnlyPluginByNameIR(@NonNls val pluginId: String) : BuildSystemP
data class KotlinBuildSystemPluginIR(
val type: Type,
val version: Version?
val version: Version?,
override val priority: Int? = null
) : BuildSystemPluginIR {
override fun BuildFilePrinter.render() = when (this) {
@@ -3,6 +3,7 @@ package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem
import kotlinx.collections.immutable.PersistentList
import kotlinx.collections.immutable.plus
import kotlinx.collections.immutable.toPersistentList
import kotlin.reflect.full.isSubclassOf
interface IrsOwner {
@@ -18,7 +19,11 @@ fun <I : IrsOwner> I.withIrs(vararg irs: BuildSystemIR) = withReplacedIrs(irs =
inline fun <reified I : BuildSystemIR> IrsOwner.irsOfType(): List<I> =
irs.filterIsInstance<I>()
irs.filterIsInstance<I>().let { irs ->
if (I::class.isSubclassOf(BuildSystemIRWithPriority::class))
irs.sortedBy { (it as BuildSystemIRWithPriority).priority }
else irs
}
inline fun <reified I : BuildSystemIR> IrsOwner.irsOfTypeOrNull() =
@@ -153,5 +153,5 @@ data class GradleBinaryExpressionIR(val left: BuildSystemIR, val op: String, val
interface BuildScriptIR : BuildSystemIR
data class BuildScriptDependencyIR(val dependencyIR: GradleIR) : BuildScriptIR, BuildSystemIR by dependencyIR
data class BuildScriptDependencyIR(val dependencyIR: BuildSystemIR) : BuildScriptIR, BuildSystemIR by dependencyIR
data class BuildScriptRepositoryIR(val repositoryIR: RepositoryIR) : BuildScriptIR, BuildSystemIR by repositoryIR
@@ -52,9 +52,9 @@ interface AndroidModuleConfigurator : ModuleConfigurator,
configurationData: ModulesToIrConversionData,
module: Module
) = buildList<BuildSystemIR> {
+GradleOnlyPluginByNameIR(reader.createAndroidPlugin(module).pluginName)
+GradleOnlyPluginByNameIR(reader.createAndroidPlugin(module).pluginName, priority = 1)
+GradleOnlyPluginByNameIR("kotlin-android-extensions")
+GradleOnlyPluginByNameIR("kotlin-android-extensions", priority = 3)
+AndroidConfigIR(
when (reader.createAndroidPlugin(module)) {
AndroidGradlePlugin.APPLICATION -> module.javaPackage(configurationData.pomIr)
@@ -5,13 +5,18 @@ import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.Versions
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.service.kotlinVersionKind
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.BuildScriptDependencyIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.BuildScriptRepositoryIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.irsList
import org.jetbrains.kotlin.tools.projectWizard.library.MavenArtifact
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModulesToIrConversionData
import org.jetbrains.kotlin.tools.projectWizard.plugins.templates.TemplatesPlugin
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.DefaultRepository
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModuleKind
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repositories
import org.jetbrains.kotlin.tools.projectWizard.settings.javaPackage
import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version
import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplate
@@ -34,26 +39,32 @@ object AndroidSinglePlatformModuleConfigurator :
override val resourcesDirectoryName: String = "res"
override val kotlinDirectoryName: String = "java"
override fun createBuildFileIRs(
reader: Reader,
configurationData: ModulesToIrConversionData,
module: Module
) = buildList<BuildSystemIR> {
+super<AndroidModuleConfigurator>.createBuildFileIRs(reader, configurationData, module)
// it is explicitly here instead of by `createKotlinPluginIR` as it should be after `com.android.application`
+KotlinBuildSystemPluginIR(
KotlinBuildSystemPluginIR.Type.android,
version = configurationData.kotlinVersion
)
}.sortedBy { ir: BuildSystemIR ->
if (ir is GradleOnlyPluginByNameIR) {
// TODO implement proper sort on irs
// But for now kotlin-android-extensions should be after Android kotlin plugin
if (ir.pluginId == "kotlin-android-extensions") 1 else 0
} else 0
override fun createRootBuildFileIrs(configurationData: ModulesToIrConversionData): List<BuildSystemIR> = irsList {
listOf(
DefaultRepository.GRADLE_PLUGIN_PORTAL,
DefaultRepository.JCENTER,
DefaultRepository.GOOGLE,
configurationData.kotlinVersion.kotlinVersionKind.repository
).forEach { repository ->
+BuildScriptRepositoryIR(RepositoryIR((repository)))
}
irsList {
"classpath"(const("org.jetbrains.kotlin:kotlin-gradle-plugin:${configurationData.kotlinVersion}"))
"classpath"(const("com.android.tools.build:gradle:${Versions.GRADLE_PLUGINS.ANDROID}"))
}.forEach {
+BuildScriptDependencyIR(it)
}
}
override fun createKotlinPluginIR(configurationData: ModulesToIrConversionData, module: Module): KotlinBuildSystemPluginIR? =
KotlinBuildSystemPluginIR(
KotlinBuildSystemPluginIR.Type.android,
version = configurationData.kotlinVersion,
priority = 2
)
override fun createModuleIRs(
reader: Reader,
configurationData: ModulesToIrConversionData,
@@ -6,6 +6,7 @@ import org.jetbrains.kotlin.tools.projectWizard.SettingsOwner
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.*
import org.jetbrains.kotlin.tools.projectWizard.enumSettingImpl
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildFileIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.KotlinBuildSystemPluginIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.StdlibType
@@ -222,6 +223,8 @@ interface ModuleConfigurator : DisplayableSettingItem, EntitiesOwnerDescriptor {
): List<BuildSystemIR> =
emptyList()
fun createBuildFileIRsComparator(): Comparator<BuildSystemIR>? = null
fun createModuleIRs(
reader: Reader,
configurationData: ModulesToIrConversionData,
@@ -69,8 +69,12 @@ class ModulesToIRsConverter(
fun Writer.createBuildFiles(): TaskResult<List<BuildFileIR>> = with(data) {
val needExplicitRootBuildFile = !needFlattening
val initialState = ModulesToIrsState(projectPath, parentModuleHasTransitivelySpecifiedKotlinVersion = false)
val parentModuleHasKotlinVersion = allModules.any { module ->
module.configurator == AndroidSinglePlatformModuleConfigurator
}
rootModules.mapSequence { module ->
val parentModuleHasKotlinVersion = module.configurator == AndroidSinglePlatformModuleConfigurator
createBuildFileForModule(
module,
initialState.copy(parentModuleHasTransitivelySpecifiedKotlinVersion = parentModuleHasKotlinVersion)
@@ -174,11 +178,11 @@ class ModulesToIRsConverter(
}
module.subModules.mapSequence { subModule ->
createBuildFileForModule(
subModule,
state.stateForSubModule(modulePath)
)
}.map { it.flatten() }
createBuildFileForModule(
subModule,
state.stateForSubModule(modulePath)
)
}.map { it.flatten() }
.map { children ->
buildFileIR?.let { children + it } ?: children
}
@@ -280,7 +284,6 @@ class ModulesToIRsConverter(
// do not print version for non-root modules for gradle
val needRemoveVersion = data.buildSystemType.isGradle
&& state.parentModuleHasTransitivelySpecifiedKotlinVersion
&& module.configurator != AndroidSinglePlatformModuleConfigurator
when {
needRemoveVersion -> plugin.copy(version = null)
else -> plugin