use superclass for inner class variable name suggestion (IDEA-122109)

This commit is contained in:
peter
2014-04-18 22:37:30 +02:00
parent c47713fe17
commit dc2f64aa97
2 changed files with 32 additions and 7 deletions
@@ -27,14 +27,11 @@ import com.intellij.psi.impl.CheckUtil;
import com.intellij.psi.impl.source.SourceTreeToPsiMap;
import com.intellij.psi.impl.source.jsp.jspJava.JspxImportStatement;
import com.intellij.psi.statistics.JavaStatisticsManager;
import com.intellij.psi.util.PsiElementFilter;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.psi.util.*;
import com.intellij.util.ArrayUtil;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.Processor;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.psi.util.FileTypeUtils;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -309,7 +306,7 @@ public class JavaCodeStyleManagerImpl extends JavaCodeStyleManager {
return suggestVariableNameByType(type, variableKind, correctKeywords, false);
}
private String[] suggestVariableNameByType(PsiType type, final VariableKind variableKind, boolean correctKeywords, boolean skipIndices) {
private String[] suggestVariableNameByType(final PsiType type, final VariableKind variableKind, final boolean correctKeywords, boolean skipIndices) {
String longTypeName = skipIndices ? type.getCanonicalText():getLongTypeName(type);
CodeStyleSettings.TypeToNameMap map = getMapByVariableKind(variableKind);
if (map != null && longTypeName != null) {
@@ -322,7 +319,7 @@ public class JavaCodeStyleManagerImpl extends JavaCodeStyleManager {
}
}
Collection<String> suggestions = new LinkedHashSet<String>();
final Collection<String> suggestions = new LinkedHashSet<String>();
if (!skipIndices) {
suggestNamesForCollectionInheritors(type, variableKind, suggestions, correctKeywords);
@@ -336,6 +333,21 @@ public class JavaCodeStyleManagerImpl extends JavaCodeStyleManager {
ContainerUtil.addAll(suggestions, getSuggestionsByName(typeName, variableKind, type instanceof PsiArrayType, correctKeywords));
}
if (!skipIndices && type instanceof PsiClassType) {
final PsiClass psiClass = ((PsiClassType)type).resolve();
if (psiClass != null && psiClass.getContainingClass() != null) {
InheritanceUtil.processSupers(psiClass, false, new Processor<PsiClass>() {
@Override
public boolean process(PsiClass superClass) {
if (PsiTreeUtil.isAncestor(superClass, psiClass, true)) {
ContainerUtil.addAll(suggestions, getSuggestionsByName(superClass.getName(), variableKind, false, correctKeywords));
}
return false;
}
});
}
}
return ArrayUtil.toStringArray(suggestions);
}
@@ -227,4 +227,17 @@ class FooFoo {
myFixture.assertPreferredCompletionItems 0, 'l', 'nanoTime', 'time'
}
public void "test use superclass for inner class variable name suggestion"() {
myFixture.configureByText 'a.java', '''
class FooFoo {
{ Rectangle2D.Double <caret>x }
}
class Rectangle2D {
static class Double extends Rectangle2D {}
}
'''
myFixture.completeBasic()
myFixture.assertPreferredCompletionItems 0, 'aDouble', 'rectangle2D'
}
}