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) {