Parcelable: Provide quick fixes for custom Parceler support
This commit is contained in:
+37
@@ -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<KtClassOrObject>(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))
|
||||||
|
}
|
||||||
|
}
|
||||||
+3
@@ -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, ParcelMigrateToParcelizeQuickFix.FactoryForCREATOR)
|
||||||
quickFixes.register(ErrorsAndroid.CREATOR_DEFINITION_IS_NOT_ALLOWED, ParcelRemoveCustomCreatorProperty.Factory)
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+30
@@ -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<KtAnnotationEntry>(anno) {
|
||||||
|
object Factory : AbstractFactory({ findElement<KtAnnotationEntry>()?.let(::ParcelableRemoveDuplicatingTypeParcelerAnnotationQuickFix) })
|
||||||
|
|
||||||
|
override fun getText() = "Remove redundant ''@TypeParceler'' annotation"
|
||||||
|
|
||||||
|
override fun invoke(ktPsiFactory: KtPsiFactory, element: KtAnnotationEntry) {
|
||||||
|
element.delete()
|
||||||
|
}
|
||||||
|
}
|
||||||
+17
@@ -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<String> {
|
||||||
|
override fun create(parcel: Parcel) = TODO()
|
||||||
|
override fun String.write(parcel: Parcel, flags: Int) = TODO()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Parcelize
|
||||||
|
@TypeParceler<String, StringParceler>
|
||||||
|
class Foo(<caret>val a: String) : Parcelable
|
||||||
+15
@@ -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<String> {
|
||||||
|
override fun create(parcel: Parcel) = TODO()
|
||||||
|
override fun String.write(parcel: Parcel, flags: Int) = TODO()
|
||||||
|
}
|
||||||
|
|
||||||
|
class Foo(@<caret>TypeParceler<String, StringParceler> val a: String)
|
||||||
+17
@@ -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<String> {
|
||||||
|
override fun create(parcel: Parcel) = TODO()
|
||||||
|
override fun String.write(parcel: Parcel, flags: Int) = TODO()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Parcelize
|
||||||
|
@TypeParceler<String, StringParceler>
|
||||||
|
class Foo(<caret>val a: String) : Parcelable
|
||||||
+17
@@ -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<String> {
|
||||||
|
override fun create(parcel: Parcel) = TODO()
|
||||||
|
override fun String.write(parcel: Parcel, flags: Int) = TODO()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Parcelize
|
||||||
|
@TypeParceler<String, StringParceler>
|
||||||
|
class Foo(@<caret>TypeParceler<String, StringParceler> val a: String) : Parcelable
|
||||||
+30
@@ -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")
|
@TestMetadata("plugins/android-extensions/android-extensions-idea/testData/android/parcel/quickfix/deleteIncompatible")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
@@ -191,4 +206,19 @@ public class ParcelQuickFixTestGenerated extends AbstractParcelQuickFixTest {
|
|||||||
doTestWithExtraFile(fileName);
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user