Skip to content

Commit f2f9688

Browse files
ddolovovSpace Team
authored andcommitted
Reorganize access to "customized" features in LanguageVersionSettings
Right now, there is no guaranteed way to get the full set of language features that have been customized in `LanguageVersionSettings`. I.e., which features were explicitly specified in the LANGUAGE directive of a test data file with "plus" and "minus" signs irrespectively of their state for the specific language version used in that test. There are two auxiliary functions that might look like they do exactly what is required. But in fact they are not: `getManuallyEnabledLanguageFeatures()` and `getManuallyDisabledLanguageFeatures()`. These functions return ONLY meaningful language features. And they filter out any enabled feature that is already "stable" in the current language version, or any disabled language feature that is "experimental" in the current LV. So, we are introducing a new function in `LanguageVersionSettings` to get the full set of customized features: `getCustomizedLanguageFeatures()`. Also, the two auxiliary functions are renamed to `getCustomizedEffectively[En|Dis]abledLanguageFeatures()` to correctly reflect their meaning. ^KT-71957 ^KT-78188
1 parent 6d4c52d commit f2f9688

File tree

5 files changed

+29
-30
lines changed

5 files changed

+29
-30
lines changed

compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/serializeModuleIntoKlib.kt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ import org.jetbrains.kotlin.config.CompilerConfiguration
1717
import org.jetbrains.kotlin.config.LanguageFeature
1818
import org.jetbrains.kotlin.config.LanguageVersionSettings
1919
import org.jetbrains.kotlin.config.forcesPreReleaseBinariesIfEnabled
20+
import org.jetbrains.kotlin.config.getCustomizedEffectivelyDisabledLanguageFeatures
21+
import org.jetbrains.kotlin.config.getCustomizedEffectivelyEnabledLanguageFeatures
2022
import org.jetbrains.kotlin.config.languageVersionSettings
2123
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
2224
import org.jetbrains.kotlin.diagnostics.impl.deduplicating
@@ -202,11 +204,12 @@ fun <Dependency : KotlinLibrary, SourceFile> serializeModuleIntoKlib(
202204
}
203205

