Skip to content

Commit eb71dee

Browse files
h0tk3yAlexeyTsvetkov
authored andcommitted
Add prototype against the new AGP API
* Add a separate Gradle source set, that is compiled against the new versions of AGP and Gradle * Separate the public AGP API usages from the old internal API usages in KotlinPlugin.kt -- see AbstractAndroidProjectHandler * Implement Android25ProjectHandler with the new AGP API, wired it to KotlinAndroidPlugin through reflection (cherry picked from commit e6dbf54) (cherry picked from commit 88e3d4b)
1 parent a562045 commit eb71dee

File tree

4 files changed

+329
-130
lines changed

4 files changed

+329
-130
lines changed

libraries/tools/kotlin-gradle-plugin/build.gradle

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,13 @@ repositories {
1919
jcenter()
2020
mavenLocal()
2121
maven { url 'http://repository.jetbrains.com/utils/' }
22+
23+
// todo: remove this once the AGP artifacts get published
24+
maven { url project.property("googlePreviewRepositoryPath") } // path to the local unpacked preview repo
25+
}
26+
27+
configurations {
28+
agp25CompileOnly
2229
}
2330

2431
dependencies {
@@ -37,6 +44,10 @@ dependencies {
3744
compileOnly 'org.codehaus.groovy:groovy-all:2.3.9'
3845
compileOnly 'org.jetbrains.kotlin:gradle-api:2.2'
3946

47+
agp25CompileOnly 'com.android.tools.build:gradle:2.4.0-dev'
48+
agp25CompileOnly 'org.codehaus.groovy:groovy-all:2.3.9'
49+
agp25CompileOnly gradleApi()
50+
4051
testCompile "org.jetbrains.kotlin:kotlin-build-common-test:$kotlin_version"
4152
testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
4253
}
@@ -54,12 +65,21 @@ sourceSets.main.compileClasspath += files(groovyClassesDir)
5465
compileGroovy.classpath = sourceSets.main.compileClasspath - files(groovyClassesDir)
5566
sourceSets.main.java.srcDirs += sourceSets.main.kotlin.srcDirs
5667

68+
sourceSets {
69+
agp25 {
70+
compileClasspath += configurations.compile + configurations.agp25CompileOnly + sourceSets.main.output
71+
}
72+
}
73+
5774
processResources {
5875
expand(project.properties)
5976
}
6077

78+
jar.dependsOn agp25Classes
79+
6180
jar {
6281
from compileGroovy.destinationDir
82+
from sourceSets.agp25.output.classesDir
6383
}
6484

6585
test.executable = "${JDK_18}/bin/java"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package org.jetbrains.kotlin.gradle.plugin
2+
3+
import com.android.build.gradle.*
4+
import com.android.build.gradle.api.BaseVariant
5+
import com.android.build.gradle.api.SourceKind
6+
import com.android.build.gradle.api.TestVariant
7+
import com.android.build.gradle.api.UnitTestVariant
8+
import com.android.builder.model.SourceProvider
9+
import org.gradle.api.Project
10+
import org.gradle.api.tasks.compile.AbstractCompile
11+
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
12+
import java.io.File
13+
14+
@Suppress("unused")
15+
class Android25ProjectHandler(kotlinConfigurationTools: KotlinConfigurationTools)
16+
: AbstractAndroidProjectHandler<BaseVariant>(kotlinConfigurationTools) {
17+
18+
override fun forEachVariant(project: Project, action: (BaseVariant) -> Unit) {
19+
project.plugins.all { plugin ->
20+
val androidExtension = project.extensions.getByName("android")
21+
var testedExtension: TestedExtension? = null
22+
when (plugin.javaClass) {
23+
AppPlugin::class.java -> {
24+
(androidExtension as AppExtension).applicationVariants.all(action)
25+
testedExtension = androidExtension
26+
}
27+
LibraryPlugin::class.java -> {
28+
(androidExtension as LibraryExtension).libraryVariants.all(action)
29+
testedExtension = androidExtension
30+
}
31+
TestPlugin::class.java -> {
32+
(androidExtension as TestExtension).applicationVariants.all(action)
33+
}
34+
}
35+
testedExtension?.apply {
36+
testVariants.all(action)
37+
unitTestVariants.all(action)
38+
}
39+
}
40+
}
41+
42+
override fun getSourceProviders(variantData: BaseVariant): Iterable<SourceProvider> =
43+
variantData.sourceSets
44+
45+
override fun getAllJavaSources(variantData: BaseVariant): Iterable<File> =
46+
variantData.getSourceFolders(SourceKind.JAVA).map { it.dir }
47+
48+
override fun getVariantName(variant: BaseVariant): String = variant.name
49+
50+
override fun checkVariant(variant: BaseVariant) = Unit
51+
52+
override fun getTestedVariantData(variantData: BaseVariant): BaseVariant? = when (variantData) {
53+
is TestVariant -> variantData.testedVariant
54+
is UnitTestVariant -> variantData.testedVariant as? BaseVariant
55+
else -> null
56+
}
57+
58+
override fun getJavaTask(variantData: BaseVariant): AbstractCompile? =
59+
@Suppress("DEPRECATION") // There is always a Java compile task -- the deprecation was for Jack
60+
variantData.javaCompile
61+
62+
override fun addJavaSourceDirectoryToVariantModel(variantData: BaseVariant, javaSourceDirectory: File) =
63+
variantData.addJavaSourceFoldersToModel(javaSourceDirectory)
64+
65+
override fun configureMultiProjectIc(project: Project,
66+
variantData: BaseVariant,
67+
javaTask: AbstractCompile,
68+
kotlinTask: KotlinCompile,
69+
kotlinAfterJavaTask: KotlinCompile?) {
70+
//todo: No easy solution because of the absence of the output information in library modules
71+
// Though it is affordable not to implement this for the first previews, because the impact is tolerable
72+
// to some degree -- the dependent projects will rebuild non-incrementally when a library project changes
73+
}
74+
}

0 commit comments

Comments
 (0)