diff --git a/compiler/tests/org/jetbrains/kotlin/code/CodeConformanceTest.kt b/compiler/tests/org/jetbrains/kotlin/code/CodeConformanceTest.kt index 77a9d37b9e4..299a5db958c 100644 --- a/compiler/tests/org/jetbrains/kotlin/code/CodeConformanceTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/code/CodeConformanceTest.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.code import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.io.systemIndependentPath import junit.framework.TestCase +import org.jetbrains.kotlin.config.LanguageFeature import java.io.File import java.util.* import java.util.regex.Pattern @@ -379,6 +380,20 @@ class CodeConformanceTest : TestCase() { } } + + fun testLanguageFeatureOrder() { + val values = enumValues() + val enabledFeatures = values.filter { it.sinceVersion != null && it.defaultState == LanguageFeature.State.ENABLED } + + if (enabledFeatures.sortedBy { it.sinceVersion!! } != enabledFeatures) { + val (a, b) = enabledFeatures.zipWithNext().first { (a, b) -> a.sinceVersion!! > b.sinceVersion!! } + fail( + "Please make sure LanguageFeature entries are sorted by sinceVersion to improve readability & reduce confusion.\n" + + "The feature $b is out of order; its sinceVersion is ${b.sinceVersion}, yet it comes after $a, whose " + + "sinceVersion is ${a.sinceVersion}.\n" + ) + } + } } private fun String.ensureFileOrEndsWithSlash() = diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index 80fc20e0dd2..d3a91f3790a 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -18,6 +18,9 @@ enum class LanguageFeature( val kind: Kind = OTHER // NB: default value OTHER doesn't force pre-releaseness (see KDoc) ) { // Note: names of these entries are also used in diagnostic tests and in user-visible messages (see presentableText below) + + // 1.1 + TypeAliases(KOTLIN_1_1), BoundCallableReferences(KOTLIN_1_1, ApiVersion.KOTLIN_1_1), LocalDelegatedProperties(KOTLIN_1_1, ApiVersion.KOTLIN_1_1), @@ -40,6 +43,8 @@ enum class LanguageFeature( NoDelegationToJavaDefaultInterfaceMembers(KOTLIN_1_1), DefaultImportOfPackageKotlinComparisons(KOTLIN_1_1), + // 1.2 + ArrayLiteralsInAnnotations(KOTLIN_1_2), InlineDefaultFunctionalParameters(KOTLIN_1_2), SoundSmartCastsAfterTry(KOTLIN_1_2), @@ -57,6 +62,8 @@ enum class LanguageFeature( ExpectedTypeFromCast(KOTLIN_1_2), DefaultMethodsCallFromJava6TargetError(KOTLIN_1_2), + // 1.3 + RestrictionOfValReassignmentViaBackingField(KOTLIN_1_3, kind = BUG_FIX), NestedClassesInEnumEntryShouldBeInner(KOTLIN_1_3, kind = BUG_FIX), ProhibitDataClassesOverridingCopy(KOTLIN_1_3, kind = BUG_FIX), @@ -88,6 +95,8 @@ enum class LanguageFeature( ExtendedMainConvention(KOTLIN_1_3), ExperimentalBuilderInference(KOTLIN_1_3), + // 1.4 + DslMarkerOnFunctionTypeReceiver(KOTLIN_1_4, kind = BUG_FIX), RestrictReturnStatementTarget(KOTLIN_1_4, kind = BUG_FIX), NoConstantValueAttributeForNonConstVals(KOTLIN_1_4, kind = BUG_FIX), @@ -116,7 +125,6 @@ enum class LanguageFeature( AllowAssigningArrayElementsToVarargsInNamedFormForFunctions(KOTLIN_1_4), AllowNullOperatorsForResult(KOTLIN_1_4), AllowResultInReturnType(KOTLIN_1_4, defaultState = State.DISABLED), - AllowNullOperatorsForResultAndResultReturnTypeByDefault(KOTLIN_1_5, defaultState = State.ENABLED), PreferJavaFieldOverload(KOTLIN_1_4), AllowContractsForNonOverridableMembers(KOTLIN_1_4), AllowReifiedGenericsInContracts(KOTLIN_1_4), @@ -128,27 +136,51 @@ enum class LanguageFeature( MangleClassMembersReturningInlineClasses(KOTLIN_1_4), ImproveReportingDiagnosticsOnProtectedMembersOfBaseClass(KOTLIN_1_4, kind = BUG_FIX, defaultState = State.ENABLED), + NewInference(KOTLIN_1_4), + + // In the next block, features can be enabled only along with new inference + // v----------------------------------------------------------------------v + SamConversionForKotlinFunctions(KOTLIN_1_4), + SamConversionPerArgument(KOTLIN_1_4), + FunctionReferenceWithDefaultValueAsOtherType(KOTLIN_1_4), + SuspendConversion(KOTLIN_1_4, defaultState = State.DISABLED), + UnitConversion(KOTLIN_1_4, defaultState = State.DISABLED), + OverloadResolutionByLambdaReturnType(KOTLIN_1_4), + ContractsOnCallsWithImplicitReceiver(KOTLIN_1_4), + BooleanElvisBoundSmartCasts(KOTLIN_1_3, defaultState = State.DISABLED), // see KT-26357 for details + NewDataFlowForTryExpressions(KOTLIN_1_4, defaultState = State.DISABLED), + ReferencesToSyntheticJavaProperties(KOTLIN_1_3, defaultState = State.DISABLED), + // ^----------------------------------------------------------------------^ + + // 1.5 + ProhibitSpreadOnSignaturePolymorphicCall(KOTLIN_1_5, kind = BUG_FIX), ProhibitInvisibleAbstractMethodsInSuperclasses(KOTLIN_1_5, kind = BUG_FIX), ProhibitNonReifiedArraysAsReifiedTypeArguments(KOTLIN_1_5, kind = BUG_FIX), ProhibitVarargAsArrayAfterSamArgument(KOTLIN_1_5, kind = BUG_FIX), CorrectSourceMappingSyntax(KOTLIN_1_5, kind = UNSTABLE_FEATURE), ProperArrayConventionSetterWithDefaultCalls(KOTLIN_1_5, kind = OTHER), - DisableCompatibilityModeForNewInference(KOTLIN_1_5, defaultState = LanguageFeature.State.DISABLED), - AdaptedCallableReferenceAgainstReflectiveType(KOTLIN_1_5, defaultState = LanguageFeature.State.DISABLED), + DisableCompatibilityModeForNewInference(KOTLIN_1_5, defaultState = State.DISABLED), + AdaptedCallableReferenceAgainstReflectiveType(KOTLIN_1_5, defaultState = State.DISABLED), InferenceCompatibility(KOTLIN_1_5, kind = BUG_FIX), RequiredPrimaryConstructorDelegationCallInEnums(KOTLIN_1_5, kind = BUG_FIX), ApproximateAnonymousReturnTypesInPrivateInlineFunctions(KOTLIN_1_5, kind = BUG_FIX), ForbidReferencingToUnderscoreNamedParameterOfCatchBlock(KOTLIN_1_5, kind = BUG_FIX), UseCorrectExecutionOrderForVarargArguments(KOTLIN_1_5, kind = BUG_FIX), JvmRecordSupport(KOTLIN_1_5), - + AllowNullOperatorsForResultAndResultReturnTypeByDefault(KOTLIN_1_5, defaultState = State.ENABLED), AllowSealedInheritorsInDifferentFilesOfSamePackage(KOTLIN_1_5), SealedInterfaces(KOTLIN_1_5), JvmIrEnabledByDefault(KOTLIN_1_5), + JvmInlineValueClasses(KOTLIN_1_5, defaultState = State.ENABLED, kind = OTHER), + SuspendFunctionsInFunInterfaces(KOTLIN_1_5, defaultState = State.ENABLED, kind = OTHER), + SamWrapperClassesAreSynthetic(KOTLIN_1_5, defaultState = State.ENABLED, kind = BUG_FIX), + StrictOnlyInputTypesChecks(KOTLIN_1_5), + // Disabled until the breaking change is approved by the committee, see KT-10884. PackagePrivateFileClassesWithAllPrivateMembers(KOTLIN_1_5, defaultState = State.DISABLED), - StrictOnlyInputTypesChecks(sinceVersion = KOTLIN_1_5), + + // 1.6 /* * Improvements include the following: @@ -170,6 +202,9 @@ enum class LanguageFeature( ApproximateIntegerLiteralTypesInReceiverPosition(KOTLIN_1_6), ProperCheckAnnotationsTargetInTypeUsePositions(KOTLIN_1_6, kind = BUG_FIX), + DefinitelyNotNullTypeParameters(KOTLIN_1_6), + ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated(KOTLIN_1_6, kind = BUG_FIX), + // Temporarily disabled, see KT-27084/KT-22379 SoundSmartcastFromLoopConditionForLoopAssignedVariables(sinceVersion = null, kind = BUG_FIX), @@ -180,38 +215,13 @@ enum class LanguageFeature( "https://kotlinlang.org/docs/diagnostics/experimental-coroutines", State.ENABLED_WITH_WARNING ), - MultiPlatformProjects(sinceVersion = null, defaultState = State.DISABLED), + InlineClasses(KOTLIN_1_3, defaultState = State.ENABLED_WITH_WARNING, kind = UNSTABLE_FEATURE), - NewInference(sinceVersion = KOTLIN_1_4), - - // In the next block, features can be enabled only along with new inference - SamConversionForKotlinFunctions(sinceVersion = KOTLIN_1_4), - SamConversionPerArgument(sinceVersion = KOTLIN_1_4), - FunctionReferenceWithDefaultValueAsOtherType(sinceVersion = KOTLIN_1_4), - SuspendConversion(sinceVersion = KOTLIN_1_4, defaultState = State.DISABLED), - UnitConversion(sinceVersion = KOTLIN_1_4, defaultState = State.DISABLED), - OverloadResolutionByLambdaReturnType(sinceVersion = KOTLIN_1_4), - ContractsOnCallsWithImplicitReceiver(sinceVersion = KOTLIN_1_4), - - BooleanElvisBoundSmartCasts(sinceVersion = KOTLIN_1_3, defaultState = State.DISABLED), // see KT-26357 for details - NewDataFlowForTryExpressions(sinceVersion = KOTLIN_1_4, defaultState = State.DISABLED), - ReferencesToSyntheticJavaProperties(sinceVersion = KOTLIN_1_3, defaultState = State.DISABLED), - // ------ - // Next features can be enabled regardless of new inference - - InlineClasses(sinceVersion = KOTLIN_1_3, defaultState = State.ENABLED_WITH_WARNING, kind = UNSTABLE_FEATURE), - JvmInlineValueClasses(sinceVersion = KOTLIN_1_5, defaultState = State.ENABLED, kind = OTHER), - SuspendFunctionsInFunInterfaces(sinceVersion = KOTLIN_1_5, defaultState = State.ENABLED, kind = OTHER), - SamWrapperClassesAreSynthetic(sinceVersion = KOTLIN_1_5, defaultState = State.ENABLED, kind = BUG_FIX), - - // 1.6 - DefinitelyNotNullTypeParameters(sinceVersion = KOTLIN_1_6), - ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated(sinceVersion = KOTLIN_1_6, kind = BUG_FIX), ; val presentableName: String - // E.g. "DestructuringLambdaParameters" -> ["Destructuring", "Lambda", "Parameters"] -> "destructuring lambda parameters" + // E.g. "DestructuringLambdaParameters" -> ["Destructuring", "Lambda", "Parameters"] -> "destructuring lambda parameters" get() = name.split("(?