From 29f21baf4ada85f8074b9c4f3dd520d35280bb05 Mon Sep 17 00:00:00 2001 From: Roman Ivanov Date: Tue, 16 Aug 2022 16:18:03 +0200 Subject: [PATCH] IDEA-300046 add pattern usage type for java patterns GitOrigin-RevId: 8fce1a459ef4d18c6f5aef44eb4988b1770a6ffa --- .../usages/impl/rules/JavaUsageTypeProvider.java | 4 ++++ .../testData/psi/usages/PatternInInstanceof.java | 6 ++++++ .../testData/psi/usages/PatternInSwitch.java | 7 +++++++ .../java/psi/usages/JavaUsageTypeProviderTest.java | 10 ++++++++++ .../resources/messages/UsageViewBundle.properties | 1 + .../src/com/intellij/usages/impl/rules/UsageType.java | 1 + 6 files changed, 29 insertions(+) create mode 100644 java/java-tests/testData/psi/usages/PatternInInstanceof.java create mode 100644 java/java-tests/testData/psi/usages/PatternInSwitch.java diff --git a/java/java-impl/src/com/intellij/usages/impl/rules/JavaUsageTypeProvider.java b/java/java-impl/src/com/intellij/usages/impl/rules/JavaUsageTypeProvider.java index 3091dc85b28b..737f8ebacc92 100644 --- a/java/java-impl/src/com/intellij/usages/impl/rules/JavaUsageTypeProvider.java +++ b/java/java-impl/src/com/intellij/usages/impl/rules/JavaUsageTypeProvider.java @@ -142,6 +142,10 @@ public final class JavaUsageTypeProvider implements UsageTypeProviderEx { return UsageType.ANNOTATION; } + if (element.getParent() instanceof PsiTypeElement && element.getParent().getParent() instanceof PsiPattern) { + return UsageType.PATTERN; + } + if (PsiTreeUtil.getParentOfType(element, PsiImportStatementBase.class, false) != null) return UsageType.CLASS_IMPORT; PsiReferenceList referenceList = PsiTreeUtil.getParentOfType(element, PsiReferenceList.class); if (referenceList != null) { diff --git a/java/java-tests/testData/psi/usages/PatternInInstanceof.java b/java/java-tests/testData/psi/usages/PatternInInstanceof.java new file mode 100644 index 000000000000..7884ccc268ca --- /dev/null +++ b/java/java-tests/testData/psi/usages/PatternInInstanceof.java @@ -0,0 +1,6 @@ +record Rec(int x, String s) { + void foo(Object o) { + if (o instanceof Rec(int patternX, String s) r) { + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/usages/PatternInSwitch.java b/java/java-tests/testData/psi/usages/PatternInSwitch.java new file mode 100644 index 000000000000..8b62698347d4 --- /dev/null +++ b/java/java-tests/testData/psi/usages/PatternInSwitch.java @@ -0,0 +1,7 @@ +record Rec(int x, String s) { + void foo(Object o) { + switch (o) { + case Rec(int patternX, String s) -> {} + } + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/psi/usages/JavaUsageTypeProviderTest.java b/java/java-tests/testSrc/com/intellij/java/psi/usages/JavaUsageTypeProviderTest.java index 75c2ec94e02c..a39a019e7ba2 100644 --- a/java/java-tests/testSrc/com/intellij/java/psi/usages/JavaUsageTypeProviderTest.java +++ b/java/java-tests/testSrc/com/intellij/java/psi/usages/JavaUsageTypeProviderTest.java @@ -47,6 +47,16 @@ public class JavaUsageTypeProviderTest extends LightJavaCodeInsightFixtureTestCa assertUsageType(UsageType.CLASS_PERMITS_LIST, myFixture.findClass("Foo")); } + public void testPatternInSwitch() { + myFixture.configureByFiles("PatternInSwitch.java"); + assertUsageType(UsageType.PATTERN, myFixture.findClass("Rec")); + } + + public void testPatternInInstanceof() { + myFixture.configureByFiles("PatternInInstanceof.java"); + assertUsageType(UsageType.PATTERN, myFixture.findClass("Rec")); + } + private void assertUsageType(UsageType expected, PsiClass target) { UsageTarget[] targets = {new PsiElement2UsageTargetAdapter(target)}; PsiElement element = myFixture.getReferenceAtCaretPositionWithAssertion().getElement(); diff --git a/platform/usageView/resources/messages/UsageViewBundle.properties b/platform/usageView/resources/messages/UsageViewBundle.properties index 528d4abc237e..d1d6a030dd49 100644 --- a/platform/usageView/resources/messages/UsageViewBundle.properties +++ b/platform/usageView/resources/messages/UsageViewBundle.properties @@ -61,6 +61,7 @@ usage.type.new.anonymous=New anonymous inheritor creation usage.type.new.array=New array creation usage.type.annotation=Annotation usage.type.type.parameter=Type parameter +usage.type.type.pattern=Pattern usage.type.read=Value read usage.type.write=Value write preview.usages.action.text=Preview Source diff --git a/platform/usageView/src/com/intellij/usages/impl/rules/UsageType.java b/platform/usageView/src/com/intellij/usages/impl/rules/UsageType.java index 036c35b69971..e925b0d59d1f 100644 --- a/platform/usageView/src/com/intellij/usages/impl/rules/UsageType.java +++ b/platform/usageView/src/com/intellij/usages/impl/rules/UsageType.java @@ -29,6 +29,7 @@ public final class UsageType { public static final UsageType CLASS_NEW_ARRAY = new UsageType(UsageViewBundle.messagePointer("usage.type.new.array")); public static final UsageType ANNOTATION = new UsageType(UsageViewBundle.messagePointer("usage.type.annotation")); public static final UsageType TYPE_PARAMETER = new UsageType(UsageViewBundle.messagePointer("usage.type.type.parameter")); + public static final UsageType PATTERN = new UsageType(UsageViewBundle.messagePointer("usage.type.type.parameter")); public static final UsageType READ = new UsageType(UsageViewBundle.messagePointer("usage.type.read")); public static final UsageType WRITE = new UsageType(UsageViewBundle.messagePointer("usage.type.write"));