diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddConstModifierFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddConstModifierFix.kt index 207a37f0abf..562c1b993e4 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddConstModifierFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddConstModifierFix.kt @@ -31,7 +31,10 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.intentions.SelfTargetingIntention import org.jetbrains.kotlin.idea.search.allScope import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor +import org.jetbrains.kotlin.idea.util.findAnnotation import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.psi.KtAnnotationEntry import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtReferenceExpression @@ -47,9 +50,12 @@ class AddConstModifierFix(val property: KtProperty) : AddModifierFix(property, K } companion object { + private val removeAnnotations = listOf(FqName("kotlin.jvm.JvmStatic"), FqName("kotlin.jvm.JvmField")) + fun addConstModifier(property: KtProperty) { replaceReferencesToGetterByReferenceToField(property) property.addModifier(KtTokens.CONST_KEYWORD) + removeAnnotations.mapNotNull { property.findAnnotation(it) }.forEach(KtAnnotationEntry::delete) } } } @@ -66,7 +72,8 @@ class AddConstModifierIntention : SelfTargetingIntention(KtProperty: companion object { fun isApplicableTo(element: KtProperty): Boolean { if (element.isLocal || element.isVar || element.hasDelegate() || element.initializer == null - || element.getter?.hasBody() == true || element.receiverTypeReference != null) { + || element.getter?.hasBody() == true || element.receiverTypeReference != null + || element.hasModifier(KtTokens.CONST_KEYWORD) || element.hasModifier(KtTokens.OVERRIDE_KEYWORD)) { return false } val propertyDescriptor = element.descriptor as? VariableDescriptor ?: return false diff --git a/idea/testData/intentions/addConstModifier/inapplicableToConst.kt b/idea/testData/intentions/addConstModifier/inapplicableToConst.kt new file mode 100644 index 00000000000..443e5ed4ab9 --- /dev/null +++ b/idea/testData/intentions/addConstModifier/inapplicableToConst.kt @@ -0,0 +1,3 @@ +// IS_APPLICABLE: FALSE + +const val a = "" \ No newline at end of file diff --git a/idea/testData/intentions/addConstModifier/inapplicableToOverride.kt b/idea/testData/intentions/addConstModifier/inapplicableToOverride.kt new file mode 100644 index 00000000000..7c431be6baa --- /dev/null +++ b/idea/testData/intentions/addConstModifier/inapplicableToOverride.kt @@ -0,0 +1,8 @@ +// IS_APPLICABLE: FALSE + +interface I { + val a: String +} +object O: I { + override val a = "" +} \ No newline at end of file diff --git a/idea/testData/intentions/addConstModifier/removeJvmField.kt b/idea/testData/intentions/addConstModifier/removeJvmField.kt new file mode 100644 index 00000000000..f0416274c2f --- /dev/null +++ b/idea/testData/intentions/addConstModifier/removeJvmField.kt @@ -0,0 +1,5 @@ +// WITH_RUNTIME + +object O { + @JvmField val a = 1 +} \ No newline at end of file diff --git a/idea/testData/intentions/addConstModifier/removeJvmField.kt.after b/idea/testData/intentions/addConstModifier/removeJvmField.kt.after new file mode 100644 index 00000000000..1303b85d1d4 --- /dev/null +++ b/idea/testData/intentions/addConstModifier/removeJvmField.kt.after @@ -0,0 +1,5 @@ +// WITH_RUNTIME + +object O { + const val a = 1 +} \ No newline at end of file diff --git a/idea/testData/intentions/addConstModifier/removeJvmStatic.kt b/idea/testData/intentions/addConstModifier/removeJvmStatic.kt new file mode 100644 index 00000000000..efd55cbf578 --- /dev/null +++ b/idea/testData/intentions/addConstModifier/removeJvmStatic.kt @@ -0,0 +1,5 @@ +// WITH_RUNTIME + +object O { + @JvmStatic val a = 1 +} \ No newline at end of file diff --git a/idea/testData/intentions/addConstModifier/removeJvmStatic.kt.after b/idea/testData/intentions/addConstModifier/removeJvmStatic.kt.after new file mode 100644 index 00000000000..1303b85d1d4 --- /dev/null +++ b/idea/testData/intentions/addConstModifier/removeJvmStatic.kt.after @@ -0,0 +1,5 @@ +// WITH_RUNTIME + +object O { + const val a = 1 +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index b4ceca375de..caf10829f9a 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -106,6 +106,30 @@ public class IntentionTestGenerated extends AbstractIntentionTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/intentions/addConstModifier"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), true); } + @TestMetadata("inapplicableToConst.kt") + public void testInapplicableToConst() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/addConstModifier/inapplicableToConst.kt"); + doTest(fileName); + } + + @TestMetadata("inapplicableToOverride.kt") + public void testInapplicableToOverride() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/addConstModifier/inapplicableToOverride.kt"); + doTest(fileName); + } + + @TestMetadata("removeJvmField.kt") + public void testRemoveJvmField() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/addConstModifier/removeJvmField.kt"); + doTest(fileName); + } + + @TestMetadata("removeJvmStatic.kt") + public void testRemoveJvmStatic() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/addConstModifier/removeJvmStatic.kt"); + doTest(fileName); + } + @TestMetadata("simple.kt") public void testSimple() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/addConstModifier/simple.kt");