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 +}