[java-highlighting] IDEA-323955 Record patterns support available only for Java 20 preview. Change HighlightingFeature

GitOrigin-RevId: 0aa46e13853d2a3e1daeb7f151d255cb34f3283d
This commit is contained in:
Mikhail Pyltsin
2023-07-05 12:09:19 +00:00
committed by intellij-monorepo-bot
parent 1600745464
commit 26e5f2d5dc
5 changed files with 47 additions and 49 deletions
@@ -82,9 +82,10 @@ public final class LanguageLevelUtil {
ourPresentableShortMessage.put(LanguageLevel.JDK_17, "18");
ourPresentableShortMessage.put(LanguageLevel.JDK_18, "19");
ourPresentableShortMessage.put(LanguageLevel.JDK_19, "20");
ourPresentableShortMessage.put(LanguageLevel.JDK_19_PREVIEW, "20");
ourPresentableShortMessage.put(LanguageLevel.JDK_20, "21");
ourPresentableShortMessage.put(LanguageLevel.JDK_20_PREVIEW, "21");
ourPresentableShortMessage.put(LanguageLevel.JDK_21, "22");
ourPresentableShortMessage.put(LanguageLevel.JDK_21_PREVIEW, "22");
}
@Nullable
@@ -1841,7 +1841,8 @@ public final class HighlightUtil {
}
static HighlightInfo.Builder checkInstanceOfPatternSupertype(@NotNull PsiInstanceOfExpression expression) {
PsiTypeTestPattern pattern = getTypeTestPattern(expression.getPattern());
@Nullable PsiPattern expressionPattern = expression.getPattern();
PsiTypeTestPattern pattern = tryCast(expressionPattern, PsiTypeTestPattern.class);
if (pattern == null) return null;
PsiPatternVariable variable = pattern.getPatternVariable();
if (variable == null) return null;
@@ -1865,26 +1866,6 @@ public final class HighlightUtil {
return null;
}
@Contract(value = "null -> null", pure = true)
private static @Nullable PsiTypeTestPattern getTypeTestPattern(@Nullable PsiPattern expressionPattern) {
PsiPattern innerMostPattern = JavaPsiPatternUtil.skipParenthesizedPatternDown(expressionPattern);
if (innerMostPattern == null) return null;
PsiTypeTestPattern pattern = tryCast(innerMostPattern, PsiTypeTestPattern.class);
if (pattern != null) return pattern;
PsiGuardedPattern guardedPattern = tryCast(innerMostPattern, PsiGuardedPattern.class);
if (guardedPattern == null) return null;
Object condition = ExpressionUtils.computeConstantExpression(guardedPattern.getGuardingExpression());
if (!Boolean.TRUE.equals(condition)) return null;
PsiPattern patternInGuard = JavaPsiPatternUtil.skipParenthesizedPatternDown(guardedPattern.getPrimaryPattern());
if (patternInGuard == null || patternInGuard instanceof PsiTypeTestPattern) return (PsiTypeTestPattern)patternInGuard;
return getTypeTestPattern(patternInGuard);
}
static HighlightInfo.Builder checkPolyadicOperatorApplicable(@NotNull PsiPolyadicExpression expression) {
PsiExpression[] operands = expression.getOperands();
@@ -3629,7 +3610,7 @@ public final class HighlightUtil {
Module module = ModuleUtilCore.findModuleForPsiElement(file);
if (module != null) {
LanguageLevel moduleLanguageLevel = LanguageLevelUtil.getEffectiveLanguageLevel(module);
if (moduleLanguageLevel.isAtLeast(feature.level)) {
if (moduleLanguageLevel.isAtLeast(feature.level) && !feature.isLimited()) {
for (FilePropertyPusher<?> pusher : FilePropertyPusher.EP_NAME.getExtensions()) {
if (pusher instanceof JavaLanguageLevelPusher) {
String newMessage = ((JavaLanguageLevelPusher)pusher).getInconsistencyLanguageLevelMessage(message, level, file);
@@ -46,37 +46,55 @@ public enum HighlightingFeature {
LOCAL_INTERFACES(LanguageLevel.JDK_16, "feature.local.interfaces"),
LOCAL_ENUMS(LanguageLevel.JDK_16, "feature.local.enums"),
INNER_STATICS(LanguageLevel.JDK_16, "feature.inner.statics"),
PATTERNS_IN_SWITCH(LanguageLevel.JDK_19_PREVIEW, "feature.patterns.in.switch"),
GUARDED_AND_PARENTHESIZED_PATTERNS(LanguageLevel.JDK_19_PREVIEW, "feature.guarded.and.parenthesised.patterns"),
PATTERN_GUARDS_AND_RECORD_PATTERNS(LanguageLevel.JDK_19_PREVIEW, "feature.pattern.guard.and.record.patterns"),
RECORD_PATTERNS_IN_FOR_EACH(LanguageLevel.JDK_20_PREVIEW, LanguageLevel.JDK_20_PREVIEW, "feature.record.patterns.in.for.each");
PARENTHESIZED_PATTERNS(LanguageLevel.JDK_20_PREVIEW, "feature.guarded.and.parenthesised.patterns"){
@Override
boolean isSufficient(@NotNull LanguageLevel useSiteLevel) {
LanguageLevel until = LanguageLevel.JDK_20_PREVIEW;
return until == level;
}
@Override
boolean isLimited() {
return true;
}
},
PATTERNS_IN_SWITCH(LanguageLevel.JDK_21, "feature.patterns.in.switch") {
@Override
boolean isSufficient(@NotNull LanguageLevel useSiteLevel) {
return super.isSufficient(useSiteLevel) || LanguageLevel.JDK_20_PREVIEW == useSiteLevel;
}
},
PATTERN_GUARDS_AND_RECORD_PATTERNS(LanguageLevel.JDK_21, "feature.pattern.guard.and.record.patterns"){
@Override
boolean isSufficient(@NotNull LanguageLevel useSiteLevel) {
return super.isSufficient(useSiteLevel) || LanguageLevel.JDK_20_PREVIEW == useSiteLevel;
}
},
RECORD_PATTERNS_IN_FOR_EACH(LanguageLevel.JDK_20_PREVIEW, "feature.record.patterns.in.for.each"){
@Override
boolean isSufficient(@NotNull LanguageLevel useSiteLevel) {
LanguageLevel until = LanguageLevel.JDK_20_PREVIEW;
return until == level;
}
@Override
boolean isLimited() {
return true;
}
};
public static final @NonNls String JDK_INTERNAL_PREVIEW_FEATURE = "jdk.internal.PreviewFeature";
public static final @NonNls String JDK_INTERNAL_JAVAC_PREVIEW_FEATURE = "jdk.internal.javac.PreviewFeature";
final LanguageLevel level;
@Nullable
private final LanguageLevel until;
@PropertyKey(resourceBundle = JavaErrorBundle.BUNDLE) final String key;
HighlightingFeature(@NotNull LanguageLevel level, @NotNull @PropertyKey(resourceBundle = JavaAnalysisBundle.BUNDLE) String key) {
this.level = level;
this.key = key;
this.until = null;
}
HighlightingFeature(@NotNull LanguageLevel from,
@NotNull LanguageLevel until,
@NotNull @PropertyKey(resourceBundle = JavaAnalysisBundle.BUNDLE) String key) {
if (!(from.isPreview() && until.isPreview())) {
throw new UnsupportedOperationException("Levels for temporary features must be preview");
}
this.level = from;
this.until = until;
this.key = key;
}
public LanguageLevel getLevel() {
return level;
}
@@ -91,12 +109,11 @@ public enum HighlightingFeature {
boolean isSufficient(@NotNull LanguageLevel useSiteLevel) {
return useSiteLevel.isAtLeast(level) &&
(!level.isPreview() || useSiteLevel.isPreview()) &&
(until == null || until.isAtLeast(useSiteLevel));
(!level.isPreview() || useSiteLevel.isPreview());
}
boolean isLimited() {
return until != null;
return false;
}
/**
* Override if feature was preview and then accepted as standard
@@ -38,7 +38,6 @@ public enum LanguageLevel {
JDK_17(JavaPsiBundle.messagePointer("jdk.17.language.level.description"), 17),
JDK_18(JavaPsiBundle.messagePointer("jdk.18.language.level.description"), 18),
JDK_19(JavaPsiBundle.messagePointer("jdk.19.language.level.description"), 19),
JDK_19_PREVIEW(JavaPsiBundle.messagePointer("jdk.19.preview.language.level.description"), 19),
JDK_20(JavaPsiBundle.messagePointer("jdk.20.language.level.description"), 20),
JDK_20_PREVIEW(JavaPsiBundle.messagePointer("jdk.20.preview.language.level.description"), 20),
JDK_21(JavaPsiBundle.messagePointer("jdk.21.language.level.description"), 21),
@@ -48,7 +47,7 @@ public enum LanguageLevel {
/**
* Should point to the last released JDK.
*/
public static final LanguageLevel HIGHEST = JDK_20;
public static final LanguageLevel HIGHEST = JDK_21;
private final Supplier<@Nls String> myPresentableText;
private final JavaVersion myVersion;
@@ -24,12 +24,12 @@ public enum LanguageLevel {
JDK_16(16),
JDK_17(17),
JDK_18(18),
JDK_19(19), JDK_19_PREVIEW(19),
JDK_19(19),
JDK_20(20), JDK_20_PREVIEW(20),
JDK_21(21), JDK_21_PREVIEW(21),
JDK_X(22);
public static final LanguageLevel HIGHEST = JDK_20;
public static final LanguageLevel HIGHEST = JDK_21;
private final JavaVersion myVersion;