diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/CanBeParameterInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/CanBeParameterInspection.kt index 9510beea01c..091877fbd60 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/CanBeParameterInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/CanBeParameterInspection.kt @@ -33,11 +33,17 @@ import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.kotlin.idea.quickfix.RemoveValVarFromParameterFix import org.jetbrains.kotlin.idea.references.KtSimpleNameReference import org.jetbrains.kotlin.idea.search.usagesSearch.getAccessorNames -import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.lexer.KtTokens.* import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType +private val CONSTRUCTOR_VAL_VAR_MODIFIERS = listOf( + OPEN_KEYWORD, FINAL_KEYWORD, + PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD, PRIVATE_KEYWORD, + LATEINIT_KEYWORD +) + class CanBeParameterInspection : AbstractKotlinInspection() { private fun PsiReference.usedAsPropertyIn(klass: KtClass): Boolean { if (this !is KtSimpleNameReference) return true @@ -75,7 +81,7 @@ class CanBeParameterInspection : AbstractKotlinInspection() { // Applicable to val / var parameters of a class / object primary constructors val valOrVar = parameter.valOrVarKeyword ?: return val name = parameter.name ?: return - if (parameter.hasModifier(KtTokens.OVERRIDE_KEYWORD)) return + if (parameter.hasModifier(OVERRIDE_KEYWORD)) return if (parameter.annotationEntries.isNotEmpty()) return val constructor = parameter.parent.parent as? KtPrimaryConstructor ?: return val klass = constructor.getContainingClassOrObject() as? KtClass ?: return @@ -119,8 +125,13 @@ class CanBeParameterInspection : AbstractKotlinInspection() { override fun applyFix(project: Project, descriptor: ProblemDescriptor) { parameter.valOrVarKeyword?.delete() - // Delete visibility / modality, if any - parameter.modifierList?.delete() + // Delete visibility / open / final / lateinit, if any + // Retain annotations / vararg + // override should never be here + val modifierList = parameter.modifierList ?: return + for (modifier in CONSTRUCTOR_VAL_VAR_MODIFIERS) { + modifierList.getModifier(modifier)?.delete() + } } } } diff --git a/idea/testData/quickfix/canBeParameter/usedVarArg.kt b/idea/testData/quickfix/canBeParameter/usedVarArg.kt new file mode 100644 index 00000000000..72230964f5a --- /dev/null +++ b/idea/testData/quickfix/canBeParameter/usedVarArg.kt @@ -0,0 +1,5 @@ +// "Remove 'val' from parameter" "true" + +class Wrapper(vararg val x: Int) { + val y = x +} diff --git a/idea/testData/quickfix/canBeParameter/usedVarArg.kt.after b/idea/testData/quickfix/canBeParameter/usedVarArg.kt.after new file mode 100644 index 00000000000..7f0ba2385c4 --- /dev/null +++ b/idea/testData/quickfix/canBeParameter/usedVarArg.kt.after @@ -0,0 +1,5 @@ +// "Remove 'val' from parameter" "true" + +class Wrapper(vararg x: Int) { + val y = x +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 0814ce00e7e..ee0cd46eb98 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -714,6 +714,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/canBeParameter/usedPrivateInInitializer.kt"); doTest(fileName); } + + @TestMetadata("usedVarArg.kt") + public void testUsedVarArg() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/canBeParameter/usedVarArg.kt"); + doTest(fileName); + } } @TestMetadata("idea/testData/quickfix/canBePrimaryConstructorProperty")