Quick fix to make var with private setter final #KT-10859 Fixed
This commit is contained in:
@@ -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");
|
||||||
|
|||||||
Reference in New Issue
Block a user