"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 { override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor {
return object : KtVisitorVoid() { return object : KtVisitorVoid() {
override fun visitDeclaration(dcl: KtDeclaration) { override fun visitDeclaration(dcl: KtDeclaration) {
if (dcl is KtParameter && dcl.typeReference != null && dcl.isSetterParameter) { val typeReference = (dcl as? KtParameter)?.takeIf { it.isSetterParameter }?.typeReference ?: return
holder.registerProblem(dcl, holder.registerProblem(typeReference,
"Redundant setter parameter type", "Redundant setter parameter type",
ProblemHighlightType.LIKE_UNUSED_SYMBOL, ProblemHighlightType.LIKE_UNUSED_SYMBOL,
IntentionWrapper(RemoveExplicitTypeIntention(), dcl.containingKtFile)) IntentionWrapper(RemoveExplicitTypeIntention(), dcl.containingKtFile))
}
} }
} }
} }
@@ -41,22 +41,23 @@ class RemoveExplicitTypeIntention : SelfTargetingRangeIntention<KtCallableDeclar
companion object { companion object {
fun getRange(element: KtCallableDeclaration): TextRange? { fun getRange(element: KtCallableDeclaration): TextRange? {
if (element.containingFile is KtCodeFragment) return null 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)) { if (element is KtParameter) {
return element.textRange if (element.isLoopParameter) return element.textRange
if (element.isSetterParameter) return typeReference.textRange
} }
val initializer = (element as? KtDeclarationWithInitializer)?.initializer val initializer = (element as? KtDeclarationWithInitializer)?.initializer
if (element !is KtProperty && element !is KtNamedFunction) return null if (element !is KtProperty && element !is KtNamedFunction) return null
(element as? KtNamedFunction)?.let { (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 { return when {
initializer != null -> TextRange(element.startOffset, initializer.startOffset - 1) initializer != null -> TextRange(element.startOffset, initializer.startOffset - 1)
element is KtProperty && element.getter != null -> TextRange(element.startOffset, element.typeReference!!.endOffset) element is KtProperty && element.getter != null -> TextRange(element.startOffset, typeReference.endOffset)
element is KtNamedFunction -> TextRange(element.startOffset, element.typeReference!!.endOffset) element is KtNamedFunction -> TextRange(element.startOffset, typeReference.endOffset)
else -> null 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); 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") @TestMetadata("onOverride.kt")
public void testOnOverride() throws Exception { public void testOnOverride() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/removeExplicitType/onOverride.kt"); String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/removeExplicitType/onOverride.kt");