diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java index 053a9f22cba9..68b696205aec 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java @@ -124,15 +124,15 @@ public class JavaCompletionUtil { } public static void completeVariableNameForRefactoring(Project project, Set set, String prefix, PsiType varType, VariableKind varKind) { - JavaMemberNameCompletionContributor.completeVariableNameForRefactoring(project, set, new CamelHumpMatcher(prefix), varType, varKind, - true); + final CamelHumpMatcher camelHumpMatcher = new CamelHumpMatcher(prefix); + JavaMemberNameCompletionContributor.completeVariableNameForRefactoring(project, set, camelHumpMatcher, varType, varKind, true, false); } public static String[] completeVariableNameForRefactoring(JavaCodeStyleManager codeStyleManager, final PsiType varType, final VariableKind varKind, SuggestedNameInfo suggestedNameInfo) { return JavaMemberNameCompletionContributor - .completeVariableNameForRefactoring(codeStyleManager, new CamelHumpMatcher(""), varType, varKind, suggestedNameInfo, true); + .completeVariableNameForRefactoring(codeStyleManager, new CamelHumpMatcher(""), varType, varKind, suggestedNameInfo, true, false); } public static PsiType eliminateWildcards(PsiType type) { @@ -183,18 +183,6 @@ public class JavaCompletionUtil { return false; } - private static PsiClass findClassByName(PsiClass defResult, PsiClass[] classes) { - String name = defResult.getName(); - if (name == null) return defResult; - - for (PsiClass candidate : classes) { - if (name.equals(candidate.getName())) { - return candidate; - } - } - return defResult; - } - @SuppressWarnings({"unchecked"}) @NotNull public static T originalize(@NotNull T type) { diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaMemberNameCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaMemberNameCompletionContributor.java index abaae52f8509..840b0f532f57 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaMemberNameCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaMemberNameCompletionContributor.java @@ -42,6 +42,8 @@ import org.jetbrains.annotations.NotNull; import java.util.*; import static com.intellij.patterns.PlatformPatterns.psiElement; +import static com.intellij.patterns.PsiJavaPatterns.psiClass; +import static com.intellij.patterns.PsiJavaPatterns.psiField; import static com.intellij.patterns.StandardPatterns.or; /** @@ -227,10 +229,8 @@ public class JavaMemberNameCompletionContributor extends CompletionContributor { final VariableKind variableKind = JavaCodeStyleManager.getInstance(var.getProject()).getVariableKind(var); final String prefix = matcher.getPrefix(); - if (PsiType.VOID.equals(var.getType()) || prefix.startsWith(JavaCompletionUtil.IS_PREFIX) || - prefix.startsWith(JavaCompletionUtil.GET_PREFIX) || - prefix.startsWith(JavaCompletionUtil.SET_PREFIX)) { - completeVariableNameForRefactoring(var.getProject(), set, matcher, var.getType(), variableKind, includeOverlapped); + if (PsiType.VOID.equals(var.getType()) || psiField().inClass(psiClass().isInterface()).accepts(var)) { + completeVariableNameForRefactoring(var.getProject(), set, matcher, var.getType(), variableKind, includeOverlapped, true); return; } @@ -266,11 +266,11 @@ public class JavaMemberNameCompletionContributor extends CompletionContributor { Set set, PrefixMatcher matcher, PsiType varType, - VariableKind varKind, final boolean includeOverlapped) { + VariableKind varKind, final boolean includeOverlapped, final boolean methodPrefix) { JavaCodeStyleManager codeStyleManager = JavaCodeStyleManager.getInstance(project); SuggestedNameInfo suggestedNameInfo = codeStyleManager.suggestVariableName(varKind, null, null, varType); final String[] strings = completeVariableNameForRefactoring(codeStyleManager, matcher, varType, varKind, suggestedNameInfo, - includeOverlapped); + includeOverlapped, methodPrefix); tunePreferencePolicy(LookupItemUtil.addLookupItems(set, strings, matcher), suggestedNameInfo); } @@ -278,7 +278,8 @@ public class JavaMemberNameCompletionContributor extends CompletionContributor { final PrefixMatcher matcher, final PsiType varType, final VariableKind varKind, - SuggestedNameInfo suggestedNameInfo, final boolean includeOverlapped) { + SuggestedNameInfo suggestedNameInfo, + final boolean includeOverlapped, final boolean methodPrefix) { Set result = new LinkedHashSet(); final String[] suggestedNames = suggestedNameInfo.names; for (final String suggestedName : suggestedNames) { @@ -291,9 +292,7 @@ public class JavaMemberNameCompletionContributor extends CompletionContributor { // use suggested names as suffixes final String requiredSuffix = codeStyleManager.getSuffixByVariableKind(varKind); final String prefix = matcher.getPrefix(); - final boolean isMethodPrefix = prefix.startsWith(JavaCompletionUtil.IS_PREFIX) || prefix.startsWith(JavaCompletionUtil.GET_PREFIX) || prefix.startsWith( - JavaCompletionUtil.SET_PREFIX); - if (varKind != VariableKind.STATIC_FINAL_FIELD || isMethodPrefix) { + if (varKind != VariableKind.STATIC_FINAL_FIELD || methodPrefix) { for (int i = 0; i < suggestedNames.length; i++) { suggestedNames[i] = codeStyleManager.variableNameToPropertyName(suggestedNames[i], varKind); } @@ -306,6 +305,11 @@ public class JavaMemberNameCompletionContributor extends CompletionContributor { return ArrayUtil.toStringArray(result); } + private static boolean isMethodPrefix(String prefix) { + return prefix.startsWith(JavaCompletionUtil.IS_PREFIX) || prefix.startsWith(JavaCompletionUtil.GET_PREFIX) || prefix.startsWith( + JavaCompletionUtil.SET_PREFIX); + } + private static void completeMethodName(Set set, PsiElement element, final PrefixMatcher matcher){ if(element instanceof PsiMethod) { final PsiMethod method = (PsiMethod)element; diff --git a/java/java-tests/testData/codeInsight/completion/variables/locals/InterfaceMethod.java b/java/java-tests/testData/codeInsight/completion/variables/locals/InterfaceMethod.java new file mode 100644 index 000000000000..403c0cdb9f15 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/variables/locals/InterfaceMethod.java @@ -0,0 +1,5 @@ +interface Foo { + GooBarDoo calc +} + +interface GooBarDoo {} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/VariablesCompletionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/completion/VariablesCompletionTest.java index 1476602b94f4..756b165039a0 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/VariablesCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/VariablesCompletionTest.java @@ -39,6 +39,11 @@ public class VariablesCompletionTest extends CompletionTestCase { doTest("TestSource1.java", "TestResult1.java"); } + public void testInterfaceMethod() throws Exception { + configureByFile(FILE_PREFIX + "locals/" + "InterfaceMethod.java"); + assertStringItems("calcGooBarDoo", "calcBarDoo", "calcDoo"); + } + public void testLocals2() throws Exception { configureByFile(FILE_PREFIX + "locals/" + "TestSource2.java"); compareLookup(FILE_PREFIX + "locals/test2-lst.txt"); @@ -117,7 +122,7 @@ public class VariablesCompletionTest extends CompletionTestCase { complete(); checkResultByFile(FILE_PREFIX + "locals/" + "TestFieldOutOfAnonymousResult.java"); } - + public void testUnresolvedMethodName() throws Exception { configureByFile(FILE_PREFIX + "locals/" + "UnresolvedMethodName.java"); complete();