From a4146e3008098136bdb5783806f3eb18fbb28a92 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 16 Jun 2020 09:05:49 +0200 Subject: [PATCH] java sealed types: completion for sealed/non-sealed/permits keywords GitOrigin-RevId: f689d6f04cd86947ce084f9a0b0f1787f81cf694 --- .../completion/JavaKeywordCompletion.java | 3 +++ .../codeInsight/completion/ModifierChooser.java | 14 +++++++++++--- .../completion/keywords/permitsList.java | 1 + .../completion/keywords/sealedModifier.java | 1 + .../completion/KeywordCompletionTest.java | 2 ++ 5 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/keywords/permitsList.java create mode 100644 java/java-tests/testData/codeInsight/completion/keywords/sealedModifier.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java index 41f6fd5dbbfb..5881e7470f6c 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java @@ -602,6 +602,9 @@ public class JavaKeywordCompletion { if (!psiClass.isInterface()) { addKeyword(new OverridableSpace(createKeyword(PsiKeyword.IMPLEMENTS), TailType.HUMBLE_SPACE_BEFORE_WORD)); } + if (psiClass.hasModifierProperty(PsiModifier.SEALED)) { + addKeyword(new OverridableSpace(createKeyword(PsiKeyword.PERMITS), TailType.HUMBLE_SPACE_BEFORE_WORD)); + } } } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/ModifierChooser.java b/java/java-impl/src/com/intellij/codeInsight/completion/ModifierChooser.java index 78e72ee2b34c..1a7a9733bd55 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/ModifierChooser.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/ModifierChooser.java @@ -1,6 +1,7 @@ // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.codeInsight.completion; +import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.filters.FilterPositionUtil; import com.intellij.psi.impl.source.jsp.jspJava.JspClassLevelDeclarationStatement; @@ -20,6 +21,13 @@ public class ModifierChooser { {PsiKeyword.PUBLIC}, {PsiKeyword.FINAL, PsiKeyword.ABSTRACT} }; + + private static final String[][] CLASS_15_MODIFIERS = { + {PsiKeyword.PUBLIC}, + {PsiKeyword.FINAL, PsiKeyword.ABSTRACT}, + {PsiKeyword.FINAL, PsiKeyword.SEALED, PsiKeyword.NON_SEALED} + }; + private static final String[][] CLASS_MEMBER_MODIFIERS = { {PsiKeyword.PUBLIC, PsiKeyword.PROTECTED, PsiKeyword.PRIVATE}, {PsiKeyword.STATIC}, @@ -57,7 +65,7 @@ public class ModifierChooser { PsiElement scope = position.getParent(); while (scope != null) { if (scope instanceof PsiJavaFile) { - return addClassModifiers(list); + return addClassModifiers(list, scope); } if (scope instanceof PsiClass) { return addMemberModifiers(list, ((PsiClass)scope).isInterface(), scope); @@ -69,8 +77,8 @@ public class ModifierChooser { return ArrayUtilRt.EMPTY_STRING_ARRAY; } - public static String[] addClassModifiers(PsiModifierList list) { - return addKeywords(list, CLASS_MODIFIERS); + public static String[] addClassModifiers(PsiModifierList list, @NotNull PsiElement scope) { + return addKeywords(list, PsiUtil.getLanguageLevel(scope).isAtLeast(LanguageLevel.JDK_15_PREVIEW) ? CLASS_15_MODIFIERS : CLASS_MODIFIERS); } public static String[] addMemberModifiers(PsiModifierList list, final boolean inInterface, @NotNull PsiElement position) { diff --git a/java/java-tests/testData/codeInsight/completion/keywords/permitsList.java b/java/java-tests/testData/codeInsight/completion/keywords/permitsList.java new file mode 100644 index 000000000000..5e0f2708f5e6 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/keywords/permitsList.java @@ -0,0 +1 @@ +sealed class Foo {} diff --git a/java/java-tests/testData/codeInsight/completion/keywords/sealedModifier.java b/java/java-tests/testData/codeInsight/completion/keywords/sealedModifier.java new file mode 100644 index 000000000000..12366150711b --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/keywords/sealedModifier.java @@ -0,0 +1 @@ + class Foo {} diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/KeywordCompletionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/KeywordCompletionTest.java index 0e4082906596..f0efca45c5d1 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/KeywordCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/KeywordCompletionTest.java @@ -186,6 +186,8 @@ public class KeywordCompletionTest extends LightCompletionTestCase { public void testQualifiedNew() { doTest(1, "new"); } public void testRecord() {setLanguageLevel(LanguageLevel.JDK_14_PREVIEW); doTest(); } public void testRecordInFileScope() {setLanguageLevel(LanguageLevel.JDK_14_PREVIEW); doTest(1, "record"); } + public void testSealedModifier() {setLanguageLevel(LanguageLevel.JDK_15_PREVIEW); doTest(1, "sealed"); } + public void testPermitsList() {setLanguageLevel(LanguageLevel.JDK_15_PREVIEW); doTest(1, "permits"); } public void testOverwriteCatch() { configureByTestName();