Disable old Parcelable quickfixes if @Parcelize annotation is present
This commit is contained in:
committed by
Yan Zhulanow
parent
e6171dc4c5
commit
d9f99971bb
@@ -72,6 +72,10 @@ fun KtAnnotated.findAnnotation(annotationFqName: FqName): KtAnnotationEntry? {
|
||||
if (annotationEntries.isEmpty()) return null
|
||||
|
||||
val context = analyze(bodyResolveMode = BodyResolveMode.PARTIAL)
|
||||
val descriptor = context[BindingContext.DECLARATION_TO_DESCRIPTOR, this] ?: return null
|
||||
|
||||
// Make sure all annotations are resolved
|
||||
descriptor.annotations.toList()
|
||||
|
||||
return annotationEntries.firstOrNull { entry -> context.get(BindingContext.ANNOTATION, entry)?.fqName == annotationFqName }
|
||||
}
|
||||
|
||||
@@ -27,5 +27,6 @@
|
||||
<orderEntry type="library" scope="PROVIDED" name="dx-android" level="project" />
|
||||
<orderEntry type="module" module-name="idea-gradle" />
|
||||
<orderEntry type="module" module-name="android-extensions-compiler" />
|
||||
<orderEntry type="module" module-name="android-extensions-runtime" />
|
||||
</component>
|
||||
</module>
|
||||
@@ -20,6 +20,7 @@ import com.android.SdkConstants.CLASS_PARCEL
|
||||
import com.android.SdkConstants.CLASS_PARCELABLE
|
||||
import com.intellij.openapi.fileEditor.FileDocumentManager
|
||||
import com.intellij.psi.PsiDocumentManager
|
||||
import kotlinx.android.parcel.Parcelize
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.builtins.PrimitiveType
|
||||
import org.jetbrains.kotlin.descriptors.ParameterDescriptor
|
||||
@@ -30,6 +31,7 @@ import org.jetbrains.kotlin.idea.codeInsight.shorten.performDelayedRefactoringRe
|
||||
import org.jetbrains.kotlin.idea.intentions.getLeftMostReceiverExpression
|
||||
import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor
|
||||
import org.jetbrains.kotlin.idea.search.usagesSearch.propertyDescriptor
|
||||
import org.jetbrains.kotlin.idea.util.findAnnotation
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
@@ -57,6 +59,10 @@ private val WRITE_TO_PARCEL_WITH_SUPER_TEXT =
|
||||
private val DESCRIBE_CONTENTS_TEXT = "override fun describeContents(): Int {\nreturn 0\n}"
|
||||
private val CONSTRUCTOR_TEXT = "constructor($PARCEL_NAME: $CLASS_PARCEL)"
|
||||
|
||||
private val PARCELIZE_FQNAME = FqName(Parcelize::class.java.name)
|
||||
|
||||
//TODO add test
|
||||
fun KtClass.isParcelize() = findAnnotation(PARCELIZE_FQNAME) != null
|
||||
|
||||
fun KtClass.canAddParcelable(): Boolean =
|
||||
findParcelableSupertype() == null
|
||||
|
||||
+2
@@ -23,6 +23,7 @@ import org.jetbrains.android.util.AndroidBundle
|
||||
import org.jetbrains.kotlin.android.canAddParcelable
|
||||
import org.jetbrains.kotlin.android.implementParcelable
|
||||
import org.jetbrains.kotlin.android.insideBody
|
||||
import org.jetbrains.kotlin.android.isParcelize
|
||||
import org.jetbrains.kotlin.idea.intentions.SelfTargetingIntention
|
||||
import org.jetbrains.kotlin.psi.KtClass
|
||||
|
||||
@@ -33,6 +34,7 @@ class ImplementParcelableAction :
|
||||
override fun isApplicableTo(element: KtClass, caretOffset: Int): Boolean =
|
||||
AndroidFacet.getInstance(element) != null &&
|
||||
!element.insideBody(caretOffset) &&
|
||||
!element.isParcelize() &&
|
||||
element.canAddParcelable()
|
||||
|
||||
override fun applyTo(element: KtClass, editor: Editor?) {
|
||||
|
||||
@@ -22,6 +22,7 @@ import org.jetbrains.android.facet.AndroidFacet
|
||||
import org.jetbrains.android.util.AndroidBundle
|
||||
import org.jetbrains.kotlin.android.canRedoParcelable
|
||||
import org.jetbrains.kotlin.android.insideBody
|
||||
import org.jetbrains.kotlin.android.isParcelize
|
||||
import org.jetbrains.kotlin.android.reimplementParcelable
|
||||
import org.jetbrains.kotlin.idea.intentions.SelfTargetingIntention
|
||||
import org.jetbrains.kotlin.psi.KtClass
|
||||
@@ -33,6 +34,7 @@ class RedoParcelableAction :
|
||||
override fun isApplicableTo(element: KtClass, caretOffset: Int): Boolean =
|
||||
AndroidFacet.getInstance(element) != null &&
|
||||
!element.insideBody(caretOffset) &&
|
||||
!element.isParcelize() &&
|
||||
element.canRedoParcelable()
|
||||
|
||||
override fun applyTo(element: KtClass, editor: Editor?) {
|
||||
|
||||
@@ -22,6 +22,7 @@ import org.jetbrains.android.facet.AndroidFacet
|
||||
import org.jetbrains.android.util.AndroidBundle
|
||||
import org.jetbrains.kotlin.android.canRemoveParcelable
|
||||
import org.jetbrains.kotlin.android.insideBody
|
||||
import org.jetbrains.kotlin.android.isParcelize
|
||||
import org.jetbrains.kotlin.android.removeParcelableImplementation
|
||||
import org.jetbrains.kotlin.idea.intentions.SelfTargetingIntention
|
||||
import org.jetbrains.kotlin.psi.KtClass
|
||||
@@ -33,6 +34,7 @@ class RemoveParcelableAction :
|
||||
override fun isApplicableTo(element: KtClass, caretOffset: Int): Boolean =
|
||||
AndroidFacet.getInstance(element) != null &&
|
||||
!element.insideBody(caretOffset) &&
|
||||
!element.isParcelize() &&
|
||||
element.canRemoveParcelable()
|
||||
|
||||
override fun applyTo(element: KtClass, editor: Editor?) {
|
||||
|
||||
+3
@@ -38,6 +38,8 @@ abstract class AbstractAndroidIntentionTest : KotlinAndroidTestCase() {
|
||||
val checkManifest = InTextDirectivesUtils.isDirectiveDefined(testFileText, "// CHECK_MANIFEST")
|
||||
|
||||
try {
|
||||
ConfigLibraryUtil.addLibrary(myModule, "androidExtensionsRuntime",
|
||||
"dist/kotlinc/lib", arrayOf("android-extensions-runtime.jar"))
|
||||
if (withRuntime) {
|
||||
ConfigLibraryUtil.configureKotlinRuntime(myFixture.module)
|
||||
}
|
||||
@@ -74,6 +76,7 @@ abstract class AbstractAndroidIntentionTest : KotlinAndroidTestCase() {
|
||||
}
|
||||
}
|
||||
finally {
|
||||
ConfigLibraryUtil.removeLibrary(myModule, "androidExtensionsRuntime")
|
||||
if (withRuntime) {
|
||||
ConfigLibraryUtil.unConfigureKotlinRuntime(myFixture.module)
|
||||
}
|
||||
|
||||
+12
@@ -356,6 +356,12 @@ public class AndroidIntentionTestGenerated extends AbstractAndroidIntentionTest
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("parcelize.kt")
|
||||
public void testParcelize() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/android/intention/redoParcelable/parcelize.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("simple.kt")
|
||||
public void testSimple() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/android/intention/redoParcelable/simple.kt");
|
||||
@@ -395,6 +401,12 @@ public class AndroidIntentionTestGenerated extends AbstractAndroidIntentionTest
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("parcelize.kt")
|
||||
public void testParcelize() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/android/intention/removeParcelable/parcelize.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("simple.kt")
|
||||
public void testSimple() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/android/intention/removeParcelable/simple.kt");
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
// INTENTION_CLASS: org.jetbrains.kotlin.android.intention.RedoParcelableAction
|
||||
// NOT_AVAILABLE
|
||||
|
||||
import android.os.Parcelable
|
||||
import kotlinx.android.parcel.Parcelize
|
||||
|
||||
@Parcelize
|
||||
class <caret>Simple(val a: String) : Parcelable
|
||||
@@ -0,0 +1,8 @@
|
||||
// INTENTION_CLASS: org.jetbrains.kotlin.android.intention.RemoveParcelableAction
|
||||
// NOT_AVAILABLE
|
||||
|
||||
import android.os.Parcelable
|
||||
import kotlinx.android.parcel.Parcelize
|
||||
|
||||
@Parcelize
|
||||
class <caret>Simple(val a: String) : Parcelable
|
||||
Reference in New Issue
Block a user