From e84b0a31e330696771cd8670688de2973bb3f8cd Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Mon, 7 Oct 2024 14:41:06 +0200 Subject: [PATCH] Declare contract for asSafely method GitOrigin-RevId: e3797d068110395045e4ffab4b64ef92a5223ac4 --- platform/util/src/com/intellij/util/KtUtils.kt | 8 +++++++- .../uast/java/internal/javaInternalUastUtils.kt | 11 +++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/platform/util/src/com/intellij/util/KtUtils.kt b/platform/util/src/com/intellij/util/KtUtils.kt index a31b583a75a2..fe59d8d19afd 100644 --- a/platform/util/src/com/intellij/util/KtUtils.kt +++ b/platform/util/src/com/intellij/util/KtUtils.kt @@ -9,8 +9,14 @@ import kotlin.contracts.InvocationKind import kotlin.contracts.contract import kotlin.reflect.KProperty +@OptIn(ExperimentalContracts::class) @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") -inline fun Any?.asSafely(): @kotlin.internal.NoInfer T? = this as? T +inline fun Any?.asSafely(): @kotlin.internal.NoInfer T? { + contract { + returnsNotNull() implies (this@asSafely is T) + } + return this as? T +} inline fun runIf(condition: Boolean, block: () -> T): T? = if (condition) block() else null diff --git a/uast/uast-java/src/org/jetbrains/uast/java/internal/javaInternalUastUtils.kt b/uast/uast-java/src/org/jetbrains/uast/java/internal/javaInternalUastUtils.kt index 081dfdcea4e8..b4dac3caedd2 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/internal/javaInternalUastUtils.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/internal/javaInternalUastUtils.kt @@ -23,6 +23,8 @@ import com.intellij.psi.tree.IElementType import org.jetbrains.uast.UDeclaration import org.jetbrains.uast.UElement import org.jetbrains.uast.UastBinaryOperator +import kotlin.contracts.ExperimentalContracts +import kotlin.contracts.contract internal fun IElementType.getOperatorType() = when (this) { JavaTokenType.EQ -> UastBinaryOperator.ASSIGN @@ -87,9 +89,14 @@ fun isJava(language: Language?): Boolean { return language == JavaLanguage.INSTANCE } +@OptIn(ExperimentalContracts::class) @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") -internal inline fun Any?.asSafely(): @kotlin.internal.NoInfer T? = this as? T - +inline fun Any?.asSafely(): @kotlin.internal.NoInfer T? { + contract { + returnsNotNull() implies (this@asSafely is T) + } + return this as? T +} fun PsiElement?.isSemicolon(): Boolean { if (this !is PsiJavaToken) return false