diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/LanguageLevelCombo.kt b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/LanguageLevelCombo.kt index ed0c374ade3a..9821676691da 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/LanguageLevelCombo.kt +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/LanguageLevelCombo.kt @@ -29,8 +29,8 @@ abstract class LanguageLevelCombo @JvmOverloads constructor( val items = mutableListOf() items.add(defaultItem ?: "") - val highestPreviewLevel = LanguageLevel.HIGHEST.getPreviewLevel() - val highestWithPreview = highestPreviewLevel ?: LanguageLevel.HIGHEST + val highestLanguageLevel = AcceptedLanguageLevelsSettings.getHighest() + val highestWithPreview = highestLanguageLevel.getPreviewLevel() ?: highestLanguageLevel fun MutableList.filterAndAdd(levels: Collection) = levels.filter(levelFilter).also { addAll(it) } diff --git a/java/java-impl/resources/META-INF/JavaPlugin.xml b/java/java-impl/resources/META-INF/JavaPlugin.xml index 7713ebe6417a..287152601d0a 100644 --- a/java/java-impl/resources/META-INF/JavaPlugin.xml +++ b/java/java-impl/resources/META-INF/JavaPlugin.xml @@ -324,6 +324,9 @@ + + diff --git a/java/java-impl/src/com/intellij/pom/java/AcceptedLanguageLevelsSettings.java b/java/java-impl/src/com/intellij/pom/java/AcceptedLanguageLevelsSettings.java index 961413e6af1c..41d46e1529bd 100644 --- a/java/java-impl/src/com/intellij/pom/java/AcceptedLanguageLevelsSettings.java +++ b/java/java-impl/src/com/intellij/pom/java/AcceptedLanguageLevelsSettings.java @@ -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 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