From 1a1eb7dcfa44e281717ab5262add3dcdacdc2da1 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Wed, 13 Jul 2016 16:48:09 +0300 Subject: [PATCH] KT-12303 Pass only relevant annotations to annotation processors (cherry picked from commit 01742aa) --- .../annotation/AnnotationProcessorWrapper.kt | 22 +++++++-- .../AbstractKotlinAndroidGradleTests.kt | 10 ++++ .../AndroidIcepickProject/app/build.gradle | 45 +++++++++++++++++ .../app/src/main/AndroidManifest.xml | 22 +++++++++ .../github/frankiesardo/icepick/CustomView.kt | 28 +++++++++++ .../github/frankiesardo/icepick/Example.kt | 19 +++++++ .../frankiesardo/icepick/ExampleBundler.kt | 18 +++++++ .../frankiesardo/icepick/MainActivity.kt | 49 +++++++++++++++++++ .../github/frankiesardo/icepick/MyBundler.kt | 17 +++++++ .../com/sample/icepick/lib/BaseActivity.kt | 24 +++++++++ .../com/sample/icepick/lib/BaseCustomView.kt | 34 +++++++++++++ .../app/src/main/res/layout/activity_main.xml | 12 +++++ .../app/src/main/res/menu/main.xml | 7 +++ .../app/src/main/res/values/strings.xml | 5 ++ .../AndroidIcepickProject/build.gradle | 17 +++++++ .../AndroidIcepickProject/gradle.properties | 1 + .../AndroidIcepickProject/settings.gradle | 1 + 17 files changed, 327 insertions(+), 4 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/AndroidManifest.xml create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/java/com/github/frankiesardo/icepick/CustomView.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/java/com/github/frankiesardo/icepick/Example.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/java/com/github/frankiesardo/icepick/ExampleBundler.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/java/com/github/frankiesardo/icepick/MainActivity.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/java/com/github/frankiesardo/icepick/MyBundler.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/java/com/sample/icepick/lib/BaseActivity.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/java/com/sample/icepick/lib/BaseCustomView.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/res/layout/activity_main.xml create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/res/menu/main.xml create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/res/values/strings.xml create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/gradle.properties create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/settings.gradle diff --git a/libraries/tools/kotlin-annotation-processing/src/main/kotlin/org/jetbrains/kotlin/annotation/AnnotationProcessorWrapper.kt b/libraries/tools/kotlin-annotation-processing/src/main/kotlin/org/jetbrains/kotlin/annotation/AnnotationProcessorWrapper.kt index 1e8a85ecbaf..07d2c1394a0 100644 --- a/libraries/tools/kotlin-annotation-processing/src/main/kotlin/org/jetbrains/kotlin/annotation/AnnotationProcessorWrapper.kt +++ b/libraries/tools/kotlin-annotation-processing/src/main/kotlin/org/jetbrains/kotlin/annotation/AnnotationProcessorWrapper.kt @@ -26,11 +26,11 @@ import javax.lang.model.element.TypeElement import javax.tools.Diagnostic import kotlin.properties.Delegates -public class AnnotationProcessorStub : AbstractProcessor() { +class AnnotationProcessorStub : AbstractProcessor() { override fun process(annotations: Set?, roundEnv: RoundEnvironment?) = true } -public abstract class AnnotationProcessorWrapper( +abstract class AnnotationProcessorWrapper( private val processorFqName: String, private val taskQualifier: String ) : Processor { @@ -38,6 +38,13 @@ public abstract class AnnotationProcessorWrapper( private companion object { val KAPT_ANNOTATION_OPTION = "kapt.annotations" val KAPT_KOTLIN_GENERATED_OPTION = "kapt.kotlin.generated" + + /* + * If no Java sources are provided, javac finishes without running Annotation Processing. + * This is not what we want, so we generate a special class for this case + * with a field annotated with KAPT_SPECIAL_ANNOTATION (see AnnotationProcessingManager.generateJavaHackFile). + */ + val KAPT_SPECIAL_ANNOTATION = "__gen.KotlinAptAnnotation" } private val processor: Processor by lazy { @@ -56,6 +63,8 @@ public abstract class AnnotationProcessorWrapper( private var roundCounter = 0 + private var handledAnnotationTypes: Set = emptySet() + override fun getCompletions( element: Element?, annotation: AnnotationMirror?, @@ -83,11 +92,13 @@ public abstract class AnnotationProcessorWrapper( } processor.init(processingEnv) + + handledAnnotationTypes = this.supportedAnnotationTypes } override fun getSupportedAnnotationTypes(): MutableSet { val supportedAnnotations = processor.supportedAnnotationTypes.toMutableSet() - supportedAnnotations.add("__gen.KotlinAptAnnotation") + supportedAnnotations.add(KAPT_SPECIAL_ANNOTATION) return supportedAnnotations } @@ -106,7 +117,10 @@ public abstract class AnnotationProcessorWrapper( if (roundCounter == 1) { for (annotationFqName in kotlinAnnotationsProvider.annotatedKotlinElements.keys) { - if (annotationFqName in existingFqNames) continue + if (annotationFqName in existingFqNames + || annotationFqName == KAPT_SPECIAL_ANNOTATION + || annotationFqName !in handledAnnotationTypes // Filter out irrelevant annotations) continue + ) continue existingFqNames.add(annotationFqName) processingEnv.elementUtils.getTypeElement(annotationFqName)?.let { wrappedAnnotations += it } } 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 4bd1b5d94e4..7e054734826 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 @@ -173,6 +173,16 @@ fun getSomething() = 10 } } + @Test + fun testAndroidIcepickProject() { + val project = Project("AndroidIcepickProject", gradleVersion) + val options = defaultBuildOptions().copy(incremental = false) + + project.build("assembleDebug", options = options) { + assertSuccessful() + } + } + @Test fun testAndroidExtensions() { val project = Project("AndroidExtensionsProject", gradleVersion) diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/build.gradle b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/build.gradle new file mode 100644 index 00000000000..9e0e8bad034 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/build.gradle @@ -0,0 +1,45 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'android-sdk-manager' + +dependencies { + compile "frankiesardo:icepick:3.2.0" + kapt "frankiesardo:icepick-processor:3.2.0" + + compile 'org.parceler:parceler-api:1.1.5' + kapt 'org.parceler:parceler:1.1.5' + + compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" +} + +android { + compileSdkVersion 23 + buildToolsVersion "23.0.1" + + defaultConfig { + applicationId "com.example.icepick.kotlin" + minSdkVersion 14 + targetSdkVersion 23 + versionCode 1 + versionName "1.0" + } + + lintOptions { + abortOnError false + } + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } +} + +repositories { + mavenCentral() + maven { + url "https://clojars.org/repo/" + } + mavenLocal() +} + +kapt { + generateStubs = true +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/AndroidManifest.xml b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..ede20458e43 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/AndroidManifest.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/java/com/github/frankiesardo/icepick/CustomView.kt b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/java/com/github/frankiesardo/icepick/CustomView.kt new file mode 100644 index 00000000000..e8efda87823 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/java/com/github/frankiesardo/icepick/CustomView.kt @@ -0,0 +1,28 @@ +package com.github.frankiesardo.icepick + +import android.content.Context +import android.os.Parcelable +import android.util.AttributeSet +import com.sample.icepick.lib.BaseCustomView +import icepick.State + +class CustomView : BaseCustomView { + @JvmField @State + var textColor: Int? = null + + constructor(context: Context) : super(context) + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) + constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) + + fun setTextColorWithAnotherMethod(color: Int) { + this.textColor = color + setTextColor(textColor!!) + } + + override fun onRestoreInstanceState(state: Parcelable) { + super.onRestoreInstanceState(state) + if (textColor != null) { + setTextColorWithAnotherMethod(textColor!!) + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/java/com/github/frankiesardo/icepick/Example.kt b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/java/com/github/frankiesardo/icepick/Example.kt new file mode 100644 index 00000000000..5bb6ac26cd3 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/java/com/github/frankiesardo/icepick/Example.kt @@ -0,0 +1,19 @@ +package com.github.frankiesardo.icepick + +import org.parceler.Parcel + +@Parcel +class Example { + lateinit var name: String + + @JvmField + var age: Int = 0 + + constructor() { /*Required empty bean constructor*/ + } + + constructor(age: Int, name: String) { + this.age = age + this.name = name + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/java/com/github/frankiesardo/icepick/ExampleBundler.kt b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/java/com/github/frankiesardo/icepick/ExampleBundler.kt new file mode 100644 index 00000000000..7ef36eaf348 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/java/com/github/frankiesardo/icepick/ExampleBundler.kt @@ -0,0 +1,18 @@ +package com.github.frankiesardo.icepick + +import android.os.Bundle +import android.os.Parcelable + +import org.parceler.Parcels + +import icepick.Bundler + +class ExampleBundler : Bundler { + override fun put(s: String, example: Any, bundle: Bundle) { + bundle.putParcelable(s, Parcels.wrap(example)) + } + + override fun get(s: String, bundle: Bundle): Any { + return Parcels.unwrap(bundle.getParcelable(s)) + } +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/java/com/github/frankiesardo/icepick/MainActivity.kt b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/java/com/github/frankiesardo/icepick/MainActivity.kt new file mode 100644 index 00000000000..a6d43e9a61d --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/java/com/github/frankiesardo/icepick/MainActivity.kt @@ -0,0 +1,49 @@ +package com.github.frankiesardo.icepick + +import android.graphics.Color +import android.os.Bundle +import android.view.Menu +import android.view.MenuItem +import com.sample.icepick.lib.BaseActivity +import icepick.State + +class MainActivity : BaseActivity() { + @JvmField @State(MyBundler::class) + var message: String? = null + + lateinit var customView: CustomView + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + customView = findViewById(R.id.custom_view) as CustomView + updateText() + } + + private fun updateText() { + val defaultText = if (message == null || baseMessage == null) { + "Use the menu to add some state" + } else { + baseMessage + message + } + customView.text = defaultText + } + + override fun onCreateOptionsMenu(menu: Menu): Boolean { + menuInflater.inflate(R.menu.main, menu) + return super.onPrepareOptionsMenu(menu) + } + + override fun onMenuItemSelected(featureId: Int, item: MenuItem): Boolean { + if (item.itemId == R.id.action_add_state) { + customView.setBackgroundColorWithAnotherMethod(Color.BLUE) + customView.setTextColorWithAnotherMethod(Color.WHITE) + + baseMessage = "This state will be automagically " + message = "saved and restored" + updateText() + return true + } + return super.onMenuItemSelected(featureId, item) + } +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/java/com/github/frankiesardo/icepick/MyBundler.kt b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/java/com/github/frankiesardo/icepick/MyBundler.kt new file mode 100644 index 00000000000..5827899383f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/java/com/github/frankiesardo/icepick/MyBundler.kt @@ -0,0 +1,17 @@ +package com.github.frankiesardo.icepick + +import android.os.Bundle + +import icepick.Bundler + +class MyBundler : Bundler { + override fun put(key: String, value: String?, bundle: Bundle) { + if (value != null) { + bundle.putString(key, value + "*") + } + } + + override fun get(key: String, bundle: Bundle): String? { + return bundle.getString(key) + } +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/java/com/sample/icepick/lib/BaseActivity.kt b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/java/com/sample/icepick/lib/BaseActivity.kt new file mode 100644 index 00000000000..3bb668d8995 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/java/com/sample/icepick/lib/BaseActivity.kt @@ -0,0 +1,24 @@ +package com.sample.icepick.lib + +import android.app.Activity +import android.os.Bundle +import android.os.Parcelable +import icepick.Icepick +import icepick.State +import android.util.Log + +open class BaseActivity : Activity() { + @JvmField @State + var baseMessage: String? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + Icepick.restoreInstanceState(this, savedInstanceState) + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + Icepick.saveInstanceState(this, outState) + } +} + diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/java/com/sample/icepick/lib/BaseCustomView.kt b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/java/com/sample/icepick/lib/BaseCustomView.kt new file mode 100644 index 00000000000..0c803627dff --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/java/com/sample/icepick/lib/BaseCustomView.kt @@ -0,0 +1,34 @@ +package com.sample.icepick.lib + +import android.content.Context +import android.os.Parcelable +import android.util.AttributeSet +import android.widget.TextView + +import icepick.Icepick +import icepick.State + +open class BaseCustomView : TextView { + @JvmField @State + var backgroundColor: Int? = null + + constructor(context: Context) : super(context) + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) + constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) + + fun setBackgroundColorWithAnotherMethod(color: Int) { + this.backgroundColor = color + setBackgroundColor(color) + } + + override fun onSaveInstanceState(): Parcelable { + return Icepick.saveInstanceState(this, super.onSaveInstanceState()) + } + + override fun onRestoreInstanceState(state: Parcelable) { + super.onRestoreInstanceState(Icepick.restoreInstanceState(this, state)) + if (backgroundColor != null) { + setBackgroundColorWithAnotherMethod(backgroundColor!!) + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/res/layout/activity_main.xml b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/res/layout/activity_main.xml new file mode 100644 index 00000000000..5a309736616 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/res/menu/main.xml b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/res/menu/main.xml new file mode 100644 index 00000000000..d83a242a320 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/res/menu/main.xml @@ -0,0 +1,7 @@ + + + diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/res/values/strings.xml b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/res/values/strings.xml new file mode 100644 index 00000000000..c766721070e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/app/src/main/res/values/strings.xml @@ -0,0 +1,5 @@ + + + Icepick + Add some state + diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/build.gradle b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/build.gradle new file mode 100644 index 00000000000..f3f9a2bde6c --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/build.gradle @@ -0,0 +1,17 @@ +buildscript { + ext.kotlin_version = '0.1-SNAPSHOT' //'1.0.3' + repositories { + mavenCentral() + mavenLocal() + jcenter() + } + dependencies { + classpath "com.android.tools.build:gradle:$androidToolsVersion" + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath "com.jakewharton.sdkmanager:gradle-plugin:0.12.+" + } +} + +task wrapper(type: Wrapper) { + gradleVersion = '2.12' +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/gradle.properties b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/gradle.properties new file mode 100644 index 00000000000..5fcc74643cf --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/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/AndroidIcepickProject/settings.gradle b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/settings.gradle new file mode 100644 index 00000000000..4c90568abd7 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidIcepickProject/settings.gradle @@ -0,0 +1 @@ +include 'app'