diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/FoldInitializerAndIfToElvisInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/FoldInitializerAndIfToElvisInspection.kt index a1adb522e38..965905d8f2b 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/FoldInitializerAndIfToElvisInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/FoldInitializerAndIfToElvisInspection.kt @@ -84,20 +84,7 @@ class FoldInitializerAndIfToElvisInspection : AbstractApplicabilityBasedInspecti val explicitTypeToSet = when { // for var with no explicit type, add it so that the actual change won't change - declaration.isVar && declaration.typeReference == null -> { - if (element.condition is KtBinaryExpression) { - val ifEndOffset = element.endOffset - val context = element.analyze() - val isUsedAsNotNullable = ReferencesSearch.search(declaration, LocalSearchScope(declaration.parent)).any { - if (it.element.startOffset <= ifEndOffset) return@any false - val type = it.element.safeAs()?.getType(context) ?: return@any false - !type.isNullable() - } - if (isUsedAsNotNullable) null else context.getType(initializer) - } else { - initializer.analyze(BodyResolveMode.PARTIAL).getType(initializer) - } - } + declaration.isVar && declaration.typeReference == null -> initializer.analyze(BodyResolveMode.PARTIAL).getType(initializer) // for val with explicit type, change it to non-nullable !declaration.isVar && declaration.typeReference != null -> initializer.analyze(BodyResolveMode.PARTIAL).getType(initializer) @@ -166,6 +153,15 @@ class FoldInitializerAndIfToElvisInspection : AbstractApplicabilityBasedInspecti val checkedType = ifExpression.analyze(BodyResolveMode.PARTIAL)[BindingContext.TYPE, typeReference] val variableType = (prevStatement.resolveToDescriptorIfAny() as? VariableDescriptor)?.type if (checkedType != null && variableType != null && !checkedType.isSubtypeOf(variableType)) return null + } else if (prevStatement.isVar && operationExpression is KtBinaryExpression) { + val ifEndOffset = ifExpression.endOffset + val context = ifExpression.analyze() + val isUsedAsNotNullable = ReferencesSearch.search(prevStatement, LocalSearchScope(prevStatement.parent)).any { + if (it.element.startOffset <= ifEndOffset) return@any false + val type = it.element.safeAs()?.getType(context) ?: return@any false + !type.isNullable() + } + if (isUsedAsNotNullable) return null } val statement = if (then is KtBlockExpression) then.statements.singleOrNull() else then diff --git a/idea/testData/inspectionsLocal/foldInitializerAndIfToElvis/VarUsedAsNotNullable.kt b/idea/testData/inspectionsLocal/foldInitializerAndIfToElvis/VarUsedAsNotNullable.kt index fb35def4b30..f3d46bcd50b 100644 --- a/idea/testData/inspectionsLocal/foldInitializerAndIfToElvis/VarUsedAsNotNullable.kt +++ b/idea/testData/inspectionsLocal/foldInitializerAndIfToElvis/VarUsedAsNotNullable.kt @@ -1,3 +1,4 @@ +// PROBLEM: none fun test(foo: Int?, bar: Int): Int { var i = foo if (i == null) { diff --git a/idea/testData/inspectionsLocal/foldInitializerAndIfToElvis/VarUsedAsNotNullable.kt.after b/idea/testData/inspectionsLocal/foldInitializerAndIfToElvis/VarUsedAsNotNullable.kt.after deleted file mode 100644 index 2f50b6e6857..00000000000 --- a/idea/testData/inspectionsLocal/foldInitializerAndIfToElvis/VarUsedAsNotNullable.kt.after +++ /dev/null @@ -1,4 +0,0 @@ -fun test(foo: Int?, bar: Int): Int { - var i = foo ?: return bar - return i -} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/foldInitializerAndIfToElvis/VarUsedAsNotNullable2.kt b/idea/testData/inspectionsLocal/foldInitializerAndIfToElvis/VarUsedAsNotNullable2.kt index 15aa169a478..ffaa8d2f4b0 100644 --- a/idea/testData/inspectionsLocal/foldInitializerAndIfToElvis/VarUsedAsNotNullable2.kt +++ b/idea/testData/inspectionsLocal/foldInitializerAndIfToElvis/VarUsedAsNotNullable2.kt @@ -1,3 +1,4 @@ +// PROBLEM: none fun test(foo: Int?, bar: Int): Int { var i = foo if (i == null) { diff --git a/idea/testData/inspectionsLocal/foldInitializerAndIfToElvis/VarUsedAsNotNullable2.kt.after b/idea/testData/inspectionsLocal/foldInitializerAndIfToElvis/VarUsedAsNotNullable2.kt.after deleted file mode 100644 index e93d33a285b..00000000000 --- a/idea/testData/inspectionsLocal/foldInitializerAndIfToElvis/VarUsedAsNotNullable2.kt.after +++ /dev/null @@ -1,8 +0,0 @@ -fun test(foo: Int?, bar: Int): Int { - var i = foo ?: return bar - baz(i) - val j = i + 1 - return j -} - -fun baz(i: Int?) {} \ No newline at end of file