diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index 6f05c03b433..767dbca090b 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -33684,6 +33684,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/script/destructuringDeclarationsScript.kts"); } + @Test + @TestMetadata("functionContractScript.kts") + public void testFunctionContractScript() throws Exception { + runTest("compiler/testData/diagnostics/tests/script/functionContractScript.kts"); + } + @Test @TestMetadata("imports.kts") public void testImports() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index 9586f0dc171..07856da1f65 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -33684,6 +33684,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/script/destructuringDeclarationsScript.kts"); } + @Test + @TestMetadata("functionContractScript.kts") + public void testFunctionContractScript() throws Exception { + runTest("compiler/testData/diagnostics/tests/script/functionContractScript.kts"); + } + @Test @TestMetadata("imports.kts") public void testImports() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index b607c8ab8c4..c25ba88fe35 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -31512,6 +31512,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/script/destructuringDeclarationsScript.kts"); } + @Test + @TestMetadata("functionContractScript.kts") + public void testFunctionContractScript() throws Exception { + runTest("compiler/testData/diagnostics/tests/script/functionContractScript.kts"); + } + @Test @TestMetadata("imports.kts") public void testImports() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirAbstractContractResolveTransformerDispatcher.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirAbstractContractResolveTransformerDispatcher.kt index efb54fa461a..a0f96e7e6eb 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirAbstractContractResolveTransformerDispatcher.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirAbstractContractResolveTransformerDispatcher.kt @@ -286,7 +286,9 @@ abstract class FirAbstractContractResolveTransformerDispatcher( } override fun transformScript(script: FirScript, data: ResolutionMode): FirScript { - return script + return withScript(script) { + transformDeclarationContent(script, data) as FirScript + } } override fun transformAnonymousObject( diff --git a/compiler/testData/diagnostics/tests/script/functionContractScript.fir.kts b/compiler/testData/diagnostics/tests/script/functionContractScript.fir.kts new file mode 100644 index 00000000000..4e9270439f8 --- /dev/null +++ b/compiler/testData/diagnostics/tests/script/functionContractScript.fir.kts @@ -0,0 +1,30 @@ +// !OPT_IN: kotlin.contracts.ExperimentalContracts + +import kotlin.contracts.* + +inline fun exactlyOnce(block: () -> T): T { + contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } + return block() +} + +inline fun atLeastOnce(block: () -> T): T { + contract { callsInPlace(block, InvocationKind.AT_LEAST_ONCE) } + return block() +} + +inline fun atMostOnce(block: () -> T): T { + contract { callsInPlace(block, InvocationKind.AT_MOST_ONCE) } + return block() +} + +val a: String +exactlyOnce { a = "" } +a.length + +val b: String +atLeastOnce { b = "" } +b.length + +val c: String +atMostOnce { c = "" } +c.length diff --git a/compiler/testData/diagnostics/tests/script/functionContractScript.kts b/compiler/testData/diagnostics/tests/script/functionContractScript.kts new file mode 100644 index 00000000000..bddfa25819c --- /dev/null +++ b/compiler/testData/diagnostics/tests/script/functionContractScript.kts @@ -0,0 +1,30 @@ +// !OPT_IN: kotlin.contracts.ExperimentalContracts + +import kotlin.contracts.* + +inline fun exactlyOnce(block: () -> T): T { + contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } + return block() +} + +inline fun atLeastOnce(block: () -> T): T { + contract { callsInPlace(block, InvocationKind.AT_LEAST_ONCE) } + return block() +} + +inline fun atMostOnce(block: () -> T): T { + contract { callsInPlace(block, InvocationKind.AT_MOST_ONCE) } + return block() +} + +val a: String +exactlyOnce { a = "" } +a.length + +val b: String +atLeastOnce { b = "" } +b.length + +val c: String +atMostOnce { c = "" } +c.length diff --git a/compiler/testData/diagnostics/tests/script/topLevelPropertyInitialization.fir.kts b/compiler/testData/diagnostics/tests/script/topLevelPropertyInitialization.fir.kts index 3cd99fefffb..7d7415bf586 100644 --- a/compiler/testData/diagnostics/tests/script/topLevelPropertyInitialization.fir.kts +++ b/compiler/testData/diagnostics/tests/script/topLevelPropertyInitialization.fir.kts @@ -29,7 +29,7 @@ val b: String = inPlaceRun { b } val c: String = notInPlaceRun { c } val d: String by simpleDelegate(d) -val e: String by inPlaceDelegate { e } +val e: String by inPlaceDelegate { e } val f: String by notInPlaceDelegate { f } val g: Int @@ -53,6 +53,6 @@ val t: String = z val u: String = inPlaceRun { z } val v: String = notInPlaceRun { z } val w: String by simpleDelegate(z) -val x: String by inPlaceDelegate { z } +val x: String by inPlaceDelegate { z } val y: String by notInPlaceDelegate { z } val z: String = "VALUE" diff --git a/compiler/testData/diagnostics/tests/script/topLevelPropertyInitialization.ll.kts b/compiler/testData/diagnostics/tests/script/topLevelPropertyInitialization.ll.kts deleted file mode 100644 index d5e9d3c8432..00000000000 --- a/compiler/testData/diagnostics/tests/script/topLevelPropertyInitialization.ll.kts +++ /dev/null @@ -1,61 +0,0 @@ -// LL_FIR_DIVERGENCE -// KT-64074 -// LL_FIR_DIVERGENCE -// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -WRONG_INVOCATION_KIND -// WITH_STDLIB - -import kotlin.contracts.ExperimentalContracts -import kotlin.contracts.InvocationKind -import kotlin.contracts.contract -import kotlin.properties.ReadOnlyProperty - -@OptIn(ExperimentalContracts::class) -inline fun inPlaceRun(block: () -> T): T { - contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } - return block() -} - -fun notInPlaceRun(block: () -> T): T = null!! - -fun simpleDelegate(value: T): ReadOnlyProperty = null!! - -@OptIn(ExperimentalContracts::class) -fun inPlaceDelegate(block: () -> T): ReadOnlyProperty { - contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } - return null!! -} - -fun notInPlaceDelegate(block: () -> T): ReadOnlyProperty = null!! - -val a: String = a -val b: String = inPlaceRun { b } -val c: String = notInPlaceRun { c } - -val d: String by simpleDelegate(d) -val e: String by inPlaceDelegate { e } -val f: String by notInPlaceDelegate { f } - -val g: Int -val h = 1.also { g = 2 } -val i: Int -val j by lazy { i = 2; 1 } -val k: Int - get() { - i = 3 - return i - } - -val l: Comparator = object : Comparator { - val delegate: Comparator get() = n - override fun compare(o1: String, o2: String): Int = delegate.compare(o1, o2) -} -val m: Comparator = object : Comparator by n {} -val n: Comparator = Comparator { _, _ -> 0 } - -val t: String = z -val u: String = inPlaceRun { z } -val v: String = notInPlaceRun { z } -val w: String by simpleDelegate(z) -val x: String by inPlaceDelegate { z } -val y: String by notInPlaceDelegate { z } -val z: String = "VALUE" diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 7c097723e45..f6b373109f5 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -33684,6 +33684,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/script/destructuringDeclarationsScript.kts"); } + @Test + @TestMetadata("functionContractScript.kts") + public void testFunctionContractScript() throws Exception { + runTest("compiler/testData/diagnostics/tests/script/functionContractScript.kts"); + } + @Test @TestMetadata("imports.kts") public void testImports() throws Exception {