From 13d082389af20c4d2fa1dee508407673bd04bb14 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Mon, 23 Dec 2019 15:40:57 +0700 Subject: [PATCH] Suggest "implements" after record header; don't suggest "extends" for records and enums; don't suggest "class" after record header Part of IDEA-229300 GitOrigin-RevId: 763781d7a37be1d3d5a4e8fd158471820e31372b --- .../completion/JavaKeywordCompletion.java | 18 +++++++++---- .../completion/Normal14CompletionTest.groovy | 27 +++++++++++++++++++ .../completion/NormalCompletionTest.groovy | 6 +++++ 3 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 java/java-tests/testSrc/com/intellij/java/codeInsight/completion/Normal14CompletionTest.groovy 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 c8bf23ec72f7..cee790443eff 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java @@ -86,7 +86,8 @@ public class JavaKeywordCompletion { return PsiTreeUtil.getParentOfType(PsiTreeUtil.prevVisibleLeaf(element), PsiDocComment.class) != null; } - return !(parent instanceof PsiExpressionList || parent instanceof PsiTypeCastExpression); + return !(parent instanceof PsiExpressionList || parent instanceof PsiTypeCastExpression + || parent instanceof PsiRecordHeader); } return false; @@ -579,24 +580,31 @@ public class JavaKeywordCompletion { } private void addExtendsImplements() { - if (myPrevLeaf == null || !(myPrevLeaf instanceof PsiIdentifier || myPrevLeaf.textMatches(">"))) return; + if (myPrevLeaf == null || + !(myPrevLeaf instanceof PsiIdentifier || myPrevLeaf.textMatches(">") || myPrevLeaf.textMatches(")"))) { + return; + } PsiClass psiClass = null; PsiElement prevParent = myPrevLeaf.getParent(); if (myPrevLeaf instanceof PsiIdentifier && prevParent instanceof PsiClass) { psiClass = (PsiClass)prevParent; - } else { + } + else { PsiReferenceList referenceList = PsiTreeUtil.getParentOfType(myPrevLeaf, PsiReferenceList.class); if (referenceList != null && referenceList.getParent() instanceof PsiClass) { psiClass = (PsiClass)referenceList.getParent(); } - else if (prevParent instanceof PsiTypeParameterList && prevParent.getParent() instanceof PsiClass) { + else if ((prevParent instanceof PsiTypeParameterList || prevParent instanceof PsiRecordHeader) + && prevParent.getParent() instanceof PsiClass) { psiClass = (PsiClass)prevParent.getParent(); } } if (psiClass != null) { - addKeyword(new OverridableSpace(createKeyword(PsiKeyword.EXTENDS), TailType.HUMBLE_SPACE_BEFORE_WORD)); + if (!psiClass.isEnum() && !psiClass.isRecord()) { + addKeyword(new OverridableSpace(createKeyword(PsiKeyword.EXTENDS), TailType.HUMBLE_SPACE_BEFORE_WORD)); + } if (!psiClass.isInterface()) { addKeyword(new OverridableSpace(createKeyword(PsiKeyword.IMPLEMENTS), TailType.HUMBLE_SPACE_BEFORE_WORD)); } diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/Normal14CompletionTest.groovy b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/Normal14CompletionTest.groovy new file mode 100644 index 000000000000..1a352776be68 --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/Normal14CompletionTest.groovy @@ -0,0 +1,27 @@ +// Copyright 2000-2019 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.java.codeInsight.completion + +import com.intellij.testFramework.LightProjectDescriptor +import groovy.transform.CompileStatic +import org.jetbrains.annotations.NotNull + +@CompileStatic +class Normal14CompletionTest extends NormalCompletionTestCase { + @NotNull + @Override + protected LightProjectDescriptor getProjectDescriptor() { + return JAVA_14 + } + + void testRecordImplements() { + myFixture.configureByText("a.java", "record X() impl") + myFixture.completeBasic() + myFixture.checkResult("record X() implements ") + } + + void testRecordNoClassAfterHeader() { + myFixture.configureByText("a.java", "record X() cla") + myFixture.completeBasic() + myFixture.checkResult("record X() cla") + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionTest.groovy b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionTest.groovy index 96f96d0d1b06..48e2ad2a6374 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionTest.groovy @@ -1944,4 +1944,10 @@ class Abc { } void testNoCallsAfterAnnotationInCodeBlock() { doTest() } + + void testExtendsAfterEnum() { + myFixture.configureByText("a.java", "enum X ex") // should not complete + myFixture.completeBasic() + myFixture.checkResult("enum X ex") + } }