Wrap with safe let call : minor refactoring
This commit is contained in:
@@ -71,6 +71,9 @@ fun KotlinType?.isArrayOfNothing(): Boolean {
|
|||||||
|
|
||||||
fun KotlinType.isSubtypeOf(superType: KotlinType): Boolean = KotlinTypeChecker.DEFAULT.isSubtypeOf(this, superType)
|
fun KotlinType.isSubtypeOf(superType: KotlinType): Boolean = KotlinTypeChecker.DEFAULT.isSubtypeOf(this, superType)
|
||||||
|
|
||||||
|
fun isNullabilityMismatch(expected: KotlinType, actual: KotlinType) =
|
||||||
|
!expected.isMarkedNullable && actual.isMarkedNullable && actual.isSubtypeOf(TypeUtils.makeNullable(expected))
|
||||||
|
|
||||||
fun KotlinType.cannotBeReified(): Boolean =
|
fun KotlinType.cannotBeReified(): Boolean =
|
||||||
KotlinBuiltIns.isNothingOrNullableNothing(this) || this.isDynamic() || this.isCaptured()
|
KotlinBuiltIns.isNothingOrNullableNothing(this) || this.isDynamic() || this.isCaptured()
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.idea.core.NewDeclarationNameValidator
|
|||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
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.TypeUtils
|
||||||
|
import org.jetbrains.kotlin.types.typeUtil.isNullabilityMismatch
|
||||||
import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf
|
import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf
|
||||||
|
|
||||||
class WrapWithSafeLetCallFix(
|
class WrapWithSafeLetCallFix(
|
||||||
@@ -68,11 +69,7 @@ class WrapWithSafeLetCallFix(
|
|||||||
val argument = typeMismatch.psiElement.parent as? KtValueArgument ?: return null
|
val argument = typeMismatch.psiElement.parent as? KtValueArgument ?: return null
|
||||||
val call = argument.getParentOfType<KtCallExpression>(true) ?: return null
|
val call = argument.getParentOfType<KtCallExpression>(true) ?: return null
|
||||||
|
|
||||||
val expected = typeMismatch.a
|
if (!isNullabilityMismatch(expected = typeMismatch.a, actual = typeMismatch.b)) return null
|
||||||
val actual = typeMismatch.b
|
|
||||||
if (expected.isMarkedNullable || !actual.isMarkedNullable) return null
|
|
||||||
val expectedNullable = TypeUtils.makeNullable(expected)
|
|
||||||
if (!actual.isSubtypeOf(expectedNullable)) return null
|
|
||||||
|
|
||||||
return WrapWithSafeLetCallFix(call, typeMismatch.psiElement)
|
return WrapWithSafeLetCallFix(call, typeMismatch.psiElement)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user