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
|
if (annotationEntries.isEmpty()) return null
|
||||||
|
|
||||||
val context = analyze(bodyResolveMode = BodyResolveMode.PARTIAL)
|
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 }
|
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="library" scope="PROVIDED" name="dx-android" level="project" />
|
||||||
<orderEntry type="module" module-name="idea-gradle" />
|
<orderEntry type="module" module-name="idea-gradle" />
|
||||||
<orderEntry type="module" module-name="android-extensions-compiler" />
|
<orderEntry type="module" module-name="android-extensions-compiler" />
|
||||||
|
<orderEntry type="module" module-name="android-extensions-runtime" />
|
||||||
</component>
|
</component>
|
||||||
</module>
|
</module>
|
||||||
@@ -20,6 +20,7 @@ import com.android.SdkConstants.CLASS_PARCEL
|
|||||||
import com.android.SdkConstants.CLASS_PARCELABLE
|
import com.android.SdkConstants.CLASS_PARCELABLE
|
||||||
import com.intellij.openapi.fileEditor.FileDocumentManager
|
import com.intellij.openapi.fileEditor.FileDocumentManager
|
||||||
import com.intellij.psi.PsiDocumentManager
|
import com.intellij.psi.PsiDocumentManager
|
||||||
|
import kotlinx.android.parcel.Parcelize
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.builtins.PrimitiveType
|
import org.jetbrains.kotlin.builtins.PrimitiveType
|
||||||
import org.jetbrains.kotlin.descriptors.ParameterDescriptor
|
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.intentions.getLeftMostReceiverExpression
|
||||||
import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor
|
import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor
|
||||||
import org.jetbrains.kotlin.idea.search.usagesSearch.propertyDescriptor
|
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.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.psi.*
|
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 DESCRIBE_CONTENTS_TEXT = "override fun describeContents(): Int {\nreturn 0\n}"
|
||||||
private val CONSTRUCTOR_TEXT = "constructor($PARCEL_NAME: $CLASS_PARCEL)"
|
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 =
|
fun KtClass.canAddParcelable(): Boolean =
|
||||||
findParcelableSupertype() == null
|
findParcelableSupertype() == null
|
||||||
|
|||||||
+2
@@ -23,6 +23,7 @@ import org.jetbrains.android.util.AndroidBundle
|
|||||||
import org.jetbrains.kotlin.android.canAddParcelable
|
import org.jetbrains.kotlin.android.canAddParcelable
|
||||||
import org.jetbrains.kotlin.android.implementParcelable
|
import org.jetbrains.kotlin.android.implementParcelable
|
||||||
import org.jetbrains.kotlin.android.insideBody
|
import org.jetbrains.kotlin.android.insideBody
|
||||||
|
import org.jetbrains.kotlin.android.isParcelize
|
||||||
import org.jetbrains.kotlin.idea.intentions.SelfTargetingIntention
|
import org.jetbrains.kotlin.idea.intentions.SelfTargetingIntention
|
||||||
import org.jetbrains.kotlin.psi.KtClass
|
import org.jetbrains.kotlin.psi.KtClass
|
||||||
|
|
||||||
@@ -33,6 +34,7 @@ class ImplementParcelableAction :
|
|||||||
override fun isApplicableTo(element: KtClass, caretOffset: Int): Boolean =
|
override fun isApplicableTo(element: KtClass, caretOffset: Int): Boolean =
|
||||||
AndroidFacet.getInstance(element) != null &&
|
AndroidFacet.getInstance(element) != null &&
|
||||||
!element.insideBody(caretOffset) &&
|
!element.insideBody(caretOffset) &&
|
||||||
|
!element.isParcelize() &&
|
||||||
element.canAddParcelable()
|
element.canAddParcelable()
|
||||||
|
|
||||||
override fun applyTo(element: KtClass, editor: Editor?) {
|
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.android.util.AndroidBundle
|
||||||
import org.jetbrains.kotlin.android.canRedoParcelable
|
import org.jetbrains.kotlin.android.canRedoParcelable
|
||||||
import org.jetbrains.kotlin.android.insideBody
|
import org.jetbrains.kotlin.android.insideBody
|
||||||
|
import org.jetbrains.kotlin.android.isParcelize
|
||||||
import org.jetbrains.kotlin.android.reimplementParcelable
|
import org.jetbrains.kotlin.android.reimplementParcelable
|
||||||
import org.jetbrains.kotlin.idea.intentions.SelfTargetingIntention
|
import org.jetbrains.kotlin.idea.intentions.SelfTargetingIntention
|
||||||
import org.jetbrains.kotlin.psi.KtClass
|
import org.jetbrains.kotlin.psi.KtClass
|
||||||
@@ -33,6 +34,7 @@ class RedoParcelableAction :
|
|||||||
override fun isApplicableTo(element: KtClass, caretOffset: Int): Boolean =
|
override fun isApplicableTo(element: KtClass, caretOffset: Int): Boolean =
|
||||||
AndroidFacet.getInstance(element) != null &&
|
AndroidFacet.getInstance(element) != null &&
|
||||||
!element.insideBody(caretOffset) &&
|
!element.insideBody(caretOffset) &&
|
||||||
|
!element.isParcelize() &&
|
||||||
element.canRedoParcelable()
|
element.canRedoParcelable()
|
||||||
|
|
||||||
override fun applyTo(element: KtClass, editor: Editor?) {
|
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.android.util.AndroidBundle
|
||||||
import org.jetbrains.kotlin.android.canRemoveParcelable
|
import org.jetbrains.kotlin.android.canRemoveParcelable
|
||||||
import org.jetbrains.kotlin.android.insideBody
|
import org.jetbrains.kotlin.android.insideBody
|
||||||
|
import org.jetbrains.kotlin.android.isParcelize
|
||||||
import org.jetbrains.kotlin.android.removeParcelableImplementation
|
import org.jetbrains.kotlin.android.removeParcelableImplementation
|
||||||
import org.jetbrains.kotlin.idea.intentions.SelfTargetingIntention
|
import org.jetbrains.kotlin.idea.intentions.SelfTargetingIntention
|
||||||
import org.jetbrains.kotlin.psi.KtClass
|
import org.jetbrains.kotlin.psi.KtClass
|
||||||
@@ -33,6 +34,7 @@ class RemoveParcelableAction :
|
|||||||
override fun isApplicableTo(element: KtClass, caretOffset: Int): Boolean =
|
override fun isApplicableTo(element: KtClass, caretOffset: Int): Boolean =
|
||||||
AndroidFacet.getInstance(element) != null &&
|
AndroidFacet.getInstance(element) != null &&
|
||||||
!element.insideBody(caretOffset) &&
|
!element.insideBody(caretOffset) &&
|
||||||
|
!element.isParcelize() &&
|
||||||
element.canRemoveParcelable()
|
element.canRemoveParcelable()
|
||||||
|
|
||||||
override fun applyTo(element: KtClass, editor: Editor?) {
|
override fun applyTo(element: KtClass, editor: Editor?) {
|
||||||
|
|||||||
+3
@@ -38,6 +38,8 @@ abstract class AbstractAndroidIntentionTest : KotlinAndroidTestCase() {
|
|||||||
val checkManifest = InTextDirectivesUtils.isDirectiveDefined(testFileText, "// CHECK_MANIFEST")
|
val checkManifest = InTextDirectivesUtils.isDirectiveDefined(testFileText, "// CHECK_MANIFEST")
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
ConfigLibraryUtil.addLibrary(myModule, "androidExtensionsRuntime",
|
||||||
|
"dist/kotlinc/lib", arrayOf("android-extensions-runtime.jar"))
|
||||||
if (withRuntime) {
|
if (withRuntime) {
|
||||||
ConfigLibraryUtil.configureKotlinRuntime(myFixture.module)
|
ConfigLibraryUtil.configureKotlinRuntime(myFixture.module)
|
||||||
}
|
}
|
||||||
@@ -74,6 +76,7 @@ abstract class AbstractAndroidIntentionTest : KotlinAndroidTestCase() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
|
ConfigLibraryUtil.removeLibrary(myModule, "androidExtensionsRuntime")
|
||||||
if (withRuntime) {
|
if (withRuntime) {
|
||||||
ConfigLibraryUtil.unConfigureKotlinRuntime(myFixture.module)
|
ConfigLibraryUtil.unConfigureKotlinRuntime(myFixture.module)
|
||||||
}
|
}
|
||||||
|
|||||||
+12
@@ -356,6 +356,12 @@ public class AndroidIntentionTestGenerated extends AbstractAndroidIntentionTest
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("simple.kt")
|
||||||
public void testSimple() throws Exception {
|
public void testSimple() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/android/intention/redoParcelable/simple.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/android/intention/redoParcelable/simple.kt");
|
||||||
@@ -395,6 +401,12 @@ public class AndroidIntentionTestGenerated extends AbstractAndroidIntentionTest
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("simple.kt")
|
||||||
public void testSimple() throws Exception {
|
public void testSimple() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/android/intention/removeParcelable/simple.kt");
|
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