IDEA-54220 Code Completion for value() method in @interfaces could be added

This commit is contained in:
peter
2012-03-07 19:58:58 +04:00
parent 91fb524a30
commit f3b09cee3a
7 changed files with 38 additions and 5 deletions

View File

@@ -15,6 +15,7 @@
*/
package com.intellij.codeInsight.completion;
import com.intellij.codeInsight.completion.util.ParenthesesInsertHandler;
import com.intellij.codeInsight.lookup.*;
import com.intellij.featureStatistics.FeatureUsageTracker;
import com.intellij.openapi.project.Project;
@@ -33,6 +34,7 @@ import com.intellij.psi.util.PsiUtil;
import com.intellij.refactoring.introduceField.InplaceIntroduceFieldPopup;
import com.intellij.refactoring.introduceVariable.IntroduceVariableBase;
import com.intellij.util.ArrayUtil;
import com.intellij.util.PlatformIcons;
import com.intellij.util.ProcessingContext;
import com.intellij.util.containers.ContainerUtil;
import gnu.trove.THashSet;
@@ -81,8 +83,8 @@ public class JavaMemberNameCompletionContributor extends CompletionContributor {
public void addCompletions(@NotNull final CompletionParameters parameters, final ProcessingContext matchingContext, @NotNull final CompletionResultSet result) {
final Set<LookupElement> lookupSet = new THashSet<LookupElement>();
final PsiField variable = (PsiField)parameters.getPosition().getParent();
completeFieldName(lookupSet, variable, result.getPrefixMatcher(), parameters.getInvocationCount() >= 1);
completeMethodName(lookupSet, variable, result.getPrefixMatcher());
completeFieldName(lookupSet, variable, result.getPrefixMatcher(), parameters.getInvocationCount() >= 1);
for (final LookupElement item : lookupSet) {
result.addElement(item);
}
@@ -248,7 +250,7 @@ public class JavaMemberNameCompletionContributor extends CompletionContributor {
final VariableKind variableKind = JavaCodeStyleManager.getInstance(project).getVariableKind(var);
final String prefix = matcher.getPrefix();
if (PsiType.VOID.equals(var.getType()) || psiField().inClass(psiClass().isInterface()).accepts(var)) {
if (PsiType.VOID.equals(var.getType()) || psiField().inClass(psiClass().isInterface().andNot(psiClass().isAnnotationType())).accepts(var)) {
completeVariableNameForRefactoring(project, set, matcher, var.getType(), variableKind, includeOverlapped, true);
return;
}
@@ -340,6 +342,14 @@ public class JavaMemberNameCompletionContributor extends CompletionContributor {
PsiClass ourClassParent = PsiTreeUtil.getParentOfType(element, PsiClass.class);
if (ourClassParent == null) return;
if (ourClassParent.isAnnotationType() && matcher.prefixMatches(PsiAnnotation.DEFAULT_REFERENCED_METHOD_NAME)) {
set.add(LookupElementBuilder.create(PsiAnnotation.DEFAULT_REFERENCED_METHOD_NAME)
.setIcon(PlatformIcons.METHOD_ICON)
.setTailText("()")
.setInsertHandler(ParenthesesInsertHandler.NO_PARAMETERS));
}
addLookupItems(set, null, matcher, element.getProject(), getUnresolvedReferences(ourClassParent, true));
addLookupItems(set, null, matcher, element.getProject(), getPropertiesHandlersNames(

View File

@@ -0,0 +1,3 @@
@interface Some {
String v<caret>
}

View File

@@ -0,0 +1,3 @@
@interface Some {
String value()<caret>
}

View File

@@ -0,0 +1,7 @@
public class Foo {
public void a() {
int i = createStylesheetCombobox();
}
private int createStylesheetCombobox<caret>
}

View File

@@ -94,7 +94,7 @@ public class HeavyNormalCompletionTest extends JavaCodeInsightFixtureTestCase {
myFixture.configureByFile("/codeInsight/completion/normal/" + getTestName(false) + ".java");
assertInstanceOf(myFixture.getFile().getVirtualFile().getFileSystem(), LocalFileSystem.class); // otherwise the completion copy won't be preserved which is critical here
myFixture.completeBasic();
assertOrderedEquals(myFixture.getLookupElementStrings(), "gAnInt", "getAaa", "getBbb");
assertOrderedEquals(myFixture.getLookupElementStrings(), "getAaa", "getBbb");
myFixture.getEditor().getCaretModel().moveToOffset(myFixture.getEditor().getCaretModel().getOffset() + 2);
assertNull(myFixture.completeBasic());
}

View File

@@ -138,8 +138,7 @@ public class VariablesCompletionTest extends LightFixtureCompletionTestCase {
public void testUnresolvedMethodName() throws Exception {
configureByFile(FILE_PREFIX + "locals/" + "UnresolvedMethodName.java");
complete();
checkResultByFile(FILE_PREFIX + "locals/" + "UnresolvedMethodName.java");
assert myFixture.lookupElementStrings.containsAll(["creAnInt", "createStylesheetCombobox"])
checkResultByFile(FILE_PREFIX + "locals/" + "UnresolvedMethodName_after.java");
}
public void testArrayMethodName() throws Throwable {
@@ -172,6 +171,11 @@ public class VariablesCompletionTest extends LightFixtureCompletionTestCase {
configureByFile(FILE_PREFIX + getTestName(false) + ".java")
}
public void testAnnotationValue() {
configure()
checkResultByFile(FILE_PREFIX + getTestName(false) + "_after.java")
}
public void testConstructorParameterName() {
configure()
assertStringItems("color");

View File

@@ -61,6 +61,12 @@ public class PsiClassPattern extends PsiMemberPattern<PsiClass, PsiClassPattern>
return psiClass.isInterface();
}
});}
public PsiClassPattern isAnnotationType() {
return with(new PatternCondition<PsiClass>("isAnnotationType") {
public boolean accepts(@NotNull final PsiClass psiClass, final ProcessingContext context) {
return psiClass.isAnnotationType();
}
});}
public PsiClassPattern withMethod(final boolean checkDeep, final ElementPattern<? extends PsiMethod> memberPattern) {
return with(new PatternCondition<PsiClass>("withMethod") {