FunctionWithLambdaExpressionBodyInspection: fix ClassCastException for "Remove braces" quick fix

#KT-32580 Fixed
This commit is contained in:
Toshiaki Kameyama
2019-07-15 22:54:12 +09:00
committed by Dmitry Gridin
parent e5e5e9084e
commit 776cccf57c
6 changed files with 39 additions and 6 deletions
@@ -10,7 +10,6 @@ import com.intellij.openapi.project.Project
import com.intellij.psi.PsiComment
import com.intellij.psi.PsiElement
import com.intellij.psi.search.searches.ReferencesSearch
import com.intellij.psi.util.parentOfType
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
import org.jetbrains.kotlin.idea.core.replaced
@@ -20,6 +19,7 @@ import org.jetbrains.kotlin.idea.quickfix.SpecifyTypeExplicitlyFix
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.allChildren
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
import org.jetbrains.kotlin.types.typeUtil.isNothing
class FunctionWithLambdaExpressionBodyInspection : AbstractKotlinInspection() {
@@ -73,7 +73,7 @@ class FunctionWithLambdaExpressionBodyInspection : AbstractKotlinInspection() {
val lambda = descriptor.psiElement as? KtLambdaExpression ?: return
val body = lambda.functionLiteral.bodyExpression ?: return
val replaced = lambda.replaced(body)
replaced.parentOfType<KtCallableDeclaration>()?.setTypeIfNeed()
replaced.setTypeIfNeed()
}
}
@@ -86,14 +86,15 @@ class FunctionWithLambdaExpressionBodyInspection : AbstractKotlinInspection() {
val lambda = descriptor.psiElement as? KtLambdaExpression ?: return
val body = lambda.functionLiteral.bodyExpression ?: return
val replaced = lambda.replaced(KtPsiFactory(lambda).createExpressionByPattern("run { $0 }", body))
replaced.parentOfType<KtCallableDeclaration>()?.setTypeIfNeed()
replaced.setTypeIfNeed()
}
}
}
private fun KtCallableDeclaration.setTypeIfNeed() {
val type = (resolveToDescriptorIfAny() as? CallableDescriptor)?.returnType
private fun KtExpression.setTypeIfNeed() {
val declaration = getStrictParentOfType<KtCallableDeclaration>() ?: return
val type = (declaration.resolveToDescriptorIfAny() as? CallableDescriptor)?.returnType
if (type?.isNothing() == true) {
this.setType(type)
declaration.setType(type)
}
}
@@ -0,0 +1,6 @@
// FIX: Remove braces
class C {
fun f4() = {<caret>
"single-expression function which returns lambda"
}
}
@@ -0,0 +1,4 @@
// FIX: Remove braces
class C {
fun f4() = "single-expression function which returns lambda"
}
@@ -0,0 +1,7 @@
// FIX: Convert to run { ... }
// WITH_RUNTIME
class C {
fun f4() = {<caret>
"single-expression function which returns lambda"
}
}
@@ -0,0 +1,5 @@
// FIX: Convert to run { ... }
// WITH_RUNTIME
class C {
fun f4() = run { "single-expression function which returns lambda" }
}
@@ -4534,6 +4534,11 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest {
public void testGetterReturnsNothing() throws Exception {
runTest("idea/testData/inspectionsLocal/functionWithLambdaExpressionBody/removeBraces/getterReturnsNothing.kt");
}
@TestMetadata("kt32580.kt")
public void testKt32580() throws Exception {
runTest("idea/testData/inspectionsLocal/functionWithLambdaExpressionBody/removeBraces/kt32580.kt");
}
}
@TestMetadata("idea/testData/inspectionsLocal/functionWithLambdaExpressionBody/specifyType")
@@ -4590,6 +4595,11 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest {
public void testGetterReturnsNothing() throws Exception {
runTest("idea/testData/inspectionsLocal/functionWithLambdaExpressionBody/wrapRun/getterReturnsNothing.kt");
}
@TestMetadata("kt32580.kt")
public void testKt32580() throws Exception {
runTest("idea/testData/inspectionsLocal/functionWithLambdaExpressionBody/wrapRun/kt32580.kt");
}
}
}