Redundant nullable return type: fix false positive with non-local return

#KT-41800 Fixed
This commit is contained in:
Toshiaki Kameyama
2020-09-11 09:50:57 +09:00
committed by Vladimir Dolzhenko
parent 349cad7b9a
commit de3907e8cc
5 changed files with 40 additions and 4 deletions
@@ -74,12 +74,13 @@ class RedundantNullableReturnTypeInspection : AbstractKotlinInspection() {
val dataFlowValueFactory = getResolutionFacade().getDataFlowValueFactory()
val moduleDescriptor = findModuleDescriptor()
val languageVersionSettings = languageVersionSettings
val returnTypes = collectDescendantsOfType<KtReturnExpression>().flatMap {
it.returnedExpression.types(context, dataFlowValueFactory, moduleDescriptor, languageVersionSettings)
}
return if (this is KtBlockExpression) {
collectDescendantsOfType<KtReturnExpression>().flatMap {
it.returnedExpression.types(context, dataFlowValueFactory, moduleDescriptor, languageVersionSettings)
}
returnTypes
} else {
types(context, dataFlowValueFactory, moduleDescriptor, languageVersionSettings)
returnTypes + types(context, dataFlowValueFactory, moduleDescriptor, languageVersionSettings)
}
}
@@ -0,0 +1,9 @@
// PROBLEM: none
class MyClass
inline fun <T> acceptMyClass(m: (MyClass?) -> T) {}
fun one(): MyClass?<caret> {
acceptMyClass { return it }
return MyClass()
}
@@ -0,0 +1,5 @@
// PROBLEM: none
// WITH_RUNTIME
fun test(str: String): String?<caret> = str.run {
return null
}
@@ -0,0 +1,6 @@
// PROBLEM: none
// WITH_RUNTIME
val test: Int?<caret>
get() = run {
return null
}
@@ -8249,6 +8249,16 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest {
runTest("idea/testData/inspectionsLocal/redundantNullableReturnType/function/overridable.kt");
}
@TestMetadata("returnNullableFromLambdaInBlockBody.kt")
public void testReturnNullableFromLambdaInBlockBody() throws Exception {
runTest("idea/testData/inspectionsLocal/redundantNullableReturnType/function/returnNullableFromLambdaInBlockBody.kt");
}
@TestMetadata("returnNullableFromLambdaInSingleExpressionBody.kt")
public void testReturnNullableFromLambdaInSingleExpressionBody() throws Exception {
runTest("idea/testData/inspectionsLocal/redundantNullableReturnType/function/returnNullableFromLambdaInSingleExpressionBody.kt");
}
@TestMetadata("singleExpressionBody.kt")
public void testSingleExpressionBody() throws Exception {
runTest("idea/testData/inspectionsLocal/redundantNullableReturnType/function/singleExpressionBody.kt");
@@ -8287,6 +8297,11 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest {
runTest("idea/testData/inspectionsLocal/redundantNullableReturnType/property/initializer.kt");
}
@TestMetadata("returnNullableFromLambdaInGetter.kt")
public void testReturnNullableFromLambdaInGetter() throws Exception {
runTest("idea/testData/inspectionsLocal/redundantNullableReturnType/property/returnNullableFromLambdaInGetter.kt");
}
@TestMetadata("var.kt")
public void testVar() throws Exception {
runTest("idea/testData/inspectionsLocal/redundantNullableReturnType/property/var.kt");