Quick fix to make var with private setter final #KT-10859 Fixed

This commit is contained in:
Mikhail Glukhikh
2016-03-14 17:05:42 +03:00
parent efdf6b9569
commit bace881463
8 changed files with 60 additions and 5 deletions
@@ -20,6 +20,7 @@ import com.intellij.psi.PsiComment
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.PsiWhiteSpace import com.intellij.psi.PsiWhiteSpace
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.lexer.KtTokens.* import org.jetbrains.kotlin.lexer.KtTokens.*
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.siblings import org.jetbrains.kotlin.psi.psiUtil.siblings
@@ -61,6 +62,15 @@ internal fun addModifier(modifierList: KtModifierList, modifier: KtModifierKeywo
?.mapNotNull { modifierList.getModifier(it) } ?.mapNotNull { modifierList.getModifier(it) }
?.firstOrNull() ?.firstOrNull()
if (modifier == FINAL_KEYWORD && !modifierList.hasModifier(OVERRIDE_KEYWORD)) {
if (modifierToReplace != null) {
modifierToReplace.delete()
if (modifierList.firstChild == null) {
modifierList.delete()
}
}
return
}
if (modifierToReplace != null) { if (modifierToReplace != null) {
modifierToReplace.replace(newModifier) modifierToReplace.replace(newModifier)
} }
@@ -99,9 +109,10 @@ fun removeModifier(owner: KtModifierListOwner, modifier: KtModifierKeywordToken)
} }
private val MODIFIERS_TO_REPLACE = mapOf( private val MODIFIERS_TO_REPLACE = mapOf(
ABSTRACT_KEYWORD to listOf(OPEN_KEYWORD, FINAL_KEYWORD),
OVERRIDE_KEYWORD to listOf(OPEN_KEYWORD), OVERRIDE_KEYWORD to listOf(OPEN_KEYWORD),
OPEN_KEYWORD to listOf(FINAL_KEYWORD), ABSTRACT_KEYWORD to listOf(OPEN_KEYWORD, FINAL_KEYWORD),
OPEN_KEYWORD to listOf(FINAL_KEYWORD, ABSTRACT_KEYWORD),
FINAL_KEYWORD to listOf(ABSTRACT_KEYWORD, OPEN_KEYWORD),
PUBLIC_KEYWORD to listOf(PROTECTED_KEYWORD, PRIVATE_KEYWORD, INTERNAL_KEYWORD), PUBLIC_KEYWORD to listOf(PROTECTED_KEYWORD, PRIVATE_KEYWORD, INTERNAL_KEYWORD),
PROTECTED_KEYWORD to listOf(PUBLIC_KEYWORD, PRIVATE_KEYWORD, INTERNAL_KEYWORD), PROTECTED_KEYWORD to listOf(PUBLIC_KEYWORD, PRIVATE_KEYWORD, INTERNAL_KEYWORD),
PRIVATE_KEYWORD to listOf(PUBLIC_KEYWORD, PROTECTED_KEYWORD, INTERNAL_KEYWORD), PRIVATE_KEYWORD to listOf(PUBLIC_KEYWORD, PROTECTED_KEYWORD, INTERNAL_KEYWORD),
@@ -28,7 +28,7 @@ import org.jetbrains.kotlin.idea.core.quickfix.QuickFixUtil
import org.jetbrains.kotlin.idea.refactoring.canRefactor import org.jetbrains.kotlin.idea.refactoring.canRefactor
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.lexer.KtTokens.ABSTRACT_KEYWORD import org.jetbrains.kotlin.lexer.KtTokens.*
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
@@ -40,7 +40,7 @@ open class AddModifierFix(
) : KotlinQuickFixAction<KtModifierListOwner>(element) { ) : KotlinQuickFixAction<KtModifierListOwner>(element) {
override fun getText(): String { override fun getText(): String {
if (modifier == ABSTRACT_KEYWORD || modifier == KtTokens.OPEN_KEYWORD) { if (modifier in modalityModifiers) {
return "Make ${getElementName(element)} ${modifier.value}" return "Make ${getElementName(element)} ${modifier.value}"
} }
return "Add '${modifier.value}' modifier" return "Add '${modifier.value}' modifier"
@@ -57,6 +57,8 @@ open class AddModifierFix(
} }
companion object { companion object {
private val modalityModifiers = setOf(ABSTRACT_KEYWORD, OPEN_KEYWORD, FINAL_KEYWORD)
fun getElementName(modifierListOwner: KtModifierListOwner): String { fun getElementName(modifierListOwner: KtModifierListOwner): String {
var name: String? = null var name: String? = null
if (modifierListOwner is PsiNameIdentifierOwner) { if (modifierListOwner is PsiNameIdentifierOwner) {
@@ -40,6 +40,7 @@ import org.jetbrains.kotlin.idea.quickfix.replaceWith.DeprecatedSymbolUsageInWho
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.lexer.KtTokens.* import org.jetbrains.kotlin.lexer.KtTokens.*
import org.jetbrains.kotlin.psi.KtClass import org.jetbrains.kotlin.psi.KtClass
import org.jetbrains.kotlin.psi.KtProperty
import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm
import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm.NO_REFLECTION_IN_CLASS_PATH import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm.NO_REFLECTION_IN_CLASS_PATH
import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm.POSITIONED_VALUE_ARGUMENT_FOR_JAVA_ANNOTATION import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm.POSITIONED_VALUE_ARGUMENT_FOR_JAVA_ANNOTATION
@@ -118,7 +119,8 @@ class QuickFixRegistrar : QuickFixContributor {
GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY.registerFactory(removeModifierFactory) GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY.registerFactory(removeModifierFactory)
SETTER_VISIBILITY_INCONSISTENT_WITH_PROPERTY_VISIBILITY.registerFactory(removeModifierFactory) SETTER_VISIBILITY_INCONSISTENT_WITH_PROPERTY_VISIBILITY.registerFactory(removeModifierFactory)
PRIVATE_SETTER_FOR_ABSTRACT_PROPERTY.registerFactory(removeModifierFactory) PRIVATE_SETTER_FOR_ABSTRACT_PROPERTY.registerFactory(removeModifierFactory)
PRIVATE_SETTER_FOR_OPEN_PROPERTY.registerFactory(removeModifierFactory) PRIVATE_SETTER_FOR_OPEN_PROPERTY.registerFactory(AddModifierFix.createFactory(FINAL_KEYWORD, KtProperty::class.java),
removeModifierFactory)
REDUNDANT_MODIFIER_IN_GETTER.registerFactory(removeRedundantModifierFactory) REDUNDANT_MODIFIER_IN_GETTER.registerFactory(removeRedundantModifierFactory)
WRONG_MODIFIER_TARGET.registerFactory(removeModifierFactory) WRONG_MODIFIER_TARGET.registerFactory(removeModifierFactory)
REDUNDANT_MODIFIER_FOR_TARGET.registerFactory(removeModifierFactory) REDUNDANT_MODIFIER_FOR_TARGET.registerFactory(removeModifierFactory)
@@ -0,0 +1,5 @@
// "Make 'foo' final" "true"
open class My {
open var foo = 42
<caret>private set
}
@@ -0,0 +1,5 @@
// "Make 'foo' final" "true"
open class My {
var foo = 42
<caret>private set
}
@@ -0,0 +1,9 @@
// "Make 'bar' final" "true"
interface Foo {
val bar: String
}
open class FooImpl : Foo {
override var bar: String = ""
<caret>private set
}
@@ -0,0 +1,9 @@
// "Make 'bar' final" "true"
interface Foo {
val bar: String
}
open class FooImpl : Foo {
final override var bar: String = ""
<caret>private set
}
@@ -5166,6 +5166,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
doTest(fileName); doTest(fileName);
} }
@TestMetadata("openVarWithPrivateSetter.kt")
public void testOpenVarWithPrivateSetter() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/openVarWithPrivateSetter.kt");
doTest(fileName);
}
@TestMetadata("operatorModifier.kt") @TestMetadata("operatorModifier.kt")
public void testOperatorModifier() throws Exception { public void testOperatorModifier() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/operatorModifier.kt"); String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/operatorModifier.kt");
@@ -5196,6 +5202,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
doTest(fileName); doTest(fileName);
} }
@TestMetadata("overrideWithPrivateSetter.kt")
public void testOverrideWithPrivateSetter() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/overrideWithPrivateSetter.kt");
doTest(fileName);
}
@TestMetadata("packageMemberCannotBeProtected.kt") @TestMetadata("packageMemberCannotBeProtected.kt")
public void testPackageMemberCannotBeProtected() throws Exception { public void testPackageMemberCannotBeProtected() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/packageMemberCannotBeProtected.kt"); String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/packageMemberCannotBeProtected.kt");