From 51b138bd7d9ec96f572ff536c63561a07169ff35 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 1 Oct 2019 21:04:42 +0200 Subject: [PATCH] IDEA-209608 When completing @Override, show element that shows override/implement dialog GitOrigin-RevId: 876745e7afe3540253f10f908de6b289b739bee8 --- ...vaGenerateMemberCompletionContributor.java | 14 ++++++ ...deMethodsWhenTypingOverrideAnnotation.java | 8 ++++ ...odsWhenTypingOverrideAnnotation_after.java | 45 +++++++++++++++++++ .../completion/NormalCompletionTest.groovy | 11 ++++- 4 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/normal/SuggestToOverrideMethodsWhenTypingOverrideAnnotation.java create mode 100644 java/java-tests/testData/codeInsight/completion/normal/SuggestToOverrideMethodsWhenTypingOverrideAnnotation_after.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaGenerateMemberCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaGenerateMemberCompletionContributor.java index 0aeccc3192ab..4d25490ff766 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaGenerateMemberCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaGenerateMemberCompletionContributor.java @@ -58,6 +58,9 @@ public class JavaGenerateMemberCompletionContributor { .withParents(PsiJavaCodeReferenceElement.class, PsiAnnotation.class, PsiModifierList.class, PsiClass.class).accepts(position)) { PsiAnnotation annotation = ObjectUtils.assertNotNull(PsiTreeUtil.getParentOfType(position, PsiAnnotation.class)); int annoStart = annotation.getTextRange().getStartOffset(); + + result.addElement(itemWithOverrideImplementDialog(annoStart)); + suggestGeneratedMethods( result.withPrefixMatcher(new NoMiddleMatchesAfterSpace(annotation.getText().substring(0, parameters.getOffset() - annoStart))), position, @@ -66,6 +69,17 @@ public class JavaGenerateMemberCompletionContributor { } + @NotNull + private static LookupElementBuilder itemWithOverrideImplementDialog(int annoStart) { + return LookupElementBuilder.create("Override/Implement methods...").withInsertHandler((context, item) -> { + context.getDocument().deleteString(annoStart, context.getTailOffset()); + context.setAddCompletionChar(false); + context.setLaterRunnable(() -> { + new OverrideMethodsHandler().invoke(context.getProject(), context.getEditor(), context.getFile()); + }); + }); + } + private static void suggestGeneratedMethods(CompletionResultSet result, PsiElement position, @Nullable PsiModifierList modifierList) { PsiClass parent = CompletionUtil.getOriginalElement(ObjectUtils.assertNotNull(PsiTreeUtil.getParentOfType(position, PsiClass.class))); if (parent != null) { diff --git a/java/java-tests/testData/codeInsight/completion/normal/SuggestToOverrideMethodsWhenTypingOverrideAnnotation.java b/java/java-tests/testData/codeInsight/completion/normal/SuggestToOverrideMethodsWhenTypingOverrideAnnotation.java new file mode 100644 index 000000000000..688cf384ad2b --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/SuggestToOverrideMethodsWhenTypingOverrideAnnotation.java @@ -0,0 +1,8 @@ +interface Foo { + void run(T t, int myInt); + void run2(T t, int myInt); +} + +class A implements Foo { + @Overr +} diff --git a/java/java-tests/testData/codeInsight/completion/normal/SuggestToOverrideMethodsWhenTypingOverrideAnnotation_after.java b/java/java-tests/testData/codeInsight/completion/normal/SuggestToOverrideMethodsWhenTypingOverrideAnnotation_after.java new file mode 100644 index 000000000000..21b2f73aec12 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/SuggestToOverrideMethodsWhenTypingOverrideAnnotation_after.java @@ -0,0 +1,45 @@ +interface Foo { + void run(T t, int myInt); + void run2(T t, int myInt); +} + +class A implements Foo { + public A() { + super(); + } + + @Override + public int hashCode() { + return super.hashCode(); + } + + @Override + public boolean equals(Object obj) { + return super.equals(obj); + } + + @Override + protected Object clone() throws CloneNotSupportedException { + return super.clone(); + } + + @Override + public String toString() { + return super.toString(); + } + + @Override + protected void finalize() throws Throwable { + super.finalize(); + } + + @Override + public void run(String s, int myInt) { + + } + + @Override + public void run2(String s, int myInt) { + + } +} 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 8571d4bf3200..a342579f5ba0 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 @@ -1501,8 +1501,15 @@ class XInternalError {} void testImplementViaOverrideCompletion() { configure() - myFixture.assertPreferredCompletionItems 0, 'Override', 'public void run' - lookup.currentItem = lookup.items[1] + myFixture.assertPreferredCompletionItems 0, 'Override/Implement methods...', 'Override', 'public void run' + lookup.currentItem = lookup.items[2] + myFixture.type('\n') + checkResult() + } + + void testSuggestToOverrideMethodsWhenTypingOverrideAnnotation() { + configure() + myFixture.assertPreferredCompletionItems 0, 'Override/Implement methods...', 'Override' myFixture.type('\n') checkResult() }