FIR IDE: Offer AddExclExclCallFix for nullable types with an
`iterator()` function that does NOT have `operator` modifier. This is different from FE1.0. Adding `!!` will then surface the error that `operator` modifier needs to be added (with corresponding fix).
This commit is contained in:
committed by
Ilya Kirillov
parent
9e01a608b2
commit
1d9247ae0f
+4
-2
@@ -81,9 +81,11 @@ object AddExclExclCallFixFactories {
|
|||||||
val type = expression.getKtType()
|
val type = expression.getKtType()
|
||||||
if (!type.canBeNull) return@diagnosticFixFactory emptyList()
|
if (!type.canBeNull) return@diagnosticFixFactory emptyList()
|
||||||
|
|
||||||
|
// NOTE: This is different from FE1.0 in that we offer the fix even if the function does NOT have the `operator` modifier.
|
||||||
|
// Adding `!!` will then surface the error that `operator` should be added (with corresponding fix).
|
||||||
val typeScope = type.getTypeScope() ?: return@diagnosticFixFactory emptyList()
|
val typeScope = type.getTypeScope() ?: return@diagnosticFixFactory emptyList()
|
||||||
val hasValidIterator = typeScope.getCallableSymbols { it == OperatorNameConventions.ITERATOR }
|
val hasValidIterator = typeScope.getCallableSymbols { it == OperatorNameConventions.ITERATOR }
|
||||||
.filter { it is KtFunctionSymbol && it.isOperator && it.valueParameters.isEmpty() }.singleOrNull() != null
|
.filter { it is KtFunctionSymbol && it.valueParameters.isEmpty() }.singleOrNull() != null
|
||||||
if (hasValidIterator) {
|
if (hasValidIterator) {
|
||||||
listOfNotNull(expression.asAddExclExclCallFix())
|
listOfNotNull(expression.asAddExclExclCallFix())
|
||||||
} else {
|
} else {
|
||||||
@@ -93,4 +95,4 @@ object AddExclExclCallFixFactories {
|
|||||||
}
|
}
|
||||||
|
|
||||||
internal fun PsiElement?.asAddExclExclCallFix(hasImplicitReceiver: Boolean = false) =
|
internal fun PsiElement?.asAddExclExclCallFix(hasImplicitReceiver: Boolean = false) =
|
||||||
this?.let { AddExclExclCallFix(it, hasImplicitReceiver) } ?: null
|
this?.let { AddExclExclCallFix(it, hasImplicitReceiver) }
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
// "Add non-null asserted (!!) call" "true"
|
||||||
|
|
||||||
|
class Some {
|
||||||
|
fun iterator(): Iterator<Int> = null!!
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo() {
|
||||||
|
val test: Some? = Some()
|
||||||
|
for (i in <caret>test) { }
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
// "Add non-null asserted (!!) call" "true"
|
||||||
|
|
||||||
|
class Some {
|
||||||
|
fun iterator(): Iterator<Int> = null!!
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo() {
|
||||||
|
val test: Some? = Some()
|
||||||
|
for (i in test!!) { }
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user