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.PsiWhiteSpace
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.lexer.KtTokens.*
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.siblings
@@ -61,6 +62,15 @@ internal fun addModifier(modifierList: KtModifierList, modifier: KtModifierKeywo
?.mapNotNull { modifierList.getModifier(it) }
?.firstOrNull()
if (modifier == FINAL_KEYWORD && !modifierList.hasModifier(OVERRIDE_KEYWORD)) {
if (modifierToReplace != null) {
modifierToReplace.delete()
if (modifierList.firstChild == null) {
modifierList.delete()
}
}
return
}
if (modifierToReplace != null) {
modifierToReplace.replace(newModifier)
}
@@ -99,9 +109,10 @@ fun removeModifier(owner: KtModifierListOwner, modifier: KtModifierKeywordToken)
}
private val MODIFIERS_TO_REPLACE = mapOf(
ABSTRACT_KEYWORD to listOf(OPEN_KEYWORD, FINAL_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),
PROTECTED_KEYWORD to listOf(PUBLIC_KEYWORD, PRIVATE_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.lexer.KtModifierKeywordToken
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.resolve.BindingContext
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
@@ -40,7 +40,7 @@ open class AddModifierFix(
) : KotlinQuickFixAction<KtModifierListOwner>(element) {
override fun getText(): String {
if (modifier == ABSTRACT_KEYWORD || modifier == KtTokens.OPEN_KEYWORD) {
if (modifier in modalityModifiers) {
return "Make ${getElementName(element)} ${modifier.value}"
}
return "Add '${modifier.value}' modifier"
@@ -57,6 +57,8 @@ open class AddModifierFix(
}
companion object {
private val modalityModifiers = setOf(ABSTRACT_KEYWORD, OPEN_KEYWORD, FINAL_KEYWORD)
fun getElementName(modifierListOwner: KtModifierListOwner): String {
var name: String? = null
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.psi.KtClass
import org.jetbrains.kotlin.psi.KtProperty
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.POSITIONED_VALUE_ARGUMENT_FOR_JAVA_ANNOTATION
@@ -118,7 +119,8 @@ class QuickFixRegistrar : QuickFixContributor {
GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY.registerFactory(removeModifierFactory)
SETTER_VISIBILITY_INCONSISTENT_WITH_PROPERTY_VISIBILITY.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)
WRONG_MODIFIER_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);
}
@TestMetadata("openVarWithPrivateSetter.kt")
public void testOpenVarWithPrivateSetter() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/openVarWithPrivateSetter.kt");
doTest(fileName);
}
@TestMetadata("operatorModifier.kt")
public void testOperatorModifier() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/operatorModifier.kt");
@@ -5196,6 +5202,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
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")
public void testPackageMemberCannotBeProtected() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/packageMemberCannotBeProtected.kt");