From 166c771e1be4c7d45494ed3910878d58ec4a6383 Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Fri, 27 May 2022 13:30:19 +0400 Subject: [PATCH] [FIR IDE] Ensure resolve to CONTRACTS phase in ReturnTypeCalculator If we want to analyse some function's call, we need to know about its contracts, otherwise resolving the following code would be broken. Computing return type of function is a prerequisite to using it in any sensible way, so it's the best place to resolve it to CONTRACTS KT-50733 --- .../testdata/lazyResolve/classMembers.txt | 7 +++-- .../testdata/lazyResolve/delegates.txt | 15 ++++++----- .../lazyResolve/propertyWithGetter.txt | 9 ++++--- .../propertyWithGetterAndSetter.txt | 13 +++++++--- .../lazyResolve/propertyWithInitializer.txt | 2 +- .../lazyResolve/secondaryConstructor.txt | 3 ++- .../lazyResolve/topLevelFunctions.txt | 7 +++-- ...tionsWithExpressionBodyAndExplicitType.txt | 7 +++-- .../topLevelFunctionsWithImplicitType.txt | 3 ++- ...nosisCompilerFirTestdataTestGenerated.java | 12 +++++++++ ...TouchedTilContractsPhaseTestGenerated.java | 10 +++++++ .../contracts/contractFromOtherModule.fir.txt | 25 ++++++++++++++++++ .../contracts/contractFromOtherModule.kt | 26 +++++++++++++++++++ ...ontractFromOtherModule_samePackage.fir.txt | 25 ++++++++++++++++++ .../contractFromOtherModule_samePackage.kt | 24 +++++++++++++++++ .../runners/FirDiagnosticTestGenerated.java | 12 +++++++++ ...DiagnosticsWithLightTreeTestGenerated.java | 12 +++++++++ .../body/resolve/FirImplicitBodyResolve.kt | 18 +++++++++++++ .../contracts/dsl/useBeforeDeclaration.fir.kt | 1 - .../contracts/dsl/useBeforeDeclaration.kt | 1 - .../controlFlow/initialization/neg/1.fir.kt | 1 - .../controlFlow/initialization/neg/1.kt | 1 - .../controlFlow/initialization/neg/2.fir.kt | 1 - .../controlFlow/initialization/neg/2.kt | 1 - .../controlFlow/initialization/neg/3.fir.kt | 1 - .../controlFlow/initialization/neg/3.kt | 1 - .../controlFlow/initialization/neg/4.fir.kt | 1 - .../controlFlow/initialization/neg/4.kt | 1 - .../controlFlow/initialization/neg/5.fir.kt | 1 - .../controlFlow/initialization/neg/5.kt | 1 - .../controlFlow/initialization/pos/1.kt | 1 - .../controlFlow/initialization/pos/2.kt | 1 - .../controlFlow/initialization/pos/3.fir.kt | 1 - .../controlFlow/initialization/pos/3.kt | 1 - .../controlFlow/initialization/pos/4.fir.kt | 1 - .../controlFlow/initialization/pos/4.kt | 1 - .../controlFlow/initialization/pos/6.fir.kt | 1 - .../controlFlow/initialization/pos/6.kt | 1 - .../analysis/smartcasts/neg/1.fir.kt | 1 - .../contracts/analysis/smartcasts/neg/1.kt | 1 - .../analysis/smartcasts/neg/2.fir.kt | 1 - .../contracts/analysis/smartcasts/neg/2.kt | 1 - .../analysis/smartcasts/neg/9.fir.kt | 1 - .../contracts/analysis/smartcasts/neg/9.kt | 1 - .../analysis/smartcasts/pos/1.fir.kt | 1 - .../contracts/analysis/smartcasts/pos/1.kt | 1 - .../analysis/smartcasts/pos/11.fir.kt | 1 - .../contracts/analysis/smartcasts/pos/11.kt | 1 - .../analysis/smartcasts/pos/12.fir.kt | 1 - .../contracts/analysis/smartcasts/pos/12.kt | 1 - .../analysis/smartcasts/pos/2.fir.kt | 1 - .../contracts/analysis/smartcasts/pos/2.kt | 1 - .../analysis/smartcasts/pos/8.fir.kt | 1 - .../contracts/analysis/smartcasts/pos/8.kt | 1 - .../analysis/smartcasts/pos/9.fir.kt | 1 - .../contracts/analysis/smartcasts/pos/9.kt | 1 - .../contractFunction/pos/1.fir.kt | 18 ++++++++++++- .../declarations/contractFunction/pos/1.kt | 18 +++++++++++-- .../declarations/contractFunction/pos/1.txt | 20 ++++++++++++++ 59 files changed, 260 insertions(+), 64 deletions(-) create mode 100644 compiler/fir/analysis-tests/testData/resolve/contracts/contractFromOtherModule.fir.txt create mode 100644 compiler/fir/analysis-tests/testData/resolve/contracts/contractFromOtherModule.kt create mode 100644 compiler/fir/analysis-tests/testData/resolve/contracts/contractFromOtherModule_samePackage.fir.txt create mode 100644 compiler/fir/analysis-tests/testData/resolve/contracts/contractFromOtherModule_samePackage.kt diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/classMembers.txt b/analysis/low-level-api-fir/testdata/lazyResolve/classMembers.txt index 7c984cc244e..5cb79d80f89 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/classMembers.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/classMembers.txt @@ -217,9 +217,12 @@ FILE: classMembers.kt public final [STATUS] val x: R|kotlin/Int| = LAZY_EXPRESSION [STATUS] [ContainingClassKey=A] public get(): R|kotlin/Int| { LAZY_BLOCK } - public final [STATUS] fun receive([RAW_FIR] value: R|kotlin/String|): R|kotlin/Unit| { LAZY_BLOCK } + public final [CONTRACTS] fun receive([RAW_FIR] value: R|kotlin/String|): R|kotlin/Unit| { + } - public final [STATUS] fun functionWithLazyBody(): R|kotlin/String| { LAZY_BLOCK } + public final [CONTRACTS] fun functionWithLazyBody(): R|kotlin/String| { + ^functionWithLazyBody String(42) + } } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/delegates.txt b/analysis/low-level-api-fir/testdata/lazyResolve/delegates.txt index aadff41cb90..1a7a3e05f69 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/delegates.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/delegates.txt @@ -341,8 +341,9 @@ FILE: delegates.kt R|/variableWithExplicitType| = Int(10) R|/variableWithImplicitType| = Int(10) } - public final [STATUS] fun receive([RAW_FIR] value: R|kotlin/Int|): R|kotlin/Unit| { LAZY_BLOCK } - public final [STATUS] val delegate: R|kotlin/properties/ReadWriteProperty| = object : R|kotlin/properties/ReadWriteProperty| { + public final [CONTRACTS] fun receive([RAW_FIR] value: R|kotlin/Int|): R|kotlin/Unit| { + } + public final [CONTRACTS] val delegate: R|kotlin/properties/ReadWriteProperty| = object : R|kotlin/properties/ReadWriteProperty| { private [RAW_FIR] [ContainingClassKey=] constructor(): R|| { super() } @@ -357,19 +358,19 @@ FILE: delegates.kt } [BODY_RESOLVE] public get(): R|kotlin/properties/ReadWriteProperty| - public final [STATUS] val valueWithExplicitType: R|kotlin/Int|by LAZY_EXPRESSION - [STATUS] public get(): { + public final [CONTRACTS] val valueWithExplicitType: R|kotlin/Int|by delegate# + [CONTRACTS] public get(): { ^ D|/valueWithExplicitType|.getValue#(Null(null), ::R|/valueWithExplicitType|) } public final [IMPLICIT_TYPES_BODY_RESOLVE] val valueWithImplicitType: R|kotlin/Int|by R|/delegate| [IMPLICIT_TYPES_BODY_RESOLVE] public get(): R|kotlin/Int| { ^ D|/valueWithImplicitType|.R|SubstitutionOverride|(Null(null), ::R|/valueWithImplicitType|) } - public final [STATUS] var variableWithExplicitType: R|kotlin/Int|by LAZY_EXPRESSION - [STATUS] public get(): { + public final [CONTRACTS] var variableWithExplicitType: R|kotlin/Int|by delegate# + [CONTRACTS] public get(): { ^ D|/variableWithExplicitType|.getValue#(Null(null), ::R|/variableWithExplicitType|) } - [STATUS] public set([RAW_FIR] : ): R|kotlin/Unit| { + [CONTRACTS] public set([RAW_FIR] : ): R|kotlin/Unit| { D|/variableWithExplicitType|.setValue#(Null(null), ::R|/variableWithExplicitType|, R|/variableWithExplicitType|) } public final [IMPLICIT_TYPES_BODY_RESOLVE] var variableWithImplicitType: R|kotlin/Int|by R|/delegate| diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/propertyWithGetter.txt b/analysis/low-level-api-fir/testdata/lazyResolve/propertyWithGetter.txt index 7f06dd133c4..2fd0ce68cd0 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/propertyWithGetter.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/propertyWithGetter.txt @@ -87,9 +87,12 @@ FILE: propertyWithGetter.kt public final [BODY_RESOLVE] fun resolveMe(): R|kotlin/Unit| { R|/receive|(R|/withGetter|) } - public final [STATUS] fun receive([RAW_FIR] value: R|kotlin/Int|): R|kotlin/Unit| { LAZY_BLOCK } - public final [STATUS] val withGetter: R|kotlin/Int| - [STATUS] public get(): R|kotlin/Int| { LAZY_BLOCK } + public final [CONTRACTS] fun receive([RAW_FIR] value: R|kotlin/Int|): R|kotlin/Unit| { + } + public final [CONTRACTS] val withGetter: R|kotlin/Int| + [CONTRACTS] public get(): R|kotlin/Int| { + ^ IntegerLiteral(42) + } FILE RAW TO BODY: FILE: propertyWithGetter.kt diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/propertyWithGetterAndSetter.txt b/analysis/low-level-api-fir/testdata/lazyResolve/propertyWithGetterAndSetter.txt index 172634c0914..8291fd33a7b 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/propertyWithGetterAndSetter.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/propertyWithGetterAndSetter.txt @@ -102,10 +102,15 @@ FILE: propertyWithGetterAndSetter.kt R|/receive|(R|/withGetterAndSetter|) R|/withGetterAndSetter| = Int(123) } - public final [STATUS] fun receive([RAW_FIR] value: R|kotlin/Int|): R|kotlin/Unit| { LAZY_BLOCK } - public final [STATUS] var withGetterAndSetter: R|kotlin/Int| = LAZY_EXPRESSION - [STATUS] public get(): R|kotlin/Int| { LAZY_BLOCK } - [STATUS] public set([RAW_FIR] value: R|kotlin/Int|): R|kotlin/Unit| { LAZY_BLOCK } + public final [CONTRACTS] fun receive([RAW_FIR] value: R|kotlin/Int|): R|kotlin/Unit| { + } + public final [CONTRACTS] var withGetterAndSetter: R|kotlin/Int| = IntegerLiteral(42) + [CONTRACTS] public get(): R|kotlin/Int| { + ^ field# + } + [CONTRACTS] public set([RAW_FIR] value: R|kotlin/Int|): R|kotlin/Unit| { + field# = value# + } FILE RAW TO BODY: FILE: propertyWithGetterAndSetter.kt diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/propertyWithInitializer.txt b/analysis/low-level-api-fir/testdata/lazyResolve/propertyWithInitializer.txt index 5c6bbcd0a6a..d58b28d0261 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/propertyWithInitializer.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/propertyWithInitializer.txt @@ -76,7 +76,7 @@ FILE: propertyWithInitializer.kt public final [BODY_RESOLVE] fun resolveMe(): R|kotlin/Unit| { #(R|/property|) } - public final [STATUS] val property: R|kotlin/Int| = LAZY_EXPRESSION + public final [CONTRACTS] val property: R|kotlin/Int| = IntegerLiteral(10) [BODY_RESOLVE] public get(): R|kotlin/Int| FILE RAW TO BODY: diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/secondaryConstructor.txt b/analysis/low-level-api-fir/testdata/lazyResolve/secondaryConstructor.txt index 9698084f408..df3f97efb3a 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/secondaryConstructor.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/secondaryConstructor.txt @@ -142,7 +142,8 @@ FILE: secondaryConstructor.kt public final [BODY_RESOLVE] fun resolveMe(): R|kotlin/Unit| { R|/receive|(R|/A.A|(Int(42))) } - public final [STATUS] fun receive([RAW_FIR] value: R|A|): R|kotlin/Unit| { LAZY_BLOCK } + public final [CONTRACTS] fun receive([RAW_FIR] value: R|A|): R|kotlin/Unit| { + } public final [STATUS] class A : R|kotlin/Any| { public [STATUS] [ContainingClassKey=A] constructor([RAW_FIR] x: R|kotlin/Int|): R|A| { super() diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/topLevelFunctions.txt b/analysis/low-level-api-fir/testdata/lazyResolve/topLevelFunctions.txt index 8df0be6154f..cfb66981ab2 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/topLevelFunctions.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/topLevelFunctions.txt @@ -76,8 +76,11 @@ FILE: topLevelFunctions.kt public final [BODY_RESOLVE] fun resolveMe(): R|kotlin/Unit| { R|/receive|(R|/functionWithLazyBody|()) } - public final [STATUS] fun receive([RAW_FIR] value: R|kotlin/String|): R|kotlin/Unit| { LAZY_BLOCK } - public final [STATUS] fun functionWithLazyBody(): R|kotlin/String| { LAZY_BLOCK } + public final [CONTRACTS] fun receive([RAW_FIR] value: R|kotlin/String|): R|kotlin/Unit| { + } + public final [CONTRACTS] fun functionWithLazyBody(): R|kotlin/String| { + ^functionWithLazyBody String(42) + } FILE RAW TO BODY: FILE: topLevelFunctions.kt diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/topLevelFunctionsWithExpressionBodyAndExplicitType.txt b/analysis/low-level-api-fir/testdata/lazyResolve/topLevelFunctionsWithExpressionBodyAndExplicitType.txt index 5a14f4f8387..31129806485 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/topLevelFunctionsWithExpressionBodyAndExplicitType.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/topLevelFunctionsWithExpressionBodyAndExplicitType.txt @@ -76,8 +76,11 @@ FILE: topLevelFunctionsWithExpressionBodyAndExplicitType.kt public final [BODY_RESOLVE] fun resolveMe(): R|kotlin/Unit| { R|/receive|(R|/functionWithLazyBody|()) } - public final [STATUS] fun receive([RAW_FIR] value: R|kotlin/String|): R|kotlin/Unit| { LAZY_BLOCK } - public final [STATUS] fun functionWithLazyBody(): R|kotlin/String| { LAZY_BLOCK } + public final [CONTRACTS] fun receive([RAW_FIR] value: R|kotlin/String|): R|kotlin/Unit| { + } + public final [CONTRACTS] fun functionWithLazyBody(): R|kotlin/String| { + ^functionWithLazyBody String(42) + } FILE RAW TO BODY: FILE: topLevelFunctionsWithExpressionBodyAndExplicitType.kt diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/topLevelFunctionsWithImplicitType.txt b/analysis/low-level-api-fir/testdata/lazyResolve/topLevelFunctionsWithImplicitType.txt index 5aedc853076..c6e434e5745 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/topLevelFunctionsWithImplicitType.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/topLevelFunctionsWithImplicitType.txt @@ -76,7 +76,8 @@ FILE: topLevelFunctionsWithImplicitType.kt public final [BODY_RESOLVE] fun resolveMe(): R|kotlin/Unit| { R|/receive|(R|/functionWithLazyBody|()) } - public final [STATUS] fun receive([RAW_FIR] value: R|kotlin/String|): R|kotlin/Unit| { LAZY_BLOCK } + public final [CONTRACTS] fun receive([RAW_FIR] value: R|kotlin/String|): R|kotlin/Unit| { + } public final [IMPLICIT_TYPES_BODY_RESOLVE] fun functionWithLazyBody(): R|kotlin/String| { ^functionWithLazyBody String(42) } diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java index d55d4590dee..d0fcfe6cdca 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java @@ -1257,6 +1257,18 @@ public class DiagnosisCompilerFirTestdataTestGenerated extends AbstractDiagnosis KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolve/contracts"), Pattern.compile("^([^.]+)\\.kt$"), null, true); } + @Test + @TestMetadata("contractFromOtherModule.kt") + public void testContractFromOtherModule() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/contracts/contractFromOtherModule.kt"); + } + + @Test + @TestMetadata("contractFromOtherModule_samePackage.kt") + public void testContractFromOtherModule_samePackage() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/contracts/contractFromOtherModule_samePackage.kt"); + } + @Test @TestMetadata("genericContract.kt") public void testGenericContract() throws Exception { diff --git a/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java b/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java index 4b506f63ab4..6857f9d352a 100644 --- a/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java +++ b/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java @@ -1092,6 +1092,16 @@ public class LazyBodyIsNotTouchedTilContractsPhaseTestGenerated extends Abstract KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolve/contracts"), Pattern.compile("^([^.]+)\\.kt$"), null, true); } + @TestMetadata("contractFromOtherModule.kt") + public void testContractFromOtherModule() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/contracts/contractFromOtherModule.kt"); + } + + @TestMetadata("contractFromOtherModule_samePackage.kt") + public void testContractFromOtherModule_samePackage() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/contracts/contractFromOtherModule_samePackage.kt"); + } + @TestMetadata("genericContract.kt") public void testGenericContract() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/contracts/genericContract.kt"); diff --git a/compiler/fir/analysis-tests/testData/resolve/contracts/contractFromOtherModule.fir.txt b/compiler/fir/analysis-tests/testData/resolve/contracts/contractFromOtherModule.fir.txt new file mode 100644 index 00000000000..fd3d04808a0 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/contracts/contractFromOtherModule.fir.txt @@ -0,0 +1,25 @@ +Module: lib +FILE: module_lib_contractFromOtherModule.kt + package lib + + public final fun requireIsTrue(value: R|kotlin/Boolean|): R|kotlin/Unit| + [R|Contract description] + < + Returns(WILDCARD) -> value + > + { + when () { + R|/value|.R|kotlin/Boolean.not|() -> { + throw R|java/lang/IllegalArgumentException.IllegalArgumentException|() + } + } + + } +Module: main +FILE: module_main_contractFromOtherModule.kt + package main + + public final fun test(s: R|kotlin/Any|): R|kotlin/Unit| { + R|lib/requireIsTrue|((R|/s| is R|kotlin/String|)) + R|/s|.R|kotlin/String.length| + } diff --git a/compiler/fir/analysis-tests/testData/resolve/contracts/contractFromOtherModule.kt b/compiler/fir/analysis-tests/testData/resolve/contracts/contractFromOtherModule.kt new file mode 100644 index 00000000000..f43ffd075d7 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/contracts/contractFromOtherModule.kt @@ -0,0 +1,26 @@ +// SKIP_JAVAC +// This directive is needed to skip this test in LazyBodyIsNotTouchedTilContractsPhaseTestGenerated, +// because it fails to parse module structure of multimodule test + +// WITH_STDLIB + +// MODULE: lib +package lib + +import kotlin.contracts.* + +fun requireIsTrue(value: Boolean) contract [ + returns() implies value +] { + if (!value) throw IllegalArgumentException() +} + +// MODULE: main(lib) +package main + +import lib.requireIsTrue + +fun test(s: Any) { + requireIsTrue(s is String) + s.length +} diff --git a/compiler/fir/analysis-tests/testData/resolve/contracts/contractFromOtherModule_samePackage.fir.txt b/compiler/fir/analysis-tests/testData/resolve/contracts/contractFromOtherModule_samePackage.fir.txt new file mode 100644 index 00000000000..8c0b1dad023 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/contracts/contractFromOtherModule_samePackage.fir.txt @@ -0,0 +1,25 @@ +Module: lib +FILE: module_lib_contractFromOtherModule_samePackage.kt + package main + + public final fun requireIsTrue(value: R|kotlin/Boolean|): R|kotlin/Unit| + [R|Contract description] + < + Returns(WILDCARD) -> value + > + { + when () { + R|/value|.R|kotlin/Boolean.not|() -> { + throw R|java/lang/IllegalArgumentException.IllegalArgumentException|() + } + } + + } +Module: main +FILE: module_main_contractFromOtherModule_samePackage.kt + package main + + public final fun test(s: R|kotlin/Any|): R|kotlin/Unit| { + R|main/requireIsTrue|((R|/s| is R|kotlin/String|)) + R|/s|.R|kotlin/String.length| + } diff --git a/compiler/fir/analysis-tests/testData/resolve/contracts/contractFromOtherModule_samePackage.kt b/compiler/fir/analysis-tests/testData/resolve/contracts/contractFromOtherModule_samePackage.kt new file mode 100644 index 00000000000..391f0afb8b6 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/contracts/contractFromOtherModule_samePackage.kt @@ -0,0 +1,24 @@ +// SKIP_JAVAC +// This directive is needed to skip this test in LazyBodyIsNotTouchedTilContractsPhaseTestGenerated, +// because it fails to parse module structure of multimodule test + +// WITH_STDLIB + +// MODULE: lib +package main + +import kotlin.contracts.* + +fun requireIsTrue(value: Boolean) contract [ + returns() implies value +] { + if (!value) throw IllegalArgumentException() +} + +// MODULE: main(lib) +package main + +fun test(s: Any) { + requireIsTrue(s is String) + s.length +} diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java index f4571ad69ae..5e5dd2ae73b 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java @@ -1257,6 +1257,18 @@ public class FirDiagnosticTestGenerated extends AbstractFirDiagnosticTest { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolve/contracts"), Pattern.compile("^([^.]+)\\.kt$"), null, true); } + @Test + @TestMetadata("contractFromOtherModule.kt") + public void testContractFromOtherModule() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/contracts/contractFromOtherModule.kt"); + } + + @Test + @TestMetadata("contractFromOtherModule_samePackage.kt") + public void testContractFromOtherModule_samePackage() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/contracts/contractFromOtherModule_samePackage.kt"); + } + @Test @TestMetadata("genericContract.kt") public void testGenericContract() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java index 707746bf504..f0e03168775 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java @@ -1257,6 +1257,18 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolve/contracts"), Pattern.compile("^([^.]+)\\.kt$"), null, true); } + @Test + @TestMetadata("contractFromOtherModule.kt") + public void testContractFromOtherModule() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/contracts/contractFromOtherModule.kt"); + } + + @Test + @TestMetadata("contractFromOtherModule_samePackage.kt") + public void testContractFromOtherModule_samePackage() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/contracts/contractFromOtherModule_samePackage.kt"); + } + @Test @TestMetadata("genericContract.kt") public void testGenericContract() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt index 1aa94f051ad..af651dc79d6 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.declarations.utils.hasExplicitBackingField +import org.jetbrains.kotlin.fir.declarations.utils.isLocal import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.resolve.FirRegularTowerDataContexts @@ -22,6 +23,7 @@ import org.jetbrains.kotlin.fir.resolve.transformers.TransformImplicitType import org.jetbrains.kotlin.fir.resolve.transformers.contracts.runContractResolveForLocalClass import org.jetbrains.kotlin.fir.scopes.FakeOverrideTypeCalculator import org.jetbrains.kotlin.fir.scopes.fakeOverrideSubstitution +import org.jetbrains.kotlin.fir.symbols.ensureResolved import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef @@ -225,6 +227,8 @@ private class ReturnTypeCalculatorWithJump( ) } + resolvedToContractsIfNecessary(declaration) + val returnTypeRef = declaration.returnTypeRef if (returnTypeRef is FirResolvedTypeRef) return returnTypeRef @@ -257,6 +261,20 @@ private class ReturnTypeCalculatorWithJump( } } + private fun resolvedToContractsIfNecessary(declaration: FirCallableDeclaration) { + if (declaration.resolvePhase >= FirResolvePhase.CONTRACTS) return + + val canHaveContracts = when { + declaration is FirProperty && !declaration.isLocal -> true + declaration is FirSimpleFunction && !declaration.isLocal -> true + else -> false + } + + if (canHaveContracts) { + declaration.ensureResolved(FirResolvePhase.CONTRACTS) + } + } + @OptIn(PrivateForInline::class) private fun computeReturnTypeRef(declaration: FirCallableDeclaration): FirResolvedTypeRef { // To properly transform and resolve declaration's type, we need to use its module's session diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/useBeforeDeclaration.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/useBeforeDeclaration.fir.kt index e3373b8c9d1..a3fe3b8f741 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/useBeforeDeclaration.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/useBeforeDeclaration.fir.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect // !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER // !OPT_IN: kotlin.contracts.ExperimentalContracts diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/useBeforeDeclaration.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/useBeforeDeclaration.kt index f57e07be075..ad94111a8ee 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/useBeforeDeclaration.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/useBeforeDeclaration.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect // !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER // !OPT_IN: kotlin.contracts.ExperimentalContracts diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/1.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/1.fir.kt index 87e32f3cf3c..cef0d9586af 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/1.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/1.fir.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/1.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/1.kt index c44b89ac819..897b378581d 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/1.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/1.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/2.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/2.fir.kt index f0a18380762..0b016ef6fdb 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/2.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/2.fir.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/2.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/2.kt index 8f03cbb14fb..842d4b8ba5e 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/2.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/2.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/3.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/3.fir.kt index ee9a52e409d..7eccd38a3af 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/3.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/3.fir.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/3.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/3.kt index c66999a9c53..0d4012f7fbc 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/3.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/3.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // LANGUAGE: +WarnAboutNonExhaustiveWhenOnAlgebraicTypes // !OPT_IN: kotlin.contracts.ExperimentalContracts // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/4.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/4.fir.kt index 2f696537200..cb0a1afcaf6 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/4.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/4.fir.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/4.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/4.kt index d243eea9674..eb4b40e38a4 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/4.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/4.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/5.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/5.fir.kt index b2ffd2eb6db..34e9552498a 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/5.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/5.fir.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/5.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/5.kt index 802cec01c4f..d7a36d50b6a 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/5.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/neg/5.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/1.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/1.kt index 3f7422cd839..6ab74a7029d 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/1.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/1.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // FIR_IDENTICAL // !OPT_IN: kotlin.contracts.ExperimentalContracts // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/2.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/2.kt index 88cf6fab843..b2a78dafcd3 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/2.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/2.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // FIR_IDENTICAL // !OPT_IN: kotlin.contracts.ExperimentalContracts // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/3.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/3.fir.kt index 5145cd2aa52..53329e9af9d 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/3.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/3.fir.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/3.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/3.kt index c2724846841..2422df4bc51 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/3.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/3.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/4.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/4.fir.kt index aa844aa40ee..bf67f755518 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/4.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/4.fir.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/4.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/4.kt index f26c64f934c..25fa01fa62b 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/4.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/4.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/6.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/6.fir.kt index 5aa27d151e5..1827ea9ba89 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/6.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/6.fir.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts // FILE: contracts.kt diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/6.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/6.kt index a751c7030a8..5fd04f941ac 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/6.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/controlFlow/initialization/pos/6.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts /* diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/1.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/1.fir.kt index e5f884bc272..bd8509dd768 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/1.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/1.fir.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/1.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/1.kt index 41ab5ff073a..26714ec7ab9 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/1.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/1.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/2.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/2.fir.kt index 3457fc6ff3a..df3a2fab230 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/2.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/2.fir.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/2.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/2.kt index fc11c42bb82..dcfb84fe14a 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/2.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/2.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/9.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/9.fir.kt index 9c17ef67b4c..3b3dfaf4962 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/9.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/9.fir.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/9.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/9.kt index c166cb65a9d..752475c82f8 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/9.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/9.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/1.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/1.fir.kt index 163f25637e7..28d2a0005b8 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/1.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/1.fir.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/1.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/1.kt index 46d106db2fd..54ac30c5673 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/1.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/1.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/11.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/11.fir.kt index 4dfb760b070..3b226006a5d 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/11.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/11.fir.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts // FILE: contracts.kt diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/11.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/11.kt index bdaa96f7413..c567da01214 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/11.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/11.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts /* diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/12.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/12.fir.kt index 78d3d058aac..a16967a26bf 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/12.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/12.fir.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/12.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/12.kt index d9858178ad9..775edc2f8bc 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/12.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/12.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/2.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/2.fir.kt index 44103d11882..10ad2ff982b 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/2.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/2.fir.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/2.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/2.kt index 3aad83937ca..1ecf608b500 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/2.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/2.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/8.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/8.fir.kt index 6a85310a0cc..e26c1df5efb 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/8.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/8.fir.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts // FILE: contracts.kt diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/8.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/8.kt index 24320e5a7bb..c318366cc86 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/8.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/8.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // LANGUAGE: +WarnAboutNonExhaustiveWhenOnAlgebraicTypes // !OPT_IN: kotlin.contracts.ExperimentalContracts diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/9.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/9.fir.kt index 124262addad..332f792891c 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/9.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/9.fir.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts // FILE: contracts.kt diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/9.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/9.kt index d8ca9a072a3..18e81d6d520 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/9.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/9.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts /* diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractFunction/pos/1.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractFunction/pos/1.fir.kt index df554442047..e757ca131a9 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractFunction/pos/1.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractFunction/pos/1.fir.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !OPT_IN: kotlin.contracts.ExperimentalContracts import kotlin.contracts.* @@ -16,6 +15,15 @@ fun case_2_1(x: Number?) { println(x.toByte()) } +// TESTCASE NUMBER: 3 +class Child : Base() { + fun case_3_1(x: Any?) { + if (case_3_2(x)) { + x.length + } + } +} + // TESTCASE NUMBER: 1 fun case_1_2(x: Any?): Boolean { contract { returns(true) implies (x is String) } @@ -27,3 +35,11 @@ fun case_2_2(x: Any?) { contract { returns() implies(x != null) } if (x == null) throw Exception() } + +// TESTCASE NUMBER: 3 +open class Base { + fun case_3_2(x: Any?): Boolean { + contract { returns(true) implies (x is String) } + return x is String + } +} \ No newline at end of file diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractFunction/pos/1.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractFunction/pos/1.kt index 24dce704718..57b5a04dd67 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractFunction/pos/1.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractFunction/pos/1.kt @@ -1,5 +1,4 @@ // !OPT_IN: kotlin.contracts.ExperimentalContracts -// FIR_IDE_IGNORE /* * KOTLIN DIAGNOSTICS NOT LINKED SPEC TEST (POSITIVE) @@ -24,6 +23,15 @@ fun case_2_1(x: Number?) { println(x.toByte()) } +// TESTCASE NUMBER: 3 +class Child : Base() { + fun case_3_1(x: Any?) { + if (case_3_2(x)) { + x.length + } + } +} + // TESTCASE NUMBER: 1 fun case_1_2(x: Any?): Boolean { contract { returns(true) implies (x is String) } @@ -36,4 +44,10 @@ fun case_2_2(x: Any?) { if (x == null) throw Exception() } - +// TESTCASE NUMBER: 3 +open class Base { + fun case_3_2(x: Any?): Boolean { + contract { returns(true) implies (x is String) } + return x is String + } +} \ No newline at end of file diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractFunction/pos/1.txt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractFunction/pos/1.txt index 365216337a8..4ea625f83f0 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractFunction/pos/1.txt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractFunction/pos/1.txt @@ -8,3 +8,23 @@ public fun case_2_1(/*0*/ x: kotlin.Number?): kotlin.Unit public fun case_2_2(/*0*/ x: kotlin.Any?): kotlin.Unit Returns(WILDCARD) -> x != null +public open class Base { + public constructor Base() + public final fun case_3_2(/*0*/ x: kotlin.Any?): kotlin.Boolean + Returns(TRUE) -> x is String + + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Child : Base { + public constructor Child() + public final fun case_3_1(/*0*/ x: kotlin.Any?): kotlin.Unit + public final override /*1*/ /*fake_override*/ fun case_3_2(/*0*/ x: kotlin.Any?): kotlin.Boolean + Returns(TRUE) -> x is String + + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +}