From f083edfac283f3487e40d056cbf7b660b4055f96 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Thu, 26 Dec 2019 11:53:27 +0300 Subject: [PATCH] Allow contracts on final non-override members since 1.4 --- ...endDiagnosticsTestWithStdlibGenerated.java | 38 +++++-- .../resolve/FunctionDescriptorResolver.kt | 4 +- .../checkers/ContractNotAllowedCallChecker.kt | 41 +++++-- .../jetbrains/kotlin/psi/KtNamedFunction.java | 6 +- .../jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt | 4 +- ...es.fir.kt => contractCallSites.1.3.fir.kt} | 2 +- ...tCallSites.kt => contractCallSites.1.3.kt} | 2 +- ...allSites.txt => contractCallSites.1.3.txt} | 0 .../dsl/errors/contractCallSites.1.4.fir.kt | 101 ++++++++++++++++++ .../dsl/errors/contractCallSites.1.4.kt | 101 ++++++++++++++++++ .../dsl/errors/contractCallSites.1.4.txt | 53 +++++++++ ....fir.kt => referenceToProperty.1.3.fir.kt} | 2 +- ...Property.kt => referenceToProperty.1.3.kt} | 2 +- ...operty.txt => referenceToProperty.1.3.txt} | 0 .../dsl/errors/referenceToProperty.1.4.fir.kt | 14 +++ .../dsl/errors/referenceToProperty.1.4.kt | 14 +++ .../dsl/errors/referenceToProperty.1.4.txt | 10 ++ ...ences.fir.kt => typeReferences.1.3.fir.kt} | 2 +- ...ypeReferences.kt => typeReferences.1.3.kt} | 2 +- ...eReferences.txt => typeReferences.1.3.txt} | 0 .../dsl/errors/typeReferences.1.4.fir.kt | 53 +++++++++ .../dsl/errors/typeReferences.1.4.kt | 53 +++++++++ .../dsl/errors/typeReferences.1.4.txt | 22 ++++ .../smartcasts/contractsOnMembers.fir.kt | 31 ++++++ .../smartcasts/contractsOnMembers.kt | 31 ++++++ .../smartcasts/contractsOnMembers.txt | 17 +++ .../contracts/contractsOnMembers.kt | 19 ++++ .../contracts/contractsOnMembers.txt | 11 ++ .../DiagnosticsTestWithStdLibGenerated.java | 38 +++++-- ...ticsTestWithStdLibUsingJavacGenerated.java | 38 +++++-- .../jvm/compiler/LoadJavaTestGenerated.java | 5 + .../compiler/ir/IrLoadJavaTestGenerated.java | 5 + .../LoadJavaUsingJavacTestGenerated.java | 5 + .../kotlin/config/LanguageVersionSettings.kt | 1 + 34 files changed, 682 insertions(+), 45 deletions(-) rename compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/{contractCallSites.fir.kt => contractCallSites.1.3.fir.kt} (98%) rename compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/{contractCallSites.kt => contractCallSites.1.3.kt} (98%) rename compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/{contractCallSites.txt => contractCallSites.1.3.txt} (100%) create mode 100644 compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.1.4.fir.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.1.4.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.1.4.txt rename compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/{referenceToProperty.fir.kt => referenceToProperty.1.3.fir.kt} (89%) rename compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/{referenceToProperty.kt => referenceToProperty.1.3.kt} (90%) rename compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/{referenceToProperty.txt => referenceToProperty.1.3.txt} (100%) create mode 100644 compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.1.4.fir.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.1.4.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.1.4.txt rename compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/{typeReferences.fir.kt => typeReferences.1.3.fir.kt} (96%) rename compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/{typeReferences.kt => typeReferences.1.3.kt} (97%) rename compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/{typeReferences.txt => typeReferences.1.3.txt} (100%) create mode 100644 compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.1.4.fir.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.1.4.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.1.4.txt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/contractsOnMembers.fir.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/contractsOnMembers.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/contractsOnMembers.txt create mode 100644 compiler/testData/loadJava/compiledKotlinWithStdlib/contracts/contractsOnMembers.kt create mode 100644 compiler/testData/loadJava/compiledKotlinWithStdlib/contracts/contractsOnMembers.txt diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestWithStdlibGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestWithStdlibGenerated.java index 191f91ff8de..285422da074 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestWithStdlibGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestWithStdlibGenerated.java @@ -1188,9 +1188,14 @@ public class FirOldFrontendDiagnosticsTestWithStdlibGenerated extends AbstractFi runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/callInContractDescription.kt"); } - @TestMetadata("contractCallSites.kt") - public void testContractCallSites() throws Exception { - runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.kt"); + @TestMetadata("contractCallSites.1.3.kt") + public void testContractCallSites_1_3() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.1.3.kt"); + } + + @TestMetadata("contractCallSites.1.4.kt") + public void testContractCallSites_1_4() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.1.4.kt"); } @TestMetadata("emptyContract.kt") @@ -1233,14 +1238,24 @@ public class FirOldFrontendDiagnosticsTestWithStdlibGenerated extends AbstractFi runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/recursiveContractCustomContractFunction.kt"); } - @TestMetadata("referenceToProperty.kt") - public void testReferenceToProperty() throws Exception { - runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.kt"); + @TestMetadata("referenceToProperty.1.3.kt") + public void testReferenceToProperty_1_3() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.1.3.kt"); } - @TestMetadata("typeReferences.kt") - public void testTypeReferences() throws Exception { - runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.kt"); + @TestMetadata("referenceToProperty.1.4.kt") + public void testReferenceToProperty_1_4() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.1.4.kt"); + } + + @TestMetadata("typeReferences.1.3.kt") + public void testTypeReferences_1_3() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.1.3.kt"); + } + + @TestMetadata("typeReferences.1.4.kt") + public void testTypeReferences_1_4() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.1.4.kt"); } @TestMetadata("unlabeledReceiver.kt") @@ -1320,6 +1335,11 @@ public class FirOldFrontendDiagnosticsTestWithStdlibGenerated extends AbstractFi runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/compositions.kt"); } + @TestMetadata("contractsOnMembers.kt") + public void testContractsOnMembers() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/contractsOnMembers.kt"); + } + @TestMetadata("deeplyNested.kt") public void testDeeplyNested() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/deeplyNested.kt"); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt index 6ad1b20bd36..6c7752f2524 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt @@ -23,7 +23,6 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.getReceiverTypeFromFunctionType import org.jetbrains.kotlin.builtins.getValueParameterTypesFromFunctionType import org.jetbrains.kotlin.builtins.isBuiltinFunctionalType -import org.jetbrains.kotlin.config.AnalysisFlags import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.contracts.description.ContractProviderKey @@ -259,8 +258,9 @@ class FunctionDescriptorResolver( if (function !is KtNamedFunction) return null val isContractsEnabled = languageVersionSettings.supportsFeature(LanguageFeature.AllowContractsForCustomFunctions) + val isAllowedOnMembers = languageVersionSettings.supportsFeature(LanguageFeature.AllowContractsForNonOverridableMembers) - if (!isContractsEnabled || !function.mayHaveContract()) return null + if (!isContractsEnabled || !function.mayHaveContract(isAllowedOnMembers)) return null return LazyContractProvider(storageManager) { AstLoadingFilter.forceAllowTreeLoading(function.containingFile, ThrowableComputable { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/ContractNotAllowedCallChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/ContractNotAllowedCallChecker.kt index d082c0e4358..9fee0c1db90 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/ContractNotAllowedCallChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/ContractNotAllowedCallChecker.kt @@ -6,11 +6,9 @@ package org.jetbrains.kotlin.resolve.calls.checkers import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.contracts.parsing.isContractCallDescriptor -import org.jetbrains.kotlin.descriptors.FunctionDescriptor -import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor -import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor -import org.jetbrains.kotlin.descriptors.isOverridable +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.psiUtil.isFirstStatement @@ -25,6 +23,8 @@ object ContractNotAllowedCallChecker : CallChecker { val descriptor = resolvedCall.resultingDescriptor as? FunctionDescriptor ?: return if (!descriptor.isContractCallDescriptor()) return + val allowedOnMembers = context.languageVersionSettings.supportsFeature(LanguageFeature.AllowContractsForNonOverridableMembers) + val callElement = resolvedCall.call.callElement var hasErrors = false @@ -40,7 +40,24 @@ object ContractNotAllowedCallChecker : CallChecker { contractNotAllowed("Contracts are allowed only for functions") var inFunctionBodyBlock = true - if (scope.ownerDescriptor.containingDeclaration !is PackageFragmentDescriptor + + val declarationOwner = scope.ownerDescriptor.containingDeclaration + val acceptableParent = if (allowedOnMembers) { + var owner = declarationOwner + var result = true + while (owner !is PackageFragmentDescriptor) { + if (owner !is ClassDescriptor) { + result = false + break + } + owner = owner.containingDeclaration + } + result + } else { + declarationOwner is PackageFragmentDescriptor + } + + if (!acceptableParent || scope.kind != LexicalScopeKind.CODE_BLOCK || (scope.parent as? LexicalScope)?.kind != LexicalScopeKind.FUNCTION_INNER_SCOPE ) { @@ -48,13 +65,23 @@ object ContractNotAllowedCallChecker : CallChecker { contractNotAllowed("Contracts are allowed only in function body block") inFunctionBodyBlock = false } else { - contractNotAllowed("Contracts are allowed only for top-level functions") + val message = if (allowedOnMembers) + "Contracts are allowed only for functions" + else + "Contracts are allowed only for top-level functions" + contractNotAllowed(message) } } if (functionDescriptor?.isOperator == true) contractNotAllowed("Contracts are not allowed for operator functions") - if (functionDescriptor?.isOverridable == true) contractNotAllowed("Contracts are not allowed for open functions") + + if (!allowedOnMembers && functionDescriptor?.isOverridable == true) { + contractNotAllowed("Contracts are not allowed for open functions") + } + if (allowedOnMembers && functionDescriptor?.isOverridableOrOverrides == true) { + contractNotAllowed("Contracts are not allowed for open or override functions") + } if (!callElement.isFirstStatement() && inFunctionBodyBlock) { contractNotAllowed("Contract should be the first statement") diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/KtNamedFunction.java b/compiler/psi/src/org/jetbrains/kotlin/psi/KtNamedFunction.java index 8cee9f08c7c..17b960da41b 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/KtNamedFunction.java +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/KtNamedFunction.java @@ -246,11 +246,15 @@ public class KtNamedFunction extends KtTypeParameterListOwnerStub flatMapDescendantsOfTypeVisitor( // ----------- Contracts ------------------------------------------------------------------------------------------------------------------- -fun KtNamedFunction.isContractPresentPsiCheck(): Boolean { +fun KtNamedFunction.isContractPresentPsiCheck(isAllowedOnMembers: Boolean): Boolean { val contractAllowedHere = - isTopLevel && + (isAllowedOnMembers || isTopLevel) && hasBlockBody() && !hasModifier(KtTokens.OPERATOR_KEYWORD) if (!contractAllowedHere) return false diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.1.3.fir.kt similarity index 98% rename from compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.fir.kt rename to compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.1.3.fir.kt index b90ac27984b..5599da3b303 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.1.3.fir.kt @@ -1,4 +1,4 @@ -// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect +// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect -AllowContractsForNonOverridableMembers // !USE_EXPERIMENTAL: kotlin.contracts.ExperimentalContracts // !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER -NOTHING_TO_INLINE -ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS -ABSTRACT_FUNCTION_WITH_BODY -UNUSED_PARAMETER -UNUSED_VARIABLE -EXPERIMENTAL_FEATURE_WARNING diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.1.3.kt similarity index 98% rename from compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.kt rename to compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.1.3.kt index b98c067acef..6c915667789 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.1.3.kt @@ -1,4 +1,4 @@ -// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect +// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect -AllowContractsForNonOverridableMembers // !USE_EXPERIMENTAL: kotlin.contracts.ExperimentalContracts // !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER -NOTHING_TO_INLINE -ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS -ABSTRACT_FUNCTION_WITH_BODY -UNUSED_PARAMETER -UNUSED_VARIABLE -EXPERIMENTAL_FEATURE_WARNING diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.txt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.1.3.txt similarity index 100% rename from compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.txt rename to compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.1.3.txt diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.1.4.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.1.4.fir.kt new file mode 100644 index 00000000000..a6f4fb9e283 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.1.4.fir.kt @@ -0,0 +1,101 @@ +// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect +AllowContractsForNonOverridableMembers +// !USE_EXPERIMENTAL: kotlin.contracts.ExperimentalContracts +// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER -NOTHING_TO_INLINE -ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS -ABSTRACT_FUNCTION_WITH_BODY -UNUSED_PARAMETER -UNUSED_VARIABLE -EXPERIMENTAL_FEATURE_WARNING + +import kotlin.contracts.* + + +// ============= Class ===================== +open class Class { + fun member(x: Boolean) { + contract { returns() implies (x) } + } + + inline fun inlineMember(x: Boolean) { + contract { returns() implies (x) } + } + + abstract fun abstractMember(x: Boolean) { + contract { returns() implies (x) } + } + + open fun openMemeber(x: Boolean) { + contract { returns() implies (x) } + } + + suspend fun suspendMember(x: Boolean) { + contract { returns() implies (x) } + } +} + +open class Inheritor : Class() { + override fun openMemeber(x: Boolean) { + contract { returns() implies (x) } + } + + final override fun abstractMember(x: Boolean) { + contract { returns() implies (x) } + } +} + +interface Interface { + fun implicitlyOpenMember(x: Boolean) { + contract { returns() implies (x) } + } +} + +// ============= Top-level ===================== +fun topLevel(x: Boolean) { + contract { returns() implies (x) } +} + +inline fun inlineTopLevel(x: Boolean) { + contract { returns() implies (x) } +} + +suspend fun suspendTopLevel(x: Boolean) { + contract { returns() implies (x) } +} + +// Top-level operator +operator fun Boolean.plus(x: Boolean): Boolean { + contract { returns() implies (x) } + return x +} + +val topLevelLambda: (Boolean) -> Unit = { x: Boolean -> + contract { returns() implies (x) } +} + +val topLevelAnonymousFunction = fun (x: Boolean) { + contract { returns() implies (x) } +} + +var topLevelPropertyAccessors: Int? = 42 + get() { + contract { returns() implies (field != null) } + return 42 + } + set(value) { + contract { returns() implies (field != null) } + } + + +// ============= Local ===================== +fun test() { + fun localDeclaration(x: Boolean) { + contract { returns() implies (x) } + } + + suspend fun suspendlocalDeclaration(x: Boolean) { + contract { returns() implies (x) } + } + + val localAnonymousFunction = fun (x: Boolean) { + contract { returns() implies (x) } + } + + val localLambda: (Boolean) -> Unit = { x: Boolean -> + contract { returns() implies (x) } + } +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.1.4.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.1.4.kt new file mode 100644 index 00000000000..3783e353b0b --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.1.4.kt @@ -0,0 +1,101 @@ +// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect +AllowContractsForNonOverridableMembers +// !USE_EXPERIMENTAL: kotlin.contracts.ExperimentalContracts +// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER -NOTHING_TO_INLINE -ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS -ABSTRACT_FUNCTION_WITH_BODY -UNUSED_PARAMETER -UNUSED_VARIABLE -EXPERIMENTAL_FEATURE_WARNING + +import kotlin.contracts.* + + +// ============= Class ===================== +open class Class { + fun member(x: Boolean) { + contract { returns() implies (x) } + } + + inline fun inlineMember(x: Boolean) { + contract { returns() implies (x) } + } + + abstract fun abstractMember(x: Boolean) { + contract { returns() implies (x) } + } + + open fun openMemeber(x: Boolean) { + contract { returns() implies (x) } + } + + suspend fun suspendMember(x: Boolean) { + contract { returns() implies (x) } + } +} + +open class Inheritor : Class() { + override fun openMemeber(x: Boolean) { + contract { returns() implies (x) } + } + + final override fun abstractMember(x: Boolean) { + contract { returns() implies (x) } + } +} + +interface Interface { + fun implicitlyOpenMember(x: Boolean) { + contract { returns() implies (x) } + } +} + +// ============= Top-level ===================== +fun topLevel(x: Boolean) { + contract { returns() implies (x) } +} + +inline fun inlineTopLevel(x: Boolean) { + contract { returns() implies (x) } +} + +suspend fun suspendTopLevel(x: Boolean) { + contract { returns() implies (x) } +} + +// Top-level operator +operator fun Boolean.plus(x: Boolean): Boolean { + contract { returns() implies (x) } + return x +} + +val topLevelLambda: (Boolean) -> Unit = { x: Boolean -> + contract { returns() implies (x) } +} + +val topLevelAnonymousFunction = fun (x: Boolean) { + contract { returns() implies (x) } +} + +var topLevelPropertyAccessors: Int? = 42 + get() { + contract { returns() implies (field != null) } + return 42 + } + set(value) { + contract { returns() implies (field != null) } + } + + +// ============= Local ===================== +fun test() { + fun localDeclaration(x: Boolean) { + contract { returns() implies (x) } + } + + suspend fun suspendlocalDeclaration(x: Boolean) { + contract { returns() implies (x) } + } + + val localAnonymousFunction = fun (x: Boolean) { + contract { returns() implies (x) } + } + + val localLambda: (Boolean) -> Unit = { x: Boolean -> + contract { returns() implies (x) } + } +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.1.4.txt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.1.4.txt new file mode 100644 index 00000000000..782ee3bf818 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.1.4.txt @@ -0,0 +1,53 @@ +package + +public val topLevelAnonymousFunction: (kotlin.Boolean) -> kotlin.Unit +public val topLevelLambda: (kotlin.Boolean) -> kotlin.Unit +public var topLevelPropertyAccessors: kotlin.Int? +public inline fun inlineTopLevel(/*0*/ x: kotlin.Boolean): kotlin.Unit + Returns(WILDCARD) -> x + +public suspend fun suspendTopLevel(/*0*/ x: kotlin.Boolean): kotlin.Unit + Returns(WILDCARD) -> x + +public fun test(): kotlin.Unit +public fun topLevel(/*0*/ x: kotlin.Boolean): kotlin.Unit + Returns(WILDCARD) -> x + +public operator fun kotlin.Boolean.plus(/*0*/ x: kotlin.Boolean): kotlin.Boolean + +public open class Class { + public constructor Class() + public abstract fun abstractMember(/*0*/ x: kotlin.Boolean): kotlin.Unit + 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 final inline fun inlineMember(/*0*/ x: kotlin.Boolean): kotlin.Unit + public final fun member(/*0*/ x: kotlin.Boolean): kotlin.Unit + public open fun openMemeber(/*0*/ x: kotlin.Boolean): kotlin.Unit + public final suspend fun suspendMember(/*0*/ x: kotlin.Boolean): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public open class Inheritor : Class { + public constructor Inheritor() + public final override /*1*/ fun abstractMember(/*0*/ x: kotlin.Boolean): kotlin.Unit + 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 final override /*1*/ inline /*fake_override*/ fun inlineMember(/*0*/ x: kotlin.Boolean): kotlin.Unit + Returns(WILDCARD) -> x + + public final override /*1*/ /*fake_override*/ fun member(/*0*/ x: kotlin.Boolean): kotlin.Unit + Returns(WILDCARD) -> x + + public open override /*1*/ fun openMemeber(/*0*/ x: kotlin.Boolean): kotlin.Unit + public final override /*1*/ suspend /*fake_override*/ fun suspendMember(/*0*/ x: kotlin.Boolean): kotlin.Unit + Returns(WILDCARD) -> x + + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface Interface { + 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 fun implicitlyOpenMember(/*0*/ x: kotlin.Boolean): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.1.3.fir.kt similarity index 89% rename from compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.fir.kt rename to compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.1.3.fir.kt index 59f6cc5db43..d5d09e9f68a 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.1.3.fir.kt @@ -1,4 +1,4 @@ -// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect +// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect -AllowContractsForNonOverridableMembers // !USE_EXPERIMENTAL: kotlin.contracts.ExperimentalContracts // !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.1.3.kt similarity index 90% rename from compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.kt rename to compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.1.3.kt index c471a2aa1ed..e188c5fe8d6 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.1.3.kt @@ -1,4 +1,4 @@ -// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect +// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect -AllowContractsForNonOverridableMembers // !USE_EXPERIMENTAL: kotlin.contracts.ExperimentalContracts // !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.txt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.1.3.txt similarity index 100% rename from compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.txt rename to compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.1.3.txt diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.1.4.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.1.4.fir.kt new file mode 100644 index 00000000000..a555c1111e7 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.1.4.fir.kt @@ -0,0 +1,14 @@ +// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect +AllowContractsForNonOverridableMembers +// !USE_EXPERIMENTAL: kotlin.contracts.ExperimentalContracts +// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER + +import kotlin.contracts.* + +class Foo(val x: Int?) { + fun isXNull(): Boolean { + contract { + returns(false) implies (x != null) + } + return x != null + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.1.4.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.1.4.kt new file mode 100644 index 00000000000..c362cd30c60 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.1.4.kt @@ -0,0 +1,14 @@ +// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect +AllowContractsForNonOverridableMembers +// !USE_EXPERIMENTAL: kotlin.contracts.ExperimentalContracts +// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER + +import kotlin.contracts.* + +class Foo(val x: Int?) { + fun isXNull(): Boolean { + contract { + returns(false) implies (x != null) + } + return x != null + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.1.4.txt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.1.4.txt new file mode 100644 index 00000000000..30a0cc33134 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.1.4.txt @@ -0,0 +1,10 @@ +package + +public final class Foo { + public constructor Foo(/*0*/ x: kotlin.Int?) + public final val x: kotlin.Int? + 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 final fun isXNull(): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.1.3.fir.kt similarity index 96% rename from compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.fir.kt rename to compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.1.3.fir.kt index 54e338c282f..9d7206cece6 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.1.3.fir.kt @@ -1,4 +1,4 @@ -// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect +// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect -AllowContractsForNonOverridableMembers // !USE_EXPERIMENTAL: kotlin.contracts.ExperimentalContracts // !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.1.3.kt similarity index 97% rename from compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.kt rename to compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.1.3.kt index d18bc5ea8b7..9d9d9d359f8 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.1.3.kt @@ -1,4 +1,4 @@ -// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect +// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect -AllowContractsForNonOverridableMembers // !USE_EXPERIMENTAL: kotlin.contracts.ExperimentalContracts // !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.txt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.1.3.txt similarity index 100% rename from compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.txt rename to compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.1.3.txt diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.1.4.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.1.4.fir.kt new file mode 100644 index 00000000000..fe26e1eeedf --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.1.4.fir.kt @@ -0,0 +1,53 @@ +// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect +AllowContractsForNonOverridableMembers +// !USE_EXPERIMENTAL: kotlin.contracts.ExperimentalContracts +// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER + +import kotlin.contracts.* + +inline fun referToReifiedGeneric(x: Any?) { + contract { + returns() implies (x is T) + } +} + +class Generic { + fun referToCaptured(x: Any?) { + contract { + returns() implies (x is T) + } + } +} + +fun referToSubstituted(x: Any?) { + contract { + returns() implies (x is Generic) + } +} + +fun referToSubstitutedWithStar(x: Any?) { + contract { + returns() implies (x is Generic<*>) + } +} + +typealias GenericString = Generic +typealias FunctionalType = () -> Unit +typealias SimpleType = Int + +fun referToAliasedGeneric(x: Any?) { + contract { + returns() implies (x is GenericString) + } +} + +fun referToAliasedFunctionType(x: Any?) { + contract { + returns() implies (x is FunctionalType) + } +} + +fun referToAliasedSimpleType(x: Any?) { + contract { + returns() implies (x is SimpleType) + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.1.4.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.1.4.kt new file mode 100644 index 00000000000..e8cba8fa5f2 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.1.4.kt @@ -0,0 +1,53 @@ +// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect +AllowContractsForNonOverridableMembers +// !USE_EXPERIMENTAL: kotlin.contracts.ExperimentalContracts +// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER + +import kotlin.contracts.* + +inline fun referToReifiedGeneric(x: Any?) { + contract { + returns() implies (x is T) + } +} + +class Generic { + fun referToCaptured(x: Any?) { + contract { + returns() implies (x is T) + } + } +} + +fun referToSubstituted(x: Any?) { + contract { + returns() implies (x is Generic) + } +} + +fun referToSubstitutedWithStar(x: Any?) { + contract { + returns() implies (x is Generic<*>) + } +} + +typealias GenericString = Generic +typealias FunctionalType = () -> Unit +typealias SimpleType = Int + +fun referToAliasedGeneric(x: Any?) { + contract { + returns() implies (x is GenericString) + } +} + +fun referToAliasedFunctionType(x: Any?) { + contract { + returns() implies (x is FunctionalType) + } +} + +fun referToAliasedSimpleType(x: Any?) { + contract { + returns() implies (x is SimpleType) + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.1.4.txt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.1.4.txt new file mode 100644 index 00000000000..e4735c40c68 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.1.4.txt @@ -0,0 +1,22 @@ +package + +public fun referToAliasedFunctionType(/*0*/ x: kotlin.Any?): kotlin.Unit +public fun referToAliasedGeneric(/*0*/ x: kotlin.Any?): kotlin.Unit +public fun referToAliasedSimpleType(/*0*/ x: kotlin.Any?): kotlin.Unit + Returns(WILDCARD) -> x is Int + +public inline fun referToReifiedGeneric(/*0*/ x: kotlin.Any?): kotlin.Unit +public fun referToSubstituted(/*0*/ x: kotlin.Any?): kotlin.Unit +public fun referToSubstitutedWithStar(/*0*/ x: kotlin.Any?): kotlin.Unit + Returns(WILDCARD) -> x is Generic<*> + +public final class Generic { + public constructor Generic() + 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 final fun referToCaptured(/*0*/ x: kotlin.Any?): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} +public typealias FunctionalType = () -> kotlin.Unit +public typealias GenericString = Generic +public typealias SimpleType = kotlin.Int diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/contractsOnMembers.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/contractsOnMembers.fir.kt new file mode 100644 index 00000000000..850b45ba059 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/contractsOnMembers.fir.kt @@ -0,0 +1,31 @@ +// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect +AllowContractsForNonOverridableMembers +// !USE_EXPERIMENTAL: kotlin.contracts.ExperimentalContracts +// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER + +import kotlin.contracts.* + +class Foo { + fun myRun(block: () -> Unit) { + contract { + callsInPlace(block, InvocationKind.EXACTLY_ONCE) + } + block() + } + + fun require(x: Boolean) { + contract { returns() implies (x) } + } +} + +fun test_1(foo: Foo, x: Any) { + foo.require(x is String) + x.length +} + +fun test_2(foo: Foo): Int { + val x: Int + foo.myRun { + x = 1 + } + return x + 1 +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/contractsOnMembers.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/contractsOnMembers.kt new file mode 100644 index 00000000000..7d129aef90f --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/contractsOnMembers.kt @@ -0,0 +1,31 @@ +// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect +AllowContractsForNonOverridableMembers +// !USE_EXPERIMENTAL: kotlin.contracts.ExperimentalContracts +// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER + +import kotlin.contracts.* + +class Foo { + fun myRun(block: () -> Unit) { + contract { + callsInPlace(block, InvocationKind.EXACTLY_ONCE) + } + block() + } + + fun require(x: Boolean) { + contract { returns() implies (x) } + } +} + +fun test_1(foo: Foo, x: Any) { + foo.require(x is String) + x.length +} + +fun test_2(foo: Foo): Int { + val x: Int + foo.myRun { + x = 1 + } + return x + 1 +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/contractsOnMembers.txt b/compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/contractsOnMembers.txt new file mode 100644 index 00000000000..2a7eb3c2ea9 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/contractsOnMembers.txt @@ -0,0 +1,17 @@ +package + +public fun test_1(/*0*/ foo: Foo, /*1*/ x: kotlin.Any): kotlin.Unit +public fun test_2(/*0*/ foo: Foo): kotlin.Int + +public final class Foo { + public constructor Foo() + 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 final fun myRun(/*0*/ block: () -> kotlin.Unit): kotlin.Unit + CallsInPlace(block, EXACTLY_ONCE) + + public final fun require(/*0*/ x: kotlin.Boolean): kotlin.Unit + Returns(WILDCARD) -> x + + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/loadJava/compiledKotlinWithStdlib/contracts/contractsOnMembers.kt b/compiler/testData/loadJava/compiledKotlinWithStdlib/contracts/contractsOnMembers.kt new file mode 100644 index 00000000000..7a14c362652 --- /dev/null +++ b/compiler/testData/loadJava/compiledKotlinWithStdlib/contracts/contractsOnMembers.kt @@ -0,0 +1,19 @@ +// !LANGUAGE: +AllowContractsForCustomFunctions +ReadDeserializedContracts +AllowContractsForNonOverridableMembers +// !USE_EXPERIMENTAL: kotlin.contracts.ExperimentalContracts +@file:Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") + +package test + +import kotlin.contracts.* + +class Foo { + fun callsEffectWithKind(block: (X, Y, Z) -> R) { + contract { + callsInPlace(block, InvocationKind.EXACTLY_ONCE) + } + } + + fun returnsImplies(x: Boolean) { + contract { returns() implies (x) } + } +} \ No newline at end of file diff --git a/compiler/testData/loadJava/compiledKotlinWithStdlib/contracts/contractsOnMembers.txt b/compiler/testData/loadJava/compiledKotlinWithStdlib/contracts/contractsOnMembers.txt new file mode 100644 index 00000000000..eef631e2c3c --- /dev/null +++ b/compiler/testData/loadJava/compiledKotlinWithStdlib/contracts/contractsOnMembers.txt @@ -0,0 +1,11 @@ +package test + +public final class Foo { + /*primary*/ public constructor Foo() + public final fun callsEffectWithKind(/*0*/ block: (X, Y, Z) -> R): kotlin.Unit + CallsInPlace(block, EXACTLY_ONCE) + + public final fun returnsImplies(/*0*/ x: kotlin.Boolean): kotlin.Unit + Returns(WILDCARD) -> x + +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java index fead4e339d4..7f1da65a874 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java @@ -1189,9 +1189,14 @@ public class DiagnosticsTestWithStdLibGenerated extends AbstractDiagnosticsTestW runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/callInContractDescription.kt"); } - @TestMetadata("contractCallSites.kt") - public void testContractCallSites() throws Exception { - runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.kt"); + @TestMetadata("contractCallSites.1.3.kt") + public void testContractCallSites_1_3() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.1.3.kt"); + } + + @TestMetadata("contractCallSites.1.4.kt") + public void testContractCallSites_1_4() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.1.4.kt"); } @TestMetadata("emptyContract.kt") @@ -1234,14 +1239,24 @@ public class DiagnosticsTestWithStdLibGenerated extends AbstractDiagnosticsTestW runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/recursiveContractCustomContractFunction.kt"); } - @TestMetadata("referenceToProperty.kt") - public void testReferenceToProperty() throws Exception { - runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.kt"); + @TestMetadata("referenceToProperty.1.3.kt") + public void testReferenceToProperty_1_3() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.1.3.kt"); } - @TestMetadata("typeReferences.kt") - public void testTypeReferences() throws Exception { - runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.kt"); + @TestMetadata("referenceToProperty.1.4.kt") + public void testReferenceToProperty_1_4() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.1.4.kt"); + } + + @TestMetadata("typeReferences.1.3.kt") + public void testTypeReferences_1_3() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.1.3.kt"); + } + + @TestMetadata("typeReferences.1.4.kt") + public void testTypeReferences_1_4() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.1.4.kt"); } @TestMetadata("unlabeledReceiver.kt") @@ -1321,6 +1336,11 @@ public class DiagnosticsTestWithStdLibGenerated extends AbstractDiagnosticsTestW runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/compositions.kt"); } + @TestMetadata("contractsOnMembers.kt") + public void testContractsOnMembers() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/contractsOnMembers.kt"); + } + @TestMetadata("deeplyNested.kt") public void testDeeplyNested() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/deeplyNested.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java index dcd092de4dc..e788244c988 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java @@ -1189,9 +1189,14 @@ public class DiagnosticsTestWithStdLibUsingJavacGenerated extends AbstractDiagno runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/callInContractDescription.kt"); } - @TestMetadata("contractCallSites.kt") - public void testContractCallSites() throws Exception { - runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.kt"); + @TestMetadata("contractCallSites.1.3.kt") + public void testContractCallSites_1_3() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.1.3.kt"); + } + + @TestMetadata("contractCallSites.1.4.kt") + public void testContractCallSites_1_4() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/contractCallSites.1.4.kt"); } @TestMetadata("emptyContract.kt") @@ -1234,14 +1239,24 @@ public class DiagnosticsTestWithStdLibUsingJavacGenerated extends AbstractDiagno runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/recursiveContractCustomContractFunction.kt"); } - @TestMetadata("referenceToProperty.kt") - public void testReferenceToProperty() throws Exception { - runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.kt"); + @TestMetadata("referenceToProperty.1.3.kt") + public void testReferenceToProperty_1_3() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.1.3.kt"); } - @TestMetadata("typeReferences.kt") - public void testTypeReferences() throws Exception { - runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.kt"); + @TestMetadata("referenceToProperty.1.4.kt") + public void testReferenceToProperty_1_4() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.1.4.kt"); + } + + @TestMetadata("typeReferences.1.3.kt") + public void testTypeReferences_1_3() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.1.3.kt"); + } + + @TestMetadata("typeReferences.1.4.kt") + public void testTypeReferences_1_4() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.1.4.kt"); } @TestMetadata("unlabeledReceiver.kt") @@ -1321,6 +1336,11 @@ public class DiagnosticsTestWithStdLibUsingJavacGenerated extends AbstractDiagno runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/compositions.kt"); } + @TestMetadata("contractsOnMembers.kt") + public void testContractsOnMembers() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/contractsOnMembers.kt"); + } + @TestMetadata("deeplyNested.kt") public void testDeeplyNested() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/deeplyNested.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java index bf13cb1188e..c218bf3d9aa 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java @@ -4650,6 +4650,11 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest { runTest("compiler/testData/loadJava/compiledKotlinWithStdlib/contracts/callsEffect.kt"); } + @TestMetadata("contractsOnMembers.kt") + public void testContractsOnMembers() throws Exception { + runTest("compiler/testData/loadJava/compiledKotlinWithStdlib/contracts/contractsOnMembers.kt"); + } + @TestMetadata("deeplyNestedExpression.kt") public void testDeeplyNestedExpression() throws Exception { runTest("compiler/testData/loadJava/compiledKotlinWithStdlib/contracts/deeplyNestedExpression.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/ir/IrLoadJavaTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/ir/IrLoadJavaTestGenerated.java index 455348514e1..d80a43e47f4 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/ir/IrLoadJavaTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/ir/IrLoadJavaTestGenerated.java @@ -4651,6 +4651,11 @@ public class IrLoadJavaTestGenerated extends AbstractIrLoadJavaTest { runTest("compiler/testData/loadJava/compiledKotlinWithStdlib/contracts/callsEffect.kt"); } + @TestMetadata("contractsOnMembers.kt") + public void testContractsOnMembers() throws Exception { + runTest("compiler/testData/loadJava/compiledKotlinWithStdlib/contracts/contractsOnMembers.kt"); + } + @TestMetadata("deeplyNestedExpression.kt") public void testDeeplyNestedExpression() throws Exception { runTest("compiler/testData/loadJava/compiledKotlinWithStdlib/contracts/deeplyNestedExpression.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/javac/LoadJavaUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/javac/LoadJavaUsingJavacTestGenerated.java index d15d53c0bd3..4e5496e1998 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/javac/LoadJavaUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/javac/LoadJavaUsingJavacTestGenerated.java @@ -4650,6 +4650,11 @@ public class LoadJavaUsingJavacTestGenerated extends AbstractLoadJavaUsingJavacT runTest("compiler/testData/loadJava/compiledKotlinWithStdlib/contracts/callsEffect.kt"); } + @TestMetadata("contractsOnMembers.kt") + public void testContractsOnMembers() throws Exception { + runTest("compiler/testData/loadJava/compiledKotlinWithStdlib/contracts/contractsOnMembers.kt"); + } + @TestMetadata("deeplyNestedExpression.kt") public void testDeeplyNestedExpression() throws Exception { runTest("compiler/testData/loadJava/compiledKotlinWithStdlib/contracts/deeplyNestedExpression.kt"); diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index ec94688dc28..d6af8a27ce3 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -121,6 +121,7 @@ enum class LanguageFeature( AllowNullOperatorsForResult(KOTLIN_1_4), AllowResultInReturnType(KOTLIN_1_4), PreferJavaFieldOverload(KOTLIN_1_4), + AllowContractsForNonOverridableMembers(KOTLIN_1_4), ProperVisibilityForCompanionObjectInstanceField(sinceVersion = null, kind = BUG_FIX), // Temporarily disabled, see KT-27084/KT-22379