mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-04-21 22:11:40 +07:00
IDEA-131145 Completion for @Override
This commit is contained in:
@@ -23,11 +23,9 @@ import com.intellij.openapi.util.Iconable;
|
||||
import com.intellij.openapi.util.Key;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.infos.CandidateInfo;
|
||||
import com.intellij.psi.util.MethodSignature;
|
||||
import com.intellij.psi.util.PsiFormatUtil;
|
||||
import com.intellij.psi.util.PsiFormatUtilBase;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.psi.util.*;
|
||||
import com.intellij.ui.RowIcon;
|
||||
import com.intellij.util.ObjectUtils;
|
||||
import com.intellij.util.VisibilityUtil;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
|
||||
@@ -54,17 +52,26 @@ public class JavaGenerateMemberCompletionContributor {
|
||||
if (psiElement(PsiIdentifier.class).withParents(PsiJavaCodeReferenceElement.class, PsiTypeElement.class, PsiClass.class).
|
||||
andNot(JavaCompletionData.AFTER_DOT).
|
||||
andNot(psiElement().afterLeaf(psiElement().inside(PsiModifierList.class))).accepts(position)) {
|
||||
final PsiClass parent = CompletionUtil.getOriginalElement((PsiClass)position.getParent().getParent().getParent());
|
||||
if (parent != null) {
|
||||
Set<MethodSignature> addedSignatures = ContainerUtil.newHashSet();
|
||||
addGetterSetterElements(result, parent, addedSignatures);
|
||||
addSuperSignatureElements(parent, true, result, addedSignatures);
|
||||
addSuperSignatureElements(parent, false, result, addedSignatures);
|
||||
}
|
||||
suggestGeneratedMethods(result, position);
|
||||
} else if (psiElement(PsiIdentifier.class)
|
||||
.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();
|
||||
suggestGeneratedMethods(result.withPrefixMatcher(annotation.getText().substring(0, parameters.getOffset() - annoStart)), position);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static void suggestGeneratedMethods(CompletionResultSet result, PsiElement position) {
|
||||
PsiClass parent = CompletionUtil.getOriginalElement(ObjectUtils.assertNotNull(PsiTreeUtil.getParentOfType(position, PsiClass.class)));
|
||||
if (parent != null) {
|
||||
Set<MethodSignature> addedSignatures = ContainerUtil.newHashSet();
|
||||
addGetterSetterElements(result, parent, addedSignatures);
|
||||
addSuperSignatureElements(parent, true, result, addedSignatures);
|
||||
addSuperSignatureElements(parent, false, result, addedSignatures);
|
||||
}
|
||||
}
|
||||
|
||||
private static void addGetterSetterElements(CompletionResultSet result, PsiClass parent, Set<MethodSignature> addedSignatures) {
|
||||
List<PsiMethod> prototypes = ContainerUtil.newArrayList();
|
||||
for (PsiField field : parent.getFields()) {
|
||||
@@ -148,8 +155,9 @@ public class JavaGenerateMemberCompletionContributor {
|
||||
|
||||
String parameters = PsiFormatUtil.formatMethod(prototype, substitutor, PsiFormatUtilBase.SHOW_PARAMETERS, PsiFormatUtilBase.SHOW_NAME);
|
||||
|
||||
String overrideSignature = " @Override " + signature; // leading space to make it a middle match, under all annotation suggestions
|
||||
LookupElementBuilder element = LookupElementBuilder.create(prototype, signature).withLookupString(methodName).
|
||||
withLookupString(signature).withInsertHandler(insertHandler).
|
||||
withLookupString(signature).withLookupString(overrideSignature).withInsertHandler(insertHandler).
|
||||
appendTailText(parameters, false).appendTailText(" {...}", true).withTypeText(typeText).withIcon(icon);
|
||||
element.putUserData(GENERATE_ELEMENT, true);
|
||||
return element;
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
interface Foo<T> {
|
||||
void run(T t, int myInt);
|
||||
}
|
||||
|
||||
public class A implements Foo<String> {
|
||||
@Overr<caret>
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
interface Foo<T> {
|
||||
void run(T t, int myInt);
|
||||
}
|
||||
|
||||
public class A implements Foo<String> {
|
||||
@Override
|
||||
public void run(String s, int myInt) {
|
||||
<caret>
|
||||
}
|
||||
}
|
||||
@@ -1355,6 +1355,14 @@ class XInternalError {}
|
||||
checkResult()
|
||||
}
|
||||
|
||||
public void testImplementViaOverrideCompletion() {
|
||||
configure()
|
||||
myFixture.assertPreferredCompletionItems 0, 'Override', 'public void run'
|
||||
lookup.currentItem = lookup.items[1]
|
||||
myFixture.type('\n')
|
||||
checkResult()
|
||||
}
|
||||
|
||||
public void testAccessorViaCompletion() {
|
||||
configure()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user