java sealed types: increase language level (IDEA-243474)

ensure records can be used with java 15 as well

GitOrigin-RevId: 5716dddb35ad9b2349e6558460897d650740fe1c
This commit is contained in:
Anna Kozlova
2020-06-14 20:47:25 +02:00
committed by intellij-monorepo-bot
parent 584d51bcac
commit 9dd5c364a6
6 changed files with 48 additions and 11 deletions

View File

@@ -3228,10 +3228,16 @@ public class HighlightUtil {
@NotNull
private static LanguageLevel getApplicableLevel(@NotNull PsiFile file, @NotNull HighlightingFeature feature) {
LanguageLevel standardLevel = feature.getStandardLevel();
if (standardLevel != null && feature.level.isPreview()) {
if (feature.level.isPreview()) {
JavaSdkVersion sdkVersion = JavaSdkVersionUtil.getJavaSdkVersion(file);
if (sdkVersion != null && sdkVersion.isAtLeast(JavaSdkVersion.fromLanguageLevel(standardLevel))) {
return standardLevel;
if (sdkVersion != null) {
if (standardLevel != null && sdkVersion.isAtLeast(JavaSdkVersion.fromLanguageLevel(standardLevel))) {
return standardLevel;
}
LanguageLevel previewLevel = sdkVersion.getMaxLanguageLevel().getPreviewLevel();
if (previewLevel != null) {
return previewLevel;
}
}
}
return feature.level;

View File

@@ -30,9 +30,22 @@ public class JavaErrorQuickFixProvider implements ErrorQuickFixProvider {
if (parent instanceof PsiJavaFile && errorElement.getErrorDescription().equals(
JavaPsiBundle.message("expected.class.or.interface"))) {
PsiElement child = errorElement.getFirstChild();
if (child instanceof PsiIdentifier && child.getText().equals(PsiKeyword.RECORD)) {
HighlightUtil.registerIncreaseLanguageLevelFixes(
new QuickFixActionRegistrarImpl(highlightInfo), errorElement, HighlightingFeature.RECORDS);
if (child instanceof PsiIdentifier) {
HighlightingFeature feature;
switch (child.getText()) {
case PsiKeyword.RECORD:
feature = HighlightingFeature.RECORDS;
break;
case PsiKeyword.SEALED:
feature = HighlightingFeature.SEALED_CLASSES;
break;
default:
feature = null;
break;
}
if (feature != null) {
HighlightUtil.registerIncreaseLanguageLevelFixes(new QuickFixActionRegistrarImpl(highlightInfo), errorElement, feature);
}
}
}
}

View File

@@ -121,7 +121,7 @@ jdk.13.language.level.description=13 - No new language features
jdk.14.language.level.description=14 - Switch expressions
jdk.14.preview.language.level.description=14 (Preview) - Records, patterns, text blocks
jdk.15.language.level.description=15 - Text blocks
jdk.15.preview.language.level.description=15 (Preview) - Sealed types
jdk.15.preview.language.level.description=15 (Preview) - Sealed types, records, patterns
jdk.X.language.level.description=X - Experimental features
local.class.preposition=local

View File

@@ -57,6 +57,19 @@ public enum LanguageLevel {
return myPreview;
}
/**
* @return corresponding preview level, or {@code null} if level has no paired preview level
*/
public LanguageLevel getPreviewLevel() {
if (myPreview) return this;
try {
return valueOf(name() + "_PREVIEW");
}
catch (IllegalArgumentException e) {
return null;
}
}
@NotNull
@Nls
public String getPresentableText() {

View File

@@ -0,0 +1 @@
se<caret>aled class C {}

View File

@@ -23,7 +23,7 @@ public class IncreaseLanguageLevelFixTest extends LightDaemonAnalyzerTestCase {
@Override
protected Sdk getProjectJDK() {
return IdeaTestUtil.getMockJdk(JavaVersion.compose(14));
return IdeaTestUtil.getMockJdk(JavaVersion.compose(15));
}
@Override
@@ -40,15 +40,19 @@ public class IncreaseLanguageLevelFixTest extends LightDaemonAnalyzerTestCase {
}
public void testRecordTopLevel() {
doTest(LanguageLevel.JDK_14_PREVIEW);
doTest(LanguageLevel.JDK_15_PREVIEW);
}
public void testRecordInClass() {
doTest(LanguageLevel.JDK_14_PREVIEW);
doTest(LanguageLevel.JDK_15_PREVIEW);
}
public void testRecordInMethod() {
doTest(LanguageLevel.JDK_14_PREVIEW);
doTest(LanguageLevel.JDK_15_PREVIEW);
}
public void testSealedClasses() {
doTest(LanguageLevel.JDK_15_PREVIEW);
}
private void doTest(LanguageLevel level) {