diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightingFeature.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightingFeature.java
index 009a9101eae5..22007828278f 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightingFeature.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightingFeature.java
@@ -89,7 +89,12 @@ public enum HighlightingFeature {
},
ENUM_QUALIFIED_NAME_IN_SWITCH(LanguageLevel.JDK_21, "feature.enum.qualified.name.in.switch"),
STRING_TEMPLATES(LanguageLevel.JDK_21_PREVIEW, "feature.string.templates"),
- UNNAMED_PATTERNS_AND_VARIABLES(LanguageLevel.JDK_21_PREVIEW, "feature.unnamed.vars"),
+ UNNAMED_PATTERNS_AND_VARIABLES(LanguageLevel.JDK_22, "feature.unnamed.vars") {
+ @Override
+ boolean isSufficient(@NotNull LanguageLevel useSiteLevel) {
+ return super.isSufficient(useSiteLevel) || LanguageLevel.JDK_21_PREVIEW == useSiteLevel;
+ }
+ },
UNNAMED_CLASSES(LanguageLevel.JDK_21_PREVIEW, "feature.unnamed.classes");
public static final @NonNls String JDK_INTERNAL_PREVIEW_FEATURE = "jdk.internal.PreviewFeature";
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatterns/UnnamedPatternsJava22.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatterns/UnnamedPatternsJava22.java
new file mode 100644
index 000000000000..1c3c17e07c04
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatterns/UnnamedPatternsJava22.java
@@ -0,0 +1,47 @@
+public class UnnamedPatterns {
+ record R(int a, int b) {}
+
+ void test(Object obj) {
+ if (obj instanceof _) {}
+
+ if (obj instanceof R(_, _)) {}
+ if (obj instanceof R(int a, _)) {
+ System.out.println(a);
+ }
+ if (obj instanceof R(_, int b)) {
+ System.out.println(b);
+ }
+ if (obj instanceof R(_, _, _)) {
+ }
+ }
+
+ void testSwitch(Object obj) {
+ switch (obj) {
+ case R(_, var b) -> {
+ }
+ case R(var c, var b) -> {
+ }
+ case R(int a, _) -> {
+ }
+ default -> {
+ }
+ }
+ }
+
+ void testExhaustiveness(I a) {
+ boolean r3 = switch (a) {
+ case R1(_) -> true;
+ case R2(_) -> false;
+ };
+ }
+
+ void testNonExhaustiveness(I a) {
+ boolean r3 = switch (a) {
+ case R1(_) -> true;
+ };
+ }
+
+ sealed interface I {};
+ record R1(int n1) implements I {};
+ record R2(int n1) implements I {};
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingUnnamed/UnnamedVariablesJava22.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingUnnamed/UnnamedVariablesJava22.java
new file mode 100644
index 000000000000..bb9e38681586
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingUnnamed/UnnamedVariablesJava22.java
@@ -0,0 +1,57 @@
+import java.util.function.*;
+
+public class UnnamedVariables {
+ void testParameter(int _, String _) {
+ System.out.println(_);
+ }
+
+ int _ = 123;
+ String s = _;
+
+ void testLambda() {
+ Consumer consumer = _ -> System.out.println("Hello");
+ Consumer consumer2 = _ -> System.out.println(_);
+ Consumer consumer3 = _ -> System.out.println(_.trim());
+ Consumer consumer4 = _ -> {
+ var v = _;
+ System.out.println(v.trim());
+ };
+ BiConsumer consumer5 = (_,_) -> {};
+ }
+
+ void testWhen(Object obj) {
+ switch (obj) {
+ case String _ when _.isEmpty() -> {}
+ }
+ }
+
+ void testLocal() {
+ int _ = 10;
+ int _ = 20;
+ int _[] = {30};
+ int[] _ = {40};
+ var _ = "string";
+ for (int _ = 1;;) {}
+ }
+
+ void testNoInitializer() {
+ int _;
+
+ for(int _;;) {}
+ }
+
+ void testCatch() {
+ try {
+ System.out.println();
+ }
+ catch (Exception _) {
+ System.out.println("ignore");
+ }
+ catch (Error _) {
+ int _ = 1;
+ for(int _:new int[10]) {
+ System.out.println("oops");
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/UnnamedPatternsJava22.java b/java/java-tests/testData/inspection/dataFlow/fixture/UnnamedPatternsJava22.java
new file mode 100644
index 000000000000..88eacce1d7e5
--- /dev/null
+++ b/java/java-tests/testData/inspection/dataFlow/fixture/UnnamedPatternsJava22.java
@@ -0,0 +1,25 @@
+class Test {
+ public static String testReach(Object o1, Object o2) {
+ return switch (o1) {
+ case String _ when o2 instanceof String s: yield s;
+ case Object _: yield "strange";
+ };
+ }
+
+ record R(int x, int y) {}
+ void test(Object obj) {
+ if (obj instanceof R(_, var b)) {
+ return;
+ }
+ if (obj instanceof R(var a, var b)) {
+ return;
+ }
+ if (obj instanceof R(int a, _)) {
+ return;
+ }
+ }
+
+ public static void main(String[] args) {
+ System.out.println(testReach("1", "2"));
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/quickfix/ChangeToUnnamedPatternTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/quickfix/ChangeToUnnamedPatternTest.java
index 8a62bb8a6bdf..203aa1839ca0 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/quickfix/ChangeToUnnamedPatternTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/quickfix/ChangeToUnnamedPatternTest.java
@@ -6,7 +6,7 @@ import com.intellij.codeInspection.deadCode.UnusedDeclarationInspectionBase;
import com.intellij.testFramework.LightProjectDescriptor;
import org.jetbrains.annotations.NotNull;
-import static com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase.JAVA_21;
+import static com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase.JAVA_22;
public class ChangeToUnnamedPatternTest extends LightIntentionActionTestCase {
@Override
@@ -18,7 +18,7 @@ public class ChangeToUnnamedPatternTest extends LightIntentionActionTestCase {
@NotNull
@Override
protected LightProjectDescriptor getProjectDescriptor() {
- return JAVA_21;
+ return JAVA_22;
}
@Override
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/quickfix/RenameToUnnamedVariableTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/quickfix/RenameToUnnamedVariableTest.java
index bec98326f2a0..a28e38839a9a 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/quickfix/RenameToUnnamedVariableTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/quickfix/RenameToUnnamedVariableTest.java
@@ -3,11 +3,10 @@ package com.intellij.codeInsight.daemon.impl.quickfix;
import com.intellij.codeInsight.daemon.LightIntentionActionTestCase;
import com.intellij.codeInspection.deadCode.UnusedDeclarationInspection;
-import com.intellij.codeInspection.deadCode.UnusedDeclarationInspectionBase;
import com.intellij.testFramework.LightProjectDescriptor;
import org.jetbrains.annotations.NotNull;
-import static com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase.JAVA_21;
+import static com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase.JAVA_22;
public class RenameToUnnamedVariableTest extends LightIntentionActionTestCase {
@Override
@@ -19,7 +18,7 @@ public class RenameToUnnamedVariableTest extends LightIntentionActionTestCase {
@NotNull
@Override
protected LightProjectDescriptor getProjectDescriptor() {
- return JAVA_21;
+ return JAVA_22;
}
@Override
diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightPatternsHighlightingTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightPatternsHighlightingTest.java
index 3b7503825d88..9fdbcd42a8e5 100644
--- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightPatternsHighlightingTest.java
+++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightPatternsHighlightingTest.java
@@ -98,9 +98,13 @@ public class LightPatternsHighlightingTest extends LightJavaCodeInsightFixtureTe
}
public void testUnnamedPatterns() {
- doTest();
- }
-
+ IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_21_PREVIEW, this::doTest);
+ }
+
+ public void testUnnamedPatternsJava22() {
+ IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_22, this::doTest);
+ }
+
public void testUnnamedPatternsUnavailable() {
IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_20, this::doTest);
}
diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightUnnamedVariablesHighlightingTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightUnnamedVariablesHighlightingTest.java
index 661ce58320c0..33393e81d6c6 100644
--- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightUnnamedVariablesHighlightingTest.java
+++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightUnnamedVariablesHighlightingTest.java
@@ -16,13 +16,17 @@ public class LightUnnamedVariablesHighlightingTest extends LightJavaCodeInsightF
@Override
protected @NotNull LightProjectDescriptor getProjectDescriptor() {
- return JAVA_21;
+ return JAVA_22;
}
public void testUnnamedVariables() {
+ IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_21_PREVIEW, () -> doTest());
+ }
+
+ public void testUnnamedVariablesJava22() {
doTest();
- }
-
+ }
+
public void testUnnamedVariablesInGuard() {
doTest();
}
diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection21Test.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection21Test.java
index 9d087d214655..4e78ffa004b3 100644
--- a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection21Test.java
+++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection21Test.java
@@ -2,6 +2,8 @@
package com.intellij.java.codeInspection;
import com.intellij.JavaTestUtil;
+import com.intellij.pom.java.LanguageLevel;
+import com.intellij.testFramework.IdeaTestUtil;
import com.intellij.testFramework.LightProjectDescriptor;
import org.jetbrains.annotations.NotNull;
@@ -55,7 +57,11 @@ public class DataFlowInspection21Test extends DataFlowInspectionTestCase {
public void testUnnamedPatterns() {
doTest();
}
-
+
+ public void testUnnamedPatternsJava22() {
+ IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_22, this::doTest);
+ }
+
public void testPatternInStreamNotComplex() {
doTest();
}
diff --git a/java/testFramework/src/com/intellij/testFramework/fixtures/LightJavaCodeInsightFixtureTestCase.java b/java/testFramework/src/com/intellij/testFramework/fixtures/LightJavaCodeInsightFixtureTestCase.java
index e9bbcae00408..813f23a2437c 100644
--- a/java/testFramework/src/com/intellij/testFramework/fixtures/LightJavaCodeInsightFixtureTestCase.java
+++ b/java/testFramework/src/com/intellij/testFramework/fixtures/LightJavaCodeInsightFixtureTestCase.java
@@ -90,6 +90,7 @@ public abstract class LightJavaCodeInsightFixtureTestCase extends UsefulTestCase
public static final @NotNull LightProjectDescriptor JAVA_19 = new ProjectDescriptor(LanguageLevel.JDK_19);
public static final @NotNull LightProjectDescriptor JAVA_20 = new ProjectDescriptor(LanguageLevel.JDK_20_PREVIEW);
public static final @NotNull LightProjectDescriptor JAVA_21 = new ProjectDescriptor(LanguageLevel.JDK_21_PREVIEW);
+ public static final @NotNull LightProjectDescriptor JAVA_22 = new ProjectDescriptor(LanguageLevel.JDK_22_PREVIEW);
public static final @NotNull LightProjectDescriptor JAVA_X = new ProjectDescriptor(LanguageLevel.JDK_X);
public static final @NotNull LightProjectDescriptor JAVA_LATEST = new ProjectDescriptor(LanguageLevel.HIGHEST) {