From dc2f64aa9759b37879edf7c216cded1ab2932370 Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 18 Apr 2014 10:48:06 +0200 Subject: [PATCH] use superclass for inner class variable name suggestion (IDEA-122109) --- .../codeStyle/JavaCodeStyleManagerImpl.java | 26 ++++++++++++++----- .../completion/VariablesCompletionTest.groovy | 13 ++++++++++ 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaCodeStyleManagerImpl.java b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaCodeStyleManagerImpl.java index b151628781d7..844ef00880ae 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaCodeStyleManagerImpl.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaCodeStyleManagerImpl.java @@ -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 suggestions = new LinkedHashSet(); + final Collection suggestions = new LinkedHashSet(); 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() { + @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); } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/VariablesCompletionTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/VariablesCompletionTest.groovy index bd974555605c..3675a9922506 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/VariablesCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/VariablesCompletionTest.groovy @@ -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 x } +} +class Rectangle2D { + static class Double extends Rectangle2D {} +} +''' + myFixture.completeBasic() + myFixture.assertPreferredCompletionItems 0, 'aDouble', 'rectangle2D' + } + }