diff --git a/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/parcel/quickfixes/AnnotateWithParcelizeQuickFix.kt b/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/parcel/quickfixes/AnnotateWithParcelizeQuickFix.kt new file mode 100644 index 00000000000..78255c62cdc --- /dev/null +++ b/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/parcel/quickfixes/AnnotateWithParcelizeQuickFix.kt @@ -0,0 +1,37 @@ +/* + * Copyright 2010-2017 JetBrains s.r.o. + * + * 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 org.jetbrains.kotlin.android.parcel.quickfixes + +import kotlinx.android.parcel.Parcelize +import org.jetbrains.kotlin.diagnostics.DiagnosticWithParameters1 +import org.jetbrains.kotlin.idea.util.addAnnotation +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.psi.* + +class AnnotateWithParcelizeQuickFix(clazz: KtClassOrObject) : AbstractParcelableQuickFix(clazz) { + object Factory : AbstractFactory({ + @Suppress("UNCHECKED_CAST") + val targetClass = (this as DiagnosticWithParameters1<*, KtClassOrObject>).a + AnnotateWithParcelizeQuickFix(targetClass) + }) + + override fun getText() = "Annotate containing class with ''@Parcelize''" + + override fun invoke(ktPsiFactory: KtPsiFactory, element: KtClassOrObject) { + element.addAnnotation(FqName(Parcelize::class.java.name)) + } +} \ No newline at end of file diff --git a/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/parcel/quickfixes/ParcelableQuickFixContributor.kt b/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/parcel/quickfixes/ParcelableQuickFixContributor.kt index d50ef697a26..f92a820afaf 100644 --- a/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/parcel/quickfixes/ParcelableQuickFixContributor.kt +++ b/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/parcel/quickfixes/ParcelableQuickFixContributor.kt @@ -36,5 +36,8 @@ class ParcelableQuickFixContributor : QuickFixContributor { quickFixes.register(ErrorsAndroid.CREATOR_DEFINITION_IS_NOT_ALLOWED, ParcelMigrateToParcelizeQuickFix.FactoryForCREATOR) quickFixes.register(ErrorsAndroid.CREATOR_DEFINITION_IS_NOT_ALLOWED, ParcelRemoveCustomCreatorProperty.Factory) + + quickFixes.register(ErrorsAndroid.REDUNDANT_TYPE_PARCELER, ParcelableRemoveDuplicatingTypeParcelerAnnotationQuickFix.Factory) + quickFixes.register(ErrorsAndroid.CLASS_SHOULD_BE_PARCELIZE, AnnotateWithParcelizeQuickFix.Factory) } } \ No newline at end of file diff --git a/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/parcel/quickfixes/ParcelableRemoveDuplicatingTypeParcelerAnnotationQuickFix.kt b/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/parcel/quickfixes/ParcelableRemoveDuplicatingTypeParcelerAnnotationQuickFix.kt new file mode 100644 index 00000000000..47c64b98cf8 --- /dev/null +++ b/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/parcel/quickfixes/ParcelableRemoveDuplicatingTypeParcelerAnnotationQuickFix.kt @@ -0,0 +1,30 @@ +/* + * Copyright 2010-2017 JetBrains s.r.o. + * + * 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 org.jetbrains.kotlin.android.parcel.quickfixes + +import org.jetbrains.kotlin.psi.KtAnnotationEntry +import org.jetbrains.kotlin.psi.KtPsiFactory + +class ParcelableRemoveDuplicatingTypeParcelerAnnotationQuickFix(anno: KtAnnotationEntry) : AbstractParcelableQuickFix(anno) { + object Factory : AbstractFactory({ findElement()?.let(::ParcelableRemoveDuplicatingTypeParcelerAnnotationQuickFix) }) + + override fun getText() = "Remove redundant ''@TypeParceler'' annotation" + + override fun invoke(ktPsiFactory: KtPsiFactory, element: KtAnnotationEntry) { + element.delete() + } +} \ No newline at end of file diff --git a/plugins/android-extensions/android-extensions-idea/testData/android/parcel/quickfix/classShouldBeAnnotated/simple.after.kt b/plugins/android-extensions/android-extensions-idea/testData/android/parcel/quickfix/classShouldBeAnnotated/simple.after.kt new file mode 100644 index 00000000000..e9ceb68c141 --- /dev/null +++ b/plugins/android-extensions/android-extensions-idea/testData/android/parcel/quickfix/classShouldBeAnnotated/simple.after.kt @@ -0,0 +1,17 @@ +// "Annotate with ''@Parcelize''" "true" +// ERROR: Class 'Foo' should be annotated with ''@Parcelize'' +// WITH_RUNTIME + +package com.myapp.activity + +import android.os.* +import kotlinx.android.parcel.* + +object StringParceler : Parceler { + override fun create(parcel: Parcel) = TODO() + override fun String.write(parcel: Parcel, flags: Int) = TODO() +} + +@Parcelize +@TypeParceler +class Foo(val a: String) : Parcelable \ No newline at end of file diff --git a/plugins/android-extensions/android-extensions-idea/testData/android/parcel/quickfix/classShouldBeAnnotated/simple.before.Main.kt b/plugins/android-extensions/android-extensions-idea/testData/android/parcel/quickfix/classShouldBeAnnotated/simple.before.Main.kt new file mode 100644 index 00000000000..778c15d36c7 --- /dev/null +++ b/plugins/android-extensions/android-extensions-idea/testData/android/parcel/quickfix/classShouldBeAnnotated/simple.before.Main.kt @@ -0,0 +1,15 @@ +// "Annotate containing class with ''@Parcelize''" "true" +// ERROR: Class 'Foo' should be annotated with ''@Parcelize'' +// WITH_RUNTIME + +package com.myapp.activity + +import android.os.* +import kotlinx.android.parcel.* + +object StringParceler : Parceler { + override fun create(parcel: Parcel) = TODO() + override fun String.write(parcel: Parcel, flags: Int) = TODO() +} + +class Foo(@TypeParceler val a: String) \ No newline at end of file diff --git a/plugins/android-extensions/android-extensions-idea/testData/android/parcel/quickfix/removeDuplicatingTypeParcelerAnnotation/simple.after.kt b/plugins/android-extensions/android-extensions-idea/testData/android/parcel/quickfix/removeDuplicatingTypeParcelerAnnotation/simple.after.kt new file mode 100644 index 00000000000..c10847ff84e --- /dev/null +++ b/plugins/android-extensions/android-extensions-idea/testData/android/parcel/quickfix/removeDuplicatingTypeParcelerAnnotation/simple.after.kt @@ -0,0 +1,17 @@ +// "Remove redundant ''@TypeParceler'' annotation" "true" +// WARNING: This annotation duplicates the one for Class 'Foo' +// WITH_RUNTIME + +package com.myapp.activity + +import android.os.* +import kotlinx.android.parcel.* + +object StringParceler : Parceler { + override fun create(parcel: Parcel) = TODO() + override fun String.write(parcel: Parcel, flags: Int) = TODO() +} + +@Parcelize +@TypeParceler +class Foo(val a: String) : Parcelable \ No newline at end of file diff --git a/plugins/android-extensions/android-extensions-idea/testData/android/parcel/quickfix/removeDuplicatingTypeParcelerAnnotation/simple.before.Main.kt b/plugins/android-extensions/android-extensions-idea/testData/android/parcel/quickfix/removeDuplicatingTypeParcelerAnnotation/simple.before.Main.kt new file mode 100644 index 00000000000..61cc3734819 --- /dev/null +++ b/plugins/android-extensions/android-extensions-idea/testData/android/parcel/quickfix/removeDuplicatingTypeParcelerAnnotation/simple.before.Main.kt @@ -0,0 +1,17 @@ +// "Remove redundant ''@TypeParceler'' annotation" "true" +// WARNING: This annotation duplicates the one for Class 'Foo' +// WITH_RUNTIME + +package com.myapp.activity + +import android.os.* +import kotlinx.android.parcel.* + +object StringParceler : Parceler { + override fun create(parcel: Parcel) = TODO() + override fun String.write(parcel: Parcel, flags: Int) = TODO() +} + +@Parcelize +@TypeParceler +class Foo(@TypeParceler val a: String) : Parcelable \ No newline at end of file diff --git a/plugins/android-extensions/android-extensions-idea/tests/org/jetbrains/kotlin/android/ParcelQuickFixTestGenerated.java b/plugins/android-extensions/android-extensions-idea/tests/org/jetbrains/kotlin/android/ParcelQuickFixTestGenerated.java index 6488a15ccac..e996201f297 100644 --- a/plugins/android-extensions/android-extensions-idea/tests/org/jetbrains/kotlin/android/ParcelQuickFixTestGenerated.java +++ b/plugins/android-extensions/android-extensions-idea/tests/org/jetbrains/kotlin/android/ParcelQuickFixTestGenerated.java @@ -78,6 +78,21 @@ public class ParcelQuickFixTestGenerated extends AbstractParcelQuickFixTest { } } + @TestMetadata("plugins/android-extensions/android-extensions-idea/testData/android/parcel/quickfix/classShouldBeAnnotated") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class ClassShouldBeAnnotated extends AbstractParcelQuickFixTest { + public void testAllFilesPresentInClassShouldBeAnnotated() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("plugins/android-extensions/android-extensions-idea/testData/android/parcel/quickfix/classShouldBeAnnotated"), Pattern.compile("^(\\w+)\\.((before\\.Main\\.\\w+)|(test))$"), TargetBackend.ANY, true); + } + + @TestMetadata("simple.before.Main.kt") + public void testSimple() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("plugins/android-extensions/android-extensions-idea/testData/android/parcel/quickfix/classShouldBeAnnotated/simple.before.Main.kt"); + doTestWithExtraFile(fileName); + } + } + @TestMetadata("plugins/android-extensions/android-extensions-idea/testData/android/parcel/quickfix/deleteIncompatible") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) @@ -191,4 +206,19 @@ public class ParcelQuickFixTestGenerated extends AbstractParcelQuickFixTest { doTestWithExtraFile(fileName); } } + + @TestMetadata("plugins/android-extensions/android-extensions-idea/testData/android/parcel/quickfix/removeDuplicatingTypeParcelerAnnotation") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class RemoveDuplicatingTypeParcelerAnnotation extends AbstractParcelQuickFixTest { + public void testAllFilesPresentInRemoveDuplicatingTypeParcelerAnnotation() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("plugins/android-extensions/android-extensions-idea/testData/android/parcel/quickfix/removeDuplicatingTypeParcelerAnnotation"), Pattern.compile("^(\\w+)\\.((before\\.Main\\.\\w+)|(test))$"), TargetBackend.ANY, true); + } + + @TestMetadata("simple.before.Main.kt") + public void testSimple() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("plugins/android-extensions/android-extensions-idea/testData/android/parcel/quickfix/removeDuplicatingTypeParcelerAnnotation/simple.before.Main.kt"); + doTestWithExtraFile(fileName); + } + } }