"Redundant setter parameter type" range includes whole parameter declaration #KT-19648 Fixed (#1267)

This commit is contained in:
Toshiaki Kameyama
2017-08-29 00:06:10 +09:00
committed by Dmitry Jemerov
parent e3b7f6d698
commit 367b9f6664
4 changed files with 23 additions and 12 deletions
@@ -30,12 +30,11 @@ class RemoveSetterParameterTypeInspection : AbstractKotlinInspection() {
override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor {
return object : KtVisitorVoid() {
override fun visitDeclaration(dcl: KtDeclaration) {
if (dcl is KtParameter && dcl.typeReference != null && dcl.isSetterParameter) {
holder.registerProblem(dcl,
"Redundant setter parameter type",
ProblemHighlightType.LIKE_UNUSED_SYMBOL,
IntentionWrapper(RemoveExplicitTypeIntention(), dcl.containingKtFile))
}
val typeReference = (dcl as? KtParameter)?.takeIf { it.isSetterParameter }?.typeReference ?: return
holder.registerProblem(typeReference,
"Redundant setter parameter type",
ProblemHighlightType.LIKE_UNUSED_SYMBOL,
IntentionWrapper(RemoveExplicitTypeIntention(), dcl.containingKtFile))
}
}
}
@@ -41,22 +41,23 @@ class RemoveExplicitTypeIntention : SelfTargetingRangeIntention<KtCallableDeclar
companion object {
fun getRange(element: KtCallableDeclaration): TextRange? {
if (element.containingFile is KtCodeFragment) return null
if (element.typeReference == null) return null
val typeReference = element.typeReference ?: return null
if (element is KtParameter && (element.isLoopParameter || element.isSetterParameter)) {
return element.textRange
if (element is KtParameter) {
if (element.isLoopParameter) return element.textRange
if (element.isSetterParameter) return typeReference.textRange
}
val initializer = (element as? KtDeclarationWithInitializer)?.initializer
if (element !is KtProperty && element !is KtNamedFunction) return null
(element as? KtNamedFunction)?.let {
if (it.hasBlockBody() && (element.descriptor as? FunctionDescriptor)?.returnType?.isUnit()?.not() ?: true) return null
if (it.hasBlockBody() && (element.descriptor as? FunctionDescriptor)?.returnType?.isUnit()?.not() != false) return null
}
return when {
initializer != null -> TextRange(element.startOffset, initializer.startOffset - 1)
element is KtProperty && element.getter != null -> TextRange(element.startOffset, element.typeReference!!.endOffset)
element is KtNamedFunction -> TextRange(element.startOffset, element.typeReference!!.endOffset)
element is KtProperty && element.getter != null -> TextRange(element.startOffset, typeReference.endOffset)
element is KtNamedFunction -> TextRange(element.startOffset, typeReference.endOffset)
else -> null
}
}
@@ -0,0 +1,5 @@
// IS_APPLICABLE: false
var x: String = " "
set(<caret>param: String) {
field = "$param "
}
@@ -12701,6 +12701,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
doTest(fileName);
}
@TestMetadata("notOnSetterParameter.kt")
public void testNotOnSetterParameter() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/removeExplicitType/notOnSetterParameter.kt");
doTest(fileName);
}
@TestMetadata("onOverride.kt")
public void testOnOverride() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/removeExplicitType/onOverride.kt");