From 853b15ee98493f1a3b260c90a38acb39cd843cfa Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Mon, 25 Apr 2016 17:53:10 +0300 Subject: [PATCH] Add kapt incremental tests --- .../AbstractKotlinAndroidGradleTests.kt | 21 ++ .../jetbrains/kotlin/gradle/BaseGradleIT.kt | 10 +- .../org/jetbrains/kotlin/gradle/KaptIT.kt | 17 ++ .../kotlin/gradle/KaptIncrementalIT.kt | 189 ++++++++++++++++++ .../kotlin/gradle/TestRootAffectedIT.kt | 4 +- .../jetbrains/kotlin/gradle/util/fileUtil.kt | 11 +- .../AndroidDaggerProject/app/build.gradle | 53 +++++ .../app/src/main/AndroidManifest.xml | 19 ++ .../example/dagger/kotlin/AndroidModule.kt | 44 ++++ .../dagger/kotlin/ApplicationComponent.kt | 13 ++ .../example/dagger/kotlin/BaseApplication.kt | 11 + .../com/example/dagger/kotlin/DemoActivity.kt | 12 ++ .../example/dagger/kotlin/DemoApplication.kt | 13 ++ .../example/dagger/kotlin/ForApplication.kt | 6 + .../example/dagger/kotlin/ui/HomeActivity.kt | 38 ++++ .../app/src/main/res/layout/activity_main.xml | 10 + .../app/src/main/res/values/strings.xml | 3 + .../app/src/main/res/values/styles.xml | 8 + .../AndroidDaggerProject/build.gradle | 1 + .../AndroidDaggerProject/gradle.properties | 1 + .../AndroidDaggerProject/settings.gradle | 1 + .../build.gradle | 31 +++ .../src/main/java/bar/B.kt | 14 ++ .../src/main/java/bar/useB.kt | 4 + .../src/main/java/baz/util.kt | 9 + .../src/main/java/foo/A.kt | 10 + .../src/main/java/foo/JavaClass.java | 21 ++ .../kaptStubs/src/main/java/test.kt | 2 +- 28 files changed, 570 insertions(+), 6 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalIT.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/AndroidManifest.xml create mode 100755 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/java/com/example/dagger/kotlin/AndroidModule.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/java/com/example/dagger/kotlin/ApplicationComponent.kt create mode 100755 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/java/com/example/dagger/kotlin/BaseApplication.kt create mode 100755 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/java/com/example/dagger/kotlin/DemoActivity.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/java/com/example/dagger/kotlin/DemoApplication.kt create mode 100755 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/java/com/example/dagger/kotlin/ForApplication.kt create mode 100755 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/java/com/example/dagger/kotlin/ui/HomeActivity.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/res/layout/activity_main.xml create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/res/values/strings.xml create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/res/values/styles.xml create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/gradle.properties create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/settings.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptIncrementalCompilationProject/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptIncrementalCompilationProject/src/main/java/bar/B.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptIncrementalCompilationProject/src/main/java/bar/useB.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptIncrementalCompilationProject/src/main/java/baz/util.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptIncrementalCompilationProject/src/main/java/foo/A.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptIncrementalCompilationProject/src/main/java/foo/JavaClass.java diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt index 0d1a42aac12..4ef01e0915a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt @@ -1,5 +1,7 @@ package org.jetbrains.kotlin.gradle +import org.jetbrains.kotlin.gradle.util.getFileByName +import org.jetbrains.kotlin.gradle.util.modify import org.junit.Test import java.io.File @@ -123,4 +125,23 @@ fun getSomething() = 10 "args.moduleName = Android-compileFlavor2ReleaseKotlin") } } + + @Test + fun testAndroidDaggerIC() { + val project = Project("AndroidDaggerProject", gradleVersion) + val options = defaultBuildOptions().copy(incremental = true) + + project.build("assembleDebug", options = options) { + assertSuccessful() + } + + val file = project.projectDir.getFileByName("AndroidModule.kt") + file.modify { it.replace("fun provideApplicationContext(): Context {", + "fun provideApplicationContext(): Context? {") } + + project.build(":app:assembleDebug", options = options) { + assertSuccessful() + assertCompiledKotlinSources(project.relativizeToSubproject("app", file)) + } + } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt index 7bc6bc616b9..c807071aa90 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt @@ -82,8 +82,16 @@ abstract class BaseGradleIT { copyDirRecursively(File(resourcesRootFile, "GradleWrapper-$wrapperVersion"), projectDir) } - fun relativePaths(files: Iterable): List = + fun relativize(files: Iterable): List = files.map { it.relativeTo(projectDir).path } + + fun relativize(vararg files: File): List = + files.map { it.relativeTo(projectDir).path } + + fun relativizeToSubproject(subproject: String, vararg files: File): List { + val subprojectSir = File(projectDir, subproject) + return files.map { it.relativeTo(subprojectSir).path } + } } class CompiledProject(val project: Project, val output: String, val resultCode: Int) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIT.kt b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIT.kt index 7f84ae3781e..31d9e2e6468 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIT.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIT.kt @@ -1,5 +1,6 @@ package org.jetbrains.kotlin.gradle +import org.jetbrains.kotlin.gradle.util.allJavaFiles import org.jetbrains.kotlin.gradle.util.getFileByName import org.junit.Test @@ -52,6 +53,22 @@ class KaptIT: BaseGradleIT() { } } + @Test + fun testStubsWithoutJava() { + val project = Project("kaptStubs", GRADLE_VERSION) + project.setupWorkingDir() + project.projectDir.allJavaFiles().forEach { it.delete() } + + project.build("build") { + assertSuccessful() + assertContains("kapt: Using class file stubs") + assertContains(":compileKotlin") + assertContains(":compileJava") + assertFileExists("build/classes/main/example/TestClass.class") + assertFileExists("build/classes/main/example/TestClassGenerated.class") + } + } + @Test fun testSimpleIncrementalBuild() { doTestIncrementalBuild("kaptSimple", arrayOf(":compileKotlin", ":compileJava")) diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalIT.kt b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalIT.kt new file mode 100644 index 00000000000..04abd4e2e9c --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalIT.kt @@ -0,0 +1,189 @@ +package org.jetbrains.kotlin.gradle + +import org.jetbrains.kotlin.gradle.util.allKotlinFiles +import org.jetbrains.kotlin.gradle.util.findFileByName +import org.jetbrains.kotlin.gradle.util.getFileByName +import org.jetbrains.kotlin.gradle.util.modify +import org.junit.Test + +class KaptIncrementalNoStubsIT : KaptIncrementalBaseIT(shouldUseStubs = false) +class KaptIncrementalWithStubsIT : KaptIncrementalBaseIT(shouldUseStubs = true) + +abstract class KaptIncrementalBaseIT(val shouldUseStubs: Boolean): BaseGradleIT() { + + companion object { + private const val GRADLE_VERSION = "2.10" + private val EXAMPLE_ANNOTATION_REGEX = "@(field:)?example.ExampleAnnotation".toRegex() + private const val GENERATE_STUBS_PLACEHOLDER = "GENERATE_STUBS_PLACEHOLDER" + } + + private fun getProject() = + Project("kaptIncrementalCompilationProject", GRADLE_VERSION).apply { + setupWorkingDir() + val buildGradle = projectDir.parentFile.getFileByName("build.gradle") + buildGradle.modify { it.replace(GENERATE_STUBS_PLACEHOLDER, shouldUseStubs.toString()) } + } + + private val annotatedElements = + arrayOf("A", "funA", "valA", "funUtil", "valUtil", "B", "funB", "valB", "useB") + + override fun defaultBuildOptions(): BuildOptions = + super.defaultBuildOptions().copy(withDaemon = true, incremental = true) + + @Test + fun testBasic() { + val project = getProject() + + project.build("build") { + assertSuccessful() + checkStubUsage() + checkGenerated(*annotatedElements) + checkNotGenerated("notAnnotatedFun") + } + + project.build("build") { + assertSuccessful() + assertContains(":compileKotlin UP-TO-DATE", + ":compileJava UP-TO-DATE") + + if (shouldUseStubs) { + assertContains(":compileKotlinAfterJava UP-TO-DATE") + } + } + } + + @Test + fun testAddAnnotatedElement() { + val project = getProject() + project.build("build") { + assertSuccessful() + } + + val utilKt = project.projectDir.getFileByName("util.kt") + utilKt.modify { oldContent -> + """$oldContent + + @example.ExampleAnnotation + fun newUtilFun() {}""" + } + + project.build("build") { + assertSuccessful() + // todo: for kapt with stubs check compileKotlin and compileKotlinAfterJava separately + assertCompiledKotlinSources(project.relativize(utilKt)) + checkGenerated(*(annotatedElements + arrayOf("newUtilFun"))) + } + } + + @Test + fun testAddAnnotation() { + val project = getProject() + project.build("build") { + assertSuccessful() + } + + val utilKt = project.projectDir.getFileByName("util.kt") + utilKt.modify { it.replace("fun notAnnotatedFun", "@example.ExampleAnnotation fun notAnnotatedFun") } + + project.build("build") { + assertSuccessful() + assertCompiledKotlinSources(project.relativize(utilKt)) + checkGenerated(*(annotatedElements + arrayOf("notAnnotatedFun"))) + } + } + + @Test + fun testRemoveSourceFile() { + val project = getProject() + project.build("build") { + assertSuccessful() + } + + with (project.projectDir) { + getFileByName("B.kt").delete() + getFileByName("useB.kt").delete() + } + + project.build("build") { + assertFailed() + } + + project.projectDir.getFileByName("JavaClass.java").delete() + + project.build("build") { + assertSuccessful() + assertCompiledKotlinSources(project.relativize(project.projectDir.allKotlinFiles())) + val affectedElements = arrayOf("B", "funB", "valB", "useB") + checkGenerated(*(annotatedElements.toSet() - affectedElements).toTypedArray()) + checkNotGenerated(*affectedElements) + } + } + + @Test + fun testRemoveAnnotations() { + val project = getProject() + project.build("build") { + assertSuccessful() + } + + val bKt = project.projectDir.getFileByName("B.kt") + bKt.modify { it.replace(EXAMPLE_ANNOTATION_REGEX, "") } + val affectedElements = arrayOf("B", "funB", "valB") + + project.build("build") { + assertSuccessful() + val useBKt = project.projectDir.getFileByName("useB.kt") + assertCompiledKotlinSources(project.relativize(bKt, useBKt)) + checkGenerated(*(annotatedElements.toSet() - affectedElements).toTypedArray()) + checkNotGenerated(*affectedElements) + } + } + + @Test + fun testChangeAnnotatedPropertyType() { + val project = getProject() + project.build("build") { + assertSuccessful() + } + + val bKt = project.projectDir.getFileByName("B.kt") + val useBKt = project.projectDir.getFileByName("useB.kt") + bKt.modify { it.replace("val valB = \"text\"", "val valB = 4") } + + project.build("build") { + assertSuccessful() + assertCompiledKotlinSources(project.relativize(bKt, useBKt)) + checkGenerated(*annotatedElements) + } + } + + private fun CompiledProject.checkGenerated(vararg annotatedElementNames: String) { + getGeneratedFileNames(*annotatedElementNames).forEach { + val file = project.projectDir.getFileByName(it) + assert(file.isFile) { "$file must exist" } + } + } + + private fun CompiledProject.checkNotGenerated(vararg annotatedElementNames: String) { + getGeneratedFileNames(*annotatedElementNames).forEach { + val file = project.projectDir.findFileByName(it) + assert(file == null) { "$file must not exist" } + } + } + + private fun getGeneratedFileNames(vararg annotatedElementNames: String): Iterable { + val names = annotatedElementNames.map { it.capitalize() + "Generated" } + return names.map { it + ".java" } + } + + private fun CompiledProject.checkStubUsage() { + val usingStubs = "kapt: Using class file stubs" + + if (shouldUseStubs) { + assertContains(usingStubs) + } + else { + assertNotContains(usingStubs) + } + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/TestRootAffectedIT.kt b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/TestRootAffectedIT.kt index 607530ff4e9..04b9d34cfb9 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/TestRootAffectedIT.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/TestRootAffectedIT.kt @@ -26,7 +26,7 @@ class TestRootAffectedIT : BaseGradleIT() { project.build("build", options = buildOptions) { assertSuccessful() - val expectedToCompile = project.relativePaths(listOf(kotlinGreetingJoinerFile) + project.allTestKotlinFiles()) + val expectedToCompile = project.relativize(listOf(kotlinGreetingJoinerFile) + project.allTestKotlinFiles()) assertCompiledKotlinSources(expectedToCompile) } @@ -50,7 +50,7 @@ class TestRootAffectedIT : BaseGradleIT() { project.build("build", options = buildOptions) { assertSuccessful() - val expectedToCompile = project.relativePaths(project.allTestKotlinFiles()) + val expectedToCompile = project.relativize(project.allTestKotlinFiles()) assertCompiledKotlinSources(expectedToCompile) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/util/fileUtil.kt b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/util/fileUtil.kt index 21ab43ea99c..e04b9294da9 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/util/fileUtil.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/util/fileUtil.kt @@ -9,8 +9,15 @@ fun File.findFileByName(name: String): File? = walk().filter { it.isFile && it.name.equals(name, ignoreCase = true) }.firstOrNull() fun File.allKotlinFiles(): Iterable = - walk().filter { it.isFile && it.extension.toLowerCase().equals("kt") }.toList() + allFilesWithExtension("kt") + +fun File.allJavaFiles(): Iterable = + allFilesWithExtension("java") + +fun File.allFilesWithExtension(ext: String): Iterable = + walk().filter { it.isFile && it.extension.equals(ext, ignoreCase = true) }.toList() fun File.modify(transform: (String)->String) { writeText(transform(readText())) -} \ No newline at end of file +} + diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/build.gradle b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/build.gradle new file mode 100644 index 00000000000..c9c5a9abed5 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/build.gradle @@ -0,0 +1,53 @@ +buildscript { + ext.kotlin_version = '0.1-SNAPSHOT' + + repositories { + mavenLocal() + jcenter() + } + + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath "com.android.tools.build:gradle:$androidToolsVersion" + classpath "com.jakewharton.sdkmanager:gradle-plugin:0.12.+" + } +} + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' + +android { + compileSdkVersion 23 + buildToolsVersion "23.0.1" + + defaultConfig { + applicationId "com.example.dagger.kotlin" + minSdkVersion 14 + targetSdkVersion 23 + versionCode 1 + versionName "1.0" + } + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } +} + +repositories { + mavenLocal() + jcenter() +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + compile 'com.android.support:appcompat-v7:23.1.1' + compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + + compile 'com.google.dagger:dagger:2.0.1' + kapt 'com.google.dagger:dagger-compiler:2.0' + provided 'org.glassfish:javax.annotation:10.0-b28' +} + +kapt { + generateStubs = true +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/AndroidManifest.xml b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..4268e154dfc --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/AndroidManifest.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/java/com/example/dagger/kotlin/AndroidModule.kt b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/java/com/example/dagger/kotlin/AndroidModule.kt new file mode 100755 index 00000000000..da11452cc68 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/java/com/example/dagger/kotlin/AndroidModule.kt @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2013 Square, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.example.dagger.kotlin + +import android.content.Context +import android.content.Context.LOCATION_SERVICE +import android.location.LocationManager +import dagger.Module +import dagger.Provides +import javax.inject.Singleton + +/** + * A module for Android-specific dependencies which require a [Context] or + * [android.app.Application] to create. + */ +@Module class AndroidModule(private val application: BaseApplication) { + + /** + * Allow the application context to be injected but require that it be annotated with + * [@Annotation][ForApplication] to explicitly differentiate it from an activity context. + */ + @Provides @Singleton @ForApplication + fun provideApplicationContext(): Context { + return application + } + + @Provides @Singleton + fun provideLocationManager(): LocationManager { + return application.getSystemService(LOCATION_SERVICE) as LocationManager + } +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/java/com/example/dagger/kotlin/ApplicationComponent.kt b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/java/com/example/dagger/kotlin/ApplicationComponent.kt new file mode 100644 index 00000000000..32b153dd9ed --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/java/com/example/dagger/kotlin/ApplicationComponent.kt @@ -0,0 +1,13 @@ +package com.example.dagger.kotlin + +import com.example.dagger.kotlin.ui.HomeActivity +import dagger.Component +import javax.inject.Singleton + +@Singleton +@Component(modules = arrayOf(AndroidModule::class)) +interface ApplicationComponent { + fun inject(application: BaseApplication) + fun inject(homeActivity: HomeActivity) + fun inject(demoActivity: DemoActivity) +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/java/com/example/dagger/kotlin/BaseApplication.kt b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/java/com/example/dagger/kotlin/BaseApplication.kt new file mode 100755 index 00000000000..69eb1ef1ab2 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/java/com/example/dagger/kotlin/BaseApplication.kt @@ -0,0 +1,11 @@ +package com.example.dagger.kotlin + +import android.app.Application + +abstract class BaseApplication : Application() { + + protected fun initDaggerComponent(): ApplicationComponent { + return DaggerApplicationComponent.builder().androidModule(AndroidModule(this)).build() + } + +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/java/com/example/dagger/kotlin/DemoActivity.kt b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/java/com/example/dagger/kotlin/DemoActivity.kt new file mode 100755 index 00000000000..06168ee51ad --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/java/com/example/dagger/kotlin/DemoActivity.kt @@ -0,0 +1,12 @@ +package com.example.dagger.kotlin + +import android.app.Activity +import android.os.Bundle + +abstract class DemoActivity : Activity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + // Perform injection so that when this call returns all dependencies will be available for use. + (application as DemoApplication).component.inject(this) + } +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/java/com/example/dagger/kotlin/DemoApplication.kt b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/java/com/example/dagger/kotlin/DemoApplication.kt new file mode 100644 index 00000000000..6ea6c459bac --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/java/com/example/dagger/kotlin/DemoApplication.kt @@ -0,0 +1,13 @@ +package com.example.dagger.kotlin + +class DemoApplication : BaseApplication() { + lateinit var component: ApplicationComponent + + override fun onCreate() { + super.onCreate() + val component = initDaggerComponent() + component.inject(this) // As of now, LocationManager should be injected into this. + this.component = component + } + +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/java/com/example/dagger/kotlin/ForApplication.kt b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/java/com/example/dagger/kotlin/ForApplication.kt new file mode 100755 index 00000000000..a3ec79ff373 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/java/com/example/dagger/kotlin/ForApplication.kt @@ -0,0 +1,6 @@ +package com.example.dagger.kotlin + +import javax.inject.Qualifier + +@Qualifier +annotation class ForApplication diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/java/com/example/dagger/kotlin/ui/HomeActivity.kt b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/java/com/example/dagger/kotlin/ui/HomeActivity.kt new file mode 100755 index 00000000000..7789641b694 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/java/com/example/dagger/kotlin/ui/HomeActivity.kt @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2013 Square, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.example.dagger.kotlin.ui + +import android.location.LocationManager +import android.os.Bundle +import com.example.dagger.kotlin.DemoActivity +import com.example.dagger.kotlin.DemoApplication +import com.example.dagger.kotlin.R +import kotlinx.android.synthetic.main.activity_main.locationInfo +import javax.inject.Inject + +class HomeActivity : DemoActivity() { + @Inject + lateinit var locationManager: LocationManager + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + (application as DemoApplication).component.inject(this) + + // TODO do something with the injected dependencies here! + locationInfo.text = "Injected LocationManager:\n$locationManager" + } +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/res/layout/activity_main.xml b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/res/layout/activity_main.xml new file mode 100644 index 00000000000..35f42cfe411 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/res/values/strings.xml b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/res/values/strings.xml new file mode 100644 index 00000000000..67b44b1a8cd --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + kotlin + diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/res/values/styles.xml b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/res/values/styles.xml new file mode 100644 index 00000000000..766ab993048 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/app/src/main/res/values/styles.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/build.gradle b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/build.gradle new file mode 100644 index 00000000000..495c5038ea6 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/build.gradle @@ -0,0 +1 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/gradle.properties b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/gradle.properties new file mode 100644 index 00000000000..5fcc74643cf --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/gradle.properties @@ -0,0 +1 @@ +org.gradle.jvmargs=-ea -XX:MaxPermSize=512m \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/settings.gradle b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/settings.gradle new file mode 100644 index 00000000000..e7b4def49cb --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidDaggerProject/settings.gradle @@ -0,0 +1 @@ +include ':app' diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptIncrementalCompilationProject/build.gradle b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptIncrementalCompilationProject/build.gradle new file mode 100644 index 00000000000..bcb93249598 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptIncrementalCompilationProject/build.gradle @@ -0,0 +1,31 @@ +buildscript { + repositories { + mavenCentral() + maven { + url 'file://' + pathToKotlinPlugin + } + } + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:0.1-SNAPSHOT" + } +} + +apply plugin: "java" +apply plugin: "kotlin" + +repositories { + maven { + url 'file://' + pathToKotlinPlugin + } + mavenCentral() +} + +dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib:0.1-SNAPSHOT" + compile "org.jetbrains.kotlin:annotation-processor-example:0.1-SNAPSHOT" + kapt "org.jetbrains.kotlin:annotation-processor-example:0.1-SNAPSHOT" +} + +kapt { + generateStubs = GENERATE_STUBS_PLACEHOLDER +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptIncrementalCompilationProject/src/main/java/bar/B.kt b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptIncrementalCompilationProject/src/main/java/bar/B.kt new file mode 100644 index 00000000000..bee5c19e5ed --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptIncrementalCompilationProject/src/main/java/bar/B.kt @@ -0,0 +1,14 @@ +package bar + +import foo.A + +@example.ExampleAnnotation +class B { + @field:example.ExampleAnnotation + val valB = "text" + + @example.ExampleAnnotation + fun funB() {} + + fun useAfromB(a: A) {} +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptIncrementalCompilationProject/src/main/java/bar/useB.kt b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptIncrementalCompilationProject/src/main/java/bar/useB.kt new file mode 100644 index 00000000000..16965ee1624 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptIncrementalCompilationProject/src/main/java/bar/useB.kt @@ -0,0 +1,4 @@ +package bar + +@example.ExampleAnnotation +fun useB(b: B) = b.valB \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptIncrementalCompilationProject/src/main/java/baz/util.kt b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptIncrementalCompilationProject/src/main/java/baz/util.kt new file mode 100644 index 00000000000..eddfdea211c --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptIncrementalCompilationProject/src/main/java/baz/util.kt @@ -0,0 +1,9 @@ +package baz + +@field:example.ExampleAnnotation +val valUtil = 0 + +@example.ExampleAnnotation +fun funUtil() {} + +fun notAnnotatedFun() {} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptIncrementalCompilationProject/src/main/java/foo/A.kt b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptIncrementalCompilationProject/src/main/java/foo/A.kt new file mode 100644 index 00000000000..e2be2067f36 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptIncrementalCompilationProject/src/main/java/foo/A.kt @@ -0,0 +1,10 @@ +package foo + +@example.ExampleAnnotation +class A { + @field:example.ExampleAnnotation + val valA: String = "text" + + @example.ExampleAnnotation + fun funA() {} +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptIncrementalCompilationProject/src/main/java/foo/JavaClass.java b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptIncrementalCompilationProject/src/main/java/foo/JavaClass.java new file mode 100644 index 00000000000..05752eb3c4e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptIncrementalCompilationProject/src/main/java/foo/JavaClass.java @@ -0,0 +1,21 @@ +package foo; + +import bar.B; +import bar.UseBKt; + +public class JavaClass { + public void test() { + A a = new A(); + + a.funA(); + a.getValA(); + + B b = new B(); + b.useAfromB(a); + b.funB(); + b.getValB(); + UseBKt.useB(b); + + System.out.println(AGenerated.class.getName()); + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptStubs/src/main/java/test.kt b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptStubs/src/main/java/test.kt index a0825234e36..1562955d627 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptStubs/src/main/java/test.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptStubs/src/main/java/test.kt @@ -7,6 +7,6 @@ public class TestClass { public val testVal: String = "text" @example.ExampleAnnotation - public fun testFunction(): Class<*> = TestClassGenerated::class.java + public fun testFunction(): TestClassGenerated = TestClassGenerated() } \ No newline at end of file