204206
fun addLanguageFeaturesToManifest(manifestProperties: Properties, languageVersionSettings: LanguageVersionSettings) {
205-
val enabledFeatures = languageVersionSettings.getManuallyEnabledLanguageFeatures()
206-
207+
val enabledFeatures = languageVersionSettings.getCustomizedEffectivelyEnabledLanguageFeatures()
207208
val presentableEnabledFeatures = enabledFeatures.sortedBy(LanguageFeature::name).joinToString(" ") { "+$it" }
208-
val presentableDisabledFeatures =
209-
languageVersionSettings.getManuallyDisabledLanguageFeatures().sortedBy(LanguageFeature::name).joinToString(" ") { "-$it" }
209+
210+
val disabledFeatures = languageVersionSettings.getCustomizedEffectivelyDisabledLanguageFeatures()
211+
val presentableDisabledFeatures = disabledFeatures.sortedBy(LanguageFeature::name).joinToString(" ") { "-$it" }
212+
210213
val presentableAlteredFeatures = "$presentableEnabledFeatures $presentableDisabledFeatures".trim()
211214
if (presentableAlteredFeatures.isNotBlank()) {
212215
manifestProperties.setProperty(KLIB_PROPERTY_MANUALLY_ALTERED_LANGUAGE_FEATURES, presentableAlteredFeatures)

compiler/tests-common-new/testFixtures/org/jetbrains/kotlin/test/frontend/classic/handlers/ClassicUnstableAndK2LanguageFeaturesSkipConfigurator.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package org.jetbrains.kotlin.test.frontend.classic.handlers
77

88
import org.jetbrains.kotlin.config.LanguageFeature
9+
import org.jetbrains.kotlin.config.getCustomizedEffectivelyEnabledLanguageFeatures
910
import org.jetbrains.kotlin.test.services.MetaTestConfigurator
1011
import org.jetbrains.kotlin.test.services.TestServices
1112
import org.jetbrains.kotlin.test.services.moduleStructure
@@ -25,7 +26,7 @@ class ClassicUnstableAndK2LanguageFeaturesSkipConfigurator(testServices: TestSer
2526
override fun shouldSkipTest(): Boolean {
2627
val settings = testServices.moduleStructure.modules.first().languageVersionSettings
2728
if (settings.languageVersion.usesK2) return false
28-
return settings.getManuallyEnabledLanguageFeatures().any { feature ->
29+
return settings.getCustomizedEffectivelyEnabledLanguageFeatures().any { feature ->
2930
when (val sinceVersion = feature.sinceVersion) {
3031
null -> feature in unscheduledK2OnlyFeatures
3132
else -> sinceVersion.usesK2

compiler/tests-common/testFixtures/org/jetbrains/kotlin/checkers/CompilerTestLanguageVersionSettings.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,8 @@ data class CompilerTestLanguageVersionSettings(
3636
override fun getFeatureSupport(feature: LanguageFeature): LanguageFeature.State =
3737
extraLanguageFeatures[feature] ?: delegate.getFeatureSupport(feature)
3838

39-
override fun getManuallyEnabledLanguageFeatures(): List<LanguageFeature> =
40-
delegate.getManuallyEnabledLanguageFeatures()
41-
42-
override fun getManuallyDisabledLanguageFeatures(): List<LanguageFeature> =
43-
delegate.getManuallyDisabledLanguageFeatures()
39+
override fun getCustomizedLanguageFeatures(): Map<LanguageFeature, LanguageFeature.State> =
40+
delegate.getCustomizedLanguageFeatures()
4441

4542
override fun isPreRelease(): Boolean = KotlinCompilerVersion.isPreRelease()
4643

compiler/tests-compiler-utils/testFixtures/org/jetbrains/kotlin/fir/session/FirSessionFactoryHelper.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,7 @@ object FirSessionFactoryHelper {
104104
return features.getOrDefault(feature, LanguageFeature.State.DISABLED)
105105
}
106106

107-
override fun getManuallyEnabledLanguageFeatures(): List<LanguageFeature> = stub()
108-
109-
override fun getManuallyDisabledLanguageFeatures(): List<LanguageFeature> = stub()
107+
override fun getCustomizedLanguageFeatures(): Map<LanguageFeature, LanguageFeature.State> = stub()
110108

111109
override fun isPreRelease(): Boolean = stub()
112110

compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -695,9 +695,7 @@ interface LanguageVersionSettings {
695695
fun supportsFeature(feature: LanguageFeature): Boolean =
696696
getFeatureSupport(feature) == LanguageFeature.State.ENABLED
697697

698-
fun getManuallyEnabledLanguageFeatures(): List<LanguageFeature>
699-
700-
fun getManuallyDisabledLanguageFeatures(): List<LanguageFeature>
698+
fun getCustomizedLanguageFeatures(): Map<LanguageFeature, LanguageFeature.State>
701699

702700
fun isPreRelease(): Boolean
703701

@@ -735,20 +733,7 @@ class LanguageVersionSettingsImpl @JvmOverloads constructor(
735733
}
736734
}
737735

738-
override fun getManuallyEnabledLanguageFeatures(): List<LanguageFeature> =
739-
specificFeatures.filter { isEnabledOnlyByFlag(it.key, it.value) }.keys.toList()
740-
741-
override fun getManuallyDisabledLanguageFeatures(): List<LanguageFeature> =
742-
specificFeatures.filter { isDisabledOnlyByFlag(it.key, it.value) }.keys.toList()
743-
744-
private fun isEnabledOnlyByFlag(feature: LanguageFeature, state: LanguageFeature.State): Boolean =
745-
!isEnabledByDefault(feature) && (state == LanguageFeature.State.ENABLED)
746-
747-
private fun isDisabledOnlyByFlag(feature: LanguageFeature, state: LanguageFeature.State): Boolean =
748-
isEnabledByDefault(feature) && state == LanguageFeature.State.DISABLED
749-
750-
private fun isEnabledByDefault(feature: LanguageFeature): Boolean =
751-
feature.sinceVersion != null && languageVersion >= feature.sinceVersion && apiVersion >= feature.sinceApiVersion
736+
override fun getCustomizedLanguageFeatures(): Map<LanguageFeature, LanguageFeature.State> = specificFeatures
752737

753738
override fun toString() = buildString {
754739
append("Language = $languageVersion, API = $apiVersion")
@@ -785,3 +770,18 @@ fun LanguageFeature.forcesPreReleaseBinariesIfEnabled(): Boolean {
785770
val isFeatureNotReleasedYet = sinceVersion?.isStable != true
786771
return isFeatureNotReleasedYet && forcesPreReleaseBinaries
787772
}
773+
774+
fun LanguageVersionSettings.getCustomizedEffectivelyEnabledLanguageFeatures(): Set<LanguageFeature> {
775+
return getCustomizedLanguageFeatures().entries.mapNotNullTo(mutableSetOf()) { (feature, state) ->
776+
feature.takeIf { !isEnabledByDefault(feature) && state == LanguageFeature.State.ENABLED }
777+
}
778+
}
779+
780+
fun LanguageVersionSettings.getCustomizedEffectivelyDisabledLanguageFeatures(): Set<LanguageFeature> {
781+
return getCustomizedLanguageFeatures().entries.mapNotNullTo(mutableSetOf()) { (feature, state) ->
782+
feature.takeIf { isEnabledByDefault(feature) && state == LanguageFeature.State.DISABLED }
783+
}
784+
}
785+
786+
private fun LanguageVersionSettings.isEnabledByDefault(languageFeature: LanguageFeature): Boolean =
787+
languageFeature.sinceVersion != null && languageVersion >= languageFeature.sinceVersion && apiVersion >= languageFeature.sinceApiVersion

0 commit comments

Comments
 (0)