diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/expressionTypeProvider/Fe10IdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/expressionTypeProvider/Fe10IdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java index 1768fdb696c0a..ffda5fe80dba5 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/expressionTypeProvider/Fe10IdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/expressionTypeProvider/Fe10IdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java @@ -160,6 +160,12 @@ public void testContextParameterUsage() { runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/contextParameterUsage.kt"); } + @Test + @TestMetadata("contractLambda.kt") + public void testContractLambda() { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/contractLambda.kt"); + } + @Test @TestMetadata("forExpression.kt") public void testForExpression() { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeDependentAnalysisSourceModuleHLExpressionTypeTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeDependentAnalysisSourceModuleHLExpressionTypeTestGenerated.java index 1bd8f0a9f5cb8..eb3d1b4d1b7f8 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeDependentAnalysisSourceModuleHLExpressionTypeTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeDependentAnalysisSourceModuleHLExpressionTypeTestGenerated.java @@ -160,6 +160,12 @@ public void testContextParameterUsage() { runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/contextParameterUsage.kt"); } + @Test + @TestMetadata("contractLambda.kt") + public void testContractLambda() { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/contractLambda.kt"); + } + @Test @TestMetadata("forExpression.kt") public void testForExpression() { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java index e11a38f89a0b5..e94760f09eb6b 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java @@ -160,6 +160,12 @@ public void testContextParameterUsage() { runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/contextParameterUsage.kt"); } + @Test + @TestMetadata("contractLambda.kt") + public void testContractLambda() { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/contractLambda.kt"); + } + @Test @TestMetadata("forExpression.kt") public void testForExpression() { diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/expressionTypeProvider/FirStandaloneNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/expressionTypeProvider/FirStandaloneNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java index 4b199e35d4928..128b36a2842e8 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/expressionTypeProvider/FirStandaloneNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/expressionTypeProvider/FirStandaloneNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java @@ -160,6 +160,12 @@ public void testContextParameterUsage() { runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/contextParameterUsage.kt"); } + @Test + @TestMetadata("contractLambda.kt") + public void testContractLambda() { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/contractLambda.kt"); + } + @Test @TestMetadata("forExpression.kt") public void testForExpression() { diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/contractLambda.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/contractLambda.kt new file mode 100644 index 0000000000000..2ee7761c07110 --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/contractLambda.kt @@ -0,0 +1,32 @@ +// WITH_STDLIB +import kotlin.contracts.ExperimentalContracts +import kotlin.contracts.InvocationKind +import kotlin.contracts.contract + +interface MyDeferred { + suspend fun await(): T +} + +abstract class MyException : Exception() { + abstract fun isInternal(): Boolean +} + +@OptIn(ExperimentalContracts::class) +suspend fun MyDeferred.safeAwait( + fallbackOnAbort: suspend () -> T, + onCancelled: suspend (MyException) -> T = { throw it }, +) : T { + contract { + callsInPlace(fallbackOnAbort, InvocationKind.AT_MOST_ONCE) + callsInPlace(onCancelled, InvocationKind.AT_MOST_ONCE) + } + return try { + await() + } catch (e: MyException) { + if (e.isInternal()) { + fallbackOnAbort() + } else { + onCancelled(e) + } + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/contractLambda.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/contractLambda.txt new file mode 100644 index 0000000000000..aa5bf9cab0f44 --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/contractLambda.txt @@ -0,0 +1,5 @@ +expression: { + callsInPlace(fallbackOnAbort, InvocationKind.AT_MOST_ONCE) + callsInPlace(onCancelled, InvocationKind.AT_MOST_ONCE) + } +type: kotlin.contracts.ContractBuilder.() -> kotlin.Unit