Wrap with safe let call handles qualified calls correctly #KT-13262 Fixed
(cherry picked from commit 7044348)
This commit is contained in:
committed by
Mikhail Glukhikh
parent
77b7648f10
commit
b7fd41844d
@@ -365,5 +365,5 @@ fun <E : PsiElement> E.createSmartPointer(): SmartPsiElementPointer<E> =
|
|||||||
|
|
||||||
fun PsiElement.before(element: PsiElement) = textRange.endOffset <= element.textRange.startOffset
|
fun PsiElement.before(element: PsiElement) = textRange.endOffset <= element.textRange.startOffset
|
||||||
|
|
||||||
inline fun <reified T : PsiElement> PsiElement.getLastParentOfTypeInRow() = parents.takeWhile { it is T }.lastOrNull()
|
inline fun <reified T : PsiElement> PsiElement.getLastParentOfTypeInRow() = parents.takeWhile { it is T }.lastOrNull() as? T
|
||||||
|
|
||||||
|
|||||||
@@ -24,10 +24,9 @@ import org.jetbrains.kotlin.diagnostics.Errors
|
|||||||
import org.jetbrains.kotlin.idea.core.KotlinNameSuggester
|
import org.jetbrains.kotlin.idea.core.KotlinNameSuggester
|
||||||
import org.jetbrains.kotlin.idea.core.NewDeclarationNameValidator
|
import org.jetbrains.kotlin.idea.core.NewDeclarationNameValidator
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.getLastParentOfTypeInRow
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
|
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
|
||||||
import org.jetbrains.kotlin.types.TypeUtils
|
|
||||||
import org.jetbrains.kotlin.types.typeUtil.isNullabilityMismatch
|
import org.jetbrains.kotlin.types.typeUtil.isNullabilityMismatch
|
||||||
import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf
|
|
||||||
|
|
||||||
class WrapWithSafeLetCallFix(
|
class WrapWithSafeLetCallFix(
|
||||||
expression: KtExpression,
|
expression: KtExpression,
|
||||||
@@ -71,7 +70,7 @@ class WrapWithSafeLetCallFix(
|
|||||||
|
|
||||||
if (!isNullabilityMismatch(expected = typeMismatch.a, actual = typeMismatch.b)) return null
|
if (!isNullabilityMismatch(expected = typeMismatch.a, actual = typeMismatch.b)) return null
|
||||||
|
|
||||||
return WrapWithSafeLetCallFix(call, typeMismatch.psiElement)
|
return WrapWithSafeLetCallFix(call.getLastParentOfTypeInRow<KtQualifiedExpression>() ?: call, typeMismatch.psiElement)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
// "Wrap with '?.let { ... }' call" "true"
|
||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
fun Int.foo(x: Int) = this + x
|
||||||
|
|
||||||
|
val arg: Int? = 42
|
||||||
|
|
||||||
|
val res = 24.hashCode().foo(<caret>arg)
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
// "Wrap with '?.let { ... }' call" "true"
|
||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
fun Int.foo(x: Int) = this + x
|
||||||
|
|
||||||
|
val arg: Int? = 42
|
||||||
|
|
||||||
|
val res = arg?.let { 24.hashCode().foo(it) }
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
// "Wrap with '?.let { ... }' call" "true"
|
||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
object Obj {
|
||||||
|
fun foo(x: Int) = x
|
||||||
|
}
|
||||||
|
val arg: Int? = null
|
||||||
|
val argFoo = Obj.foo(<caret>arg)
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
// "Wrap with '?.let { ... }' call" "true"
|
||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
object Obj {
|
||||||
|
fun foo(x: Int) = x
|
||||||
|
}
|
||||||
|
val arg: Int? = null
|
||||||
|
val argFoo = arg?.let { Obj.foo(it) }
|
||||||
@@ -9151,6 +9151,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("chainedCallTypeMismatch.kt")
|
||||||
|
public void testChainedCallTypeMismatch() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/wrapWithSafeLetCall/chainedCallTypeMismatch.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("chainedUnsafeCall.kt")
|
@TestMetadata("chainedUnsafeCall.kt")
|
||||||
public void testChainedUnsafeCall() throws Exception {
|
public void testChainedUnsafeCall() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/wrapWithSafeLetCall/chainedUnsafeCall.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/wrapWithSafeLetCall/chainedUnsafeCall.kt");
|
||||||
@@ -9181,6 +9187,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("objectQualifier.kt")
|
||||||
|
public void testObjectQualifier() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/wrapWithSafeLetCall/objectQualifier.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("unstableValue.kt")
|
@TestMetadata("unstableValue.kt")
|
||||||
public void testUnstableValue() throws Exception {
|
public void testUnstableValue() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/wrapWithSafeLetCall/unstableValue.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/wrapWithSafeLetCall/unstableValue.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user