[java] Set the highest released language level through the registry

This will allow changing the language level combobox through the cloud registry. #IDEA-369013 Fixed

GitOrigin-RevId: 1874b9aa5f617795a239f3941572318fc64f1b25
This commit is contained in:
Bart van Helvert
2025-04-22 13:32:02 +00:00
committed by intellij-monorepo-bot
parent 79272e4048
commit dd358bc239
3 changed files with 25 additions and 7 deletions
@@ -29,8 +29,8 @@ abstract class LanguageLevelCombo @JvmOverloads constructor(
val items = mutableListOf<Any>()
items.add(defaultItem ?: "")
val highestPreviewLevel = LanguageLevel.HIGHEST.getPreviewLevel()
val highestWithPreview = highestPreviewLevel ?: LanguageLevel.HIGHEST
val highestLanguageLevel = AcceptedLanguageLevelsSettings.getHighest()
val highestWithPreview = highestLanguageLevel.getPreviewLevel() ?: highestLanguageLevel
fun MutableList<Any>.filterAndAdd(levels: Collection<LanguageLevel>) = levels.filter(levelFilter).also { addAll(it) }
@@ -324,6 +324,9 @@
<registryKey key="java.test.enable.tree.live.time" defaultValue="true"
description="Enable live time for tests" restartRequired="true"/>
<registryKey key="java.highest.language.level" defaultValue="24"
description="Highest released language level" restartRequired="false"/>
<registryKey key="index.ids.from.java.sources.in.jar" defaultValue="true"
description="Index ids from class files instead of source files in JARs" restartRequired="false"/>
@@ -1,4 +1,4 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.pom.java;
import com.intellij.ide.IdeBundle;
@@ -21,6 +21,7 @@ import com.intellij.openapi.roots.JavaProjectModelModificationService;
import com.intellij.openapi.roots.LanguageLevelProjectExtension;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.ui.components.LegalNoticeDialog;
import com.intellij.util.containers.MultiMap;
import com.intellij.util.xmlb.XmlSerializerUtil;
@@ -148,7 +149,7 @@ public final class AcceptedLanguageLevelsSettings implements PersistentStateComp
//allow custom features to appear in EAP
if (ApplicationManager.getApplication().isEAP()) return true;
// language levels up to HIGHEST are officially supported
return LanguageLevel.HIGHEST.compareTo(languageLevel) >= 0 || getSettings().acceptedNames.contains(languageLevel.name());
return getHighest().compareTo(languageLevel) >= 0 || getSettings().acceptedNames.contains(languageLevel.name());
}
private static void acceptAndRestore(Project project, Collection<? extends Module> modules, LanguageLevel languageLevel) {
@@ -172,8 +173,22 @@ public final class AcceptedLanguageLevelsSettings implements PersistentStateComp
}
}
public static LanguageLevel getHighestAcceptedLevel() {
LanguageLevel highest = LanguageLevel.HIGHEST;
/**
* @return the highest stable language level for Java.
*/
public static @NotNull LanguageLevel getHighest() {
LanguageLevel languageLevel = LanguageLevel.forFeature(Registry.intValue("java.highest.language.level"));
if (languageLevel == null) throw new IllegalStateException("Highest language level could not be found");
return languageLevel;
}
/**
* @return the highest stable language level for Java, or a preview language level if the user has accepted the legal notice or is using
* an EAP version.
*/
public static @NotNull LanguageLevel getHighestAcceptedLevel() {
LanguageLevel highest = getHighest();
for (LanguageLevel level : LanguageLevel.values()) {
if (isLanguageLevelAccepted(level)) {
highest = level;
@@ -246,7 +261,7 @@ public final class AcceptedLanguageLevelsSettings implements PersistentStateComp
private static @NotNull LanguageLevel adjustLanguageLevel(@NotNull LanguageLevel languageLevel) {
if (isLanguageLevelAccepted(languageLevel)) return languageLevel;
LanguageLevel highestAcceptedLevel = getHighestAcceptedLevel();
return highestAcceptedLevel.isAtLeast(languageLevel) ? LanguageLevel.HIGHEST : highestAcceptedLevel;
return highestAcceptedLevel.isAtLeast(languageLevel) ? getHighest() : highestAcceptedLevel;
}
@TestOnly