Convert lambda to reference: range reduced to a call itself #KT-13661 Fixed

(cherry picked from commit f7b5d34)
This commit is contained in:
Mikhail Glukhikh
2016-08-31 13:11:21 +03:00
committed by Mikhail Glukhikh
parent a6e3aac7ca
commit ec41289664
3 changed files with 25 additions and 2 deletions
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.idea.intentions
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.util.TextRange
import org.jetbrains.kotlin.builtins.getReturnTypeFromFunctionType
import org.jetbrains.kotlin.builtins.isFunctionType
import org.jetbrains.kotlin.descriptors.*
@@ -25,6 +26,9 @@ import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
import org.jetbrains.kotlin.idea.core.isVisible
import org.jetbrains.kotlin.idea.inspections.IntentionBasedInspection
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.getStartOffsetIn
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.resolve.BindingContext.REFERENCE_TARGET
import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue
import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor
@@ -35,7 +39,12 @@ import org.jetbrains.kotlin.types.typeUtil.isUnit
class ConvertLambdaToReferenceInspection() : IntentionBasedInspection<KtLambdaExpression>(
ConvertLambdaToReferenceIntention::class,
{ it -> ConvertLambdaToReferenceIntention.shouldSuggestToConvert(it) }
)
) {
override fun inspectionRange(element: KtLambdaExpression) = element.bodyExpression?.statements?.singleOrNull()?.let {
val start = it.getStartOffsetIn(element)
TextRange(start, start + it.endOffset - it.startOffset)
}
}
class ConvertLambdaToReferenceIntention : SelfTargetingOffsetIndependentIntention<KtLambdaExpression>(
KtLambdaExpression::class.java, "Convert lambda to reference"
@@ -7,4 +7,12 @@
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Can be replaced with function reference</problem_class>
<description>Convert lambda to reference</description>
</problem>
<problem>
<file>test.kt</file>
<line>14</line>
<module>light_idea_test_case</module>
<entry_point TYPE="file" FQNAME="temp:///src/test.kt" />
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Can be replaced with function reference</problem_class>
<description>Convert lambda to reference</description>
</problem>
</problems>
+7 -1
View File
@@ -6,4 +6,10 @@ val x = { y: Int -> TheirWrapper(y) }
// Should not suggest to convert (too long reference)
fun foo(arg: TheirWrapper, convert: (TheirWrapper) -> String) = convert(arg)
val y = foo(TheirWrapper(42)) { it.toString() }
val y = foo(TheirWrapper(42)) { it.toString() }
// Also should suggest to convert, but only call should be highlighted
fun bar(arg: Int, convert: (Int) -> TheirWrapper) = convert(arg)
val z = bar(42) {
TheirWrapper(it)
}