From ae1bd43e873c2c93f83943c4b79a6913ccd1cc21 Mon Sep 17 00:00:00 2001 From: "Roman.Ivanov" Date: Thu, 18 Jun 2020 15:19:01 +0700 Subject: [PATCH] JavaUsageTypeProvider: add special UsageType for permits clause: IDEA-243891 GitOrigin-RevId: bba4d7a50ee91aaf3c1e2ead2d0b56d48f7ba1ed --- .../usages/impl/rules/JavaUsageTypeProvider.java | 5 ++++- .../testData/psi/usages/PermitsClause.java | 3 +++ .../java/psi/usages/JavaUsageTypeProviderTest.java | 12 ++++++++++++ .../resources/messages/UsageViewBundle.properties | 1 + .../com/intellij/usages/impl/rules/UsageType.java | 1 + 5 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/psi/usages/PermitsClause.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 75e91eddf9b4..d8ee003ecfef 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 @@ -151,7 +151,10 @@ public class JavaUsageTypeProvider implements UsageTypeProviderEx { if (PsiTreeUtil.getParentOfType(element, PsiImportStatementBase.class, false) != null) return UsageType.CLASS_IMPORT; PsiReferenceList referenceList = PsiTreeUtil.getParentOfType(element, PsiReferenceList.class); if (referenceList != null) { - if (referenceList.getParent() instanceof PsiClass) return UsageType.CLASS_EXTENDS_IMPLEMENTS_LIST; + if (referenceList.getParent() instanceof PsiClass) { + if (referenceList.getRole() != PsiReferenceList.Role.PERMITS_LIST) return UsageType.CLASS_EXTENDS_IMPLEMENTS_LIST; + return UsageType.CLASS_PERMITS_LIST; + } if (referenceList.getParent() instanceof PsiMethod) return UsageType.CLASS_METHOD_THROWS_LIST; } if (PsiTreeUtil.getParentOfType(element, PsiTypeParameterList.class) != null || diff --git a/java/java-tests/testData/psi/usages/PermitsClause.java b/java/java-tests/testData/psi/usages/PermitsClause.java new file mode 100644 index 000000000000..284f31ca2ef6 --- /dev/null +++ b/java/java-tests/testData/psi/usages/PermitsClause.java @@ -0,0 +1,3 @@ +class MethodReferenceConstructor permits Foo { } + +non-sealed class Foo {} \ 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 2e465f666a0a..eef373456f9c 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 @@ -19,12 +19,19 @@ import com.intellij.JavaTestUtil; import com.intellij.find.findUsages.PsiElement2UsageTargetAdapter; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; +import com.intellij.testFramework.LightProjectDescriptor; import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase; import com.intellij.usages.UsageTarget; import com.intellij.usages.impl.rules.JavaUsageTypeProvider; import com.intellij.usages.impl.rules.UsageType; +import org.jetbrains.annotations.NotNull; public class JavaUsageTypeProviderTest extends LightJavaCodeInsightFixtureTestCase { + @Override + protected @NotNull LightProjectDescriptor getProjectDescriptor() { + return JAVA_15; + } + public void testNestedClassAccess() { myFixture.configureByFiles("NestedClassAccess.java", "Foo.java"); assertUsageType(UsageType.CLASS_NESTED_CLASS_ACCESS, myFixture.findClass("Foo")); @@ -55,6 +62,11 @@ public class JavaUsageTypeProviderTest extends LightJavaCodeInsightFixtureTestCa assertUsageType(UsageType.CLASS_NEW_OPERATOR, myFixture.findClass("Foo")); } + public void testPermitsClause() { + myFixture.configureByFiles("PermitsClause.java"); + assertUsageType(UsageType.CLASS_PERMITS_LIST, myFixture.findClass("Foo")); + } + 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 69fec063d3da..bfadfe527461 100644 --- a/platform/usageView/resources/messages/UsageViewBundle.properties +++ b/platform/usageView/resources/messages/UsageViewBundle.properties @@ -35,6 +35,7 @@ usage.type.instanceof=Usage in instanceof usage.type.import=Usage in import usage.type.cast.target=Usage in cast target type usage.type.extends=Usage in extends/implements clause +usage.type.permits=Usage in permits clause usage.type.static.member=Class static member access usage.type.nested.class=Nested class access usage.type.throws.list=Method throws list 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 6831f5bf8064..180081d2ba73 100644 --- a/platform/usageView/src/com/intellij/usages/impl/rules/UsageType.java +++ b/platform/usageView/src/com/intellij/usages/impl/rules/UsageType.java @@ -15,6 +15,7 @@ public final class UsageType { public static final UsageType CLASS_IMPORT = new UsageType(UsageViewBundle.messagePointer("usage.type.import")); public static final UsageType CLASS_CAST_TO = new UsageType(UsageViewBundle.messagePointer("usage.type.cast.target")); public static final UsageType CLASS_EXTENDS_IMPLEMENTS_LIST = new UsageType(UsageViewBundle.messagePointer("usage.type.extends")); + public static final UsageType CLASS_PERMITS_LIST = new UsageType(UsageViewBundle.messagePointer("usage.type.permits")); public static final UsageType CLASS_STATIC_MEMBER_ACCESS = new UsageType(UsageViewBundle.messagePointer("usage.type.static.member")); public static final UsageType CLASS_NESTED_CLASS_ACCESS = new UsageType(UsageViewBundle.messagePointer("usage.type.nested.class")); public static final UsageType CLASS_METHOD_THROWS_LIST = new UsageType(UsageViewBundle.messagePointer("usage.type.throws.list"));