From 06ee80f1443c3695a4952df4f2b967c811c5b35d Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 18 Oct 2013 22:43:12 +0200 Subject: [PATCH] support Class in loggers (IDEA-105064) --- .../codeInsight/ExpectedTypesProvider.java | 19 +++++++++---------- .../filters/getters/ClassLiteralGetter.java | 13 +++++-------- .../smartTypeSorting/GetWildcardLogger.java | 7 +++++++ .../SmartTypeCompletionOrderingTest.groovy | 3 +++ 4 files changed, 24 insertions(+), 18 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/smartTypeSorting/GetWildcardLogger.java diff --git a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java index ff5a744c55a0..bc6273eb1074 100644 --- a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java @@ -31,10 +31,7 @@ import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.PsiShortNamesCache; import com.intellij.psi.search.searches.DeepestSuperMethodsSearch; import com.intellij.psi.tree.IElementType; -import com.intellij.psi.util.PropertyUtil; -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.NullableFunction; import com.intellij.util.Processor; @@ -1159,12 +1156,14 @@ public class ExpectedTypesProvider { } } if ("Logger".equals(containingClass.getName()) || "Log".equals(containingClass.getName())) { - if (parameterType instanceof PsiClassType && - parameterType.equalsToText(CommonClassNames.JAVA_LANG_CLASS)) { - PsiClass placeClass = PsiTreeUtil.getContextOfType(argument, PsiClass.class); - PsiClass classClass = ((PsiClassType)parameterType).resolve(); - if (placeClass != null && classClass != null) { - return factory.createType(classClass, factory.createType(placeClass)); + if (parameterType instanceof PsiClassType) { + PsiType typeArg = PsiUtil.substituteTypeParameter(parameterType, CommonClassNames.JAVA_LANG_CLASS, 0, true); + if (typeArg != null && TypeConversionUtil.erasure(typeArg).equalsToText(CommonClassNames.JAVA_LANG_OBJECT)) { + PsiClass placeClass = PsiTreeUtil.getContextOfType(argument, PsiClass.class); + PsiClass classClass = ((PsiClassType)parameterType).resolve(); + if (placeClass != null && classClass != null) { + return factory.createType(classClass, factory.createType(placeClass)); + } } } } diff --git a/java/java-impl/src/com/intellij/psi/filters/getters/ClassLiteralGetter.java b/java/java-impl/src/com/intellij/psi/filters/getters/ClassLiteralGetter.java index cf2b7d1296fc..b1b4f674cda7 100644 --- a/java/java-impl/src/com/intellij/psi/filters/getters/ClassLiteralGetter.java +++ b/java/java-impl/src/com/intellij/psi/filters/getters/ClassLiteralGetter.java @@ -33,18 +33,15 @@ public class ClassLiteralGetter { public static void addCompletions(@NotNull final JavaSmartCompletionParameters parameters, @NotNull Consumer result, final PrefixMatcher matcher) { - PsiType expectedType = parameters.getExpectedType(); + PsiType expectedType = parameters.getDefaultType(); if (!InheritanceUtil.isInheritor(expectedType, CommonClassNames.JAVA_LANG_CLASS)) { - return; + expectedType = parameters.getExpectedType(); + if (!InheritanceUtil.isInheritor(expectedType, CommonClassNames.JAVA_LANG_CLASS)) { + return; + } } PsiType classParameter = PsiUtil.substituteTypeParameter(expectedType, CommonClassNames.JAVA_LANG_CLASS, 0, false); - if (classParameter == null) { - PsiType defaultType = parameters.getDefaultType(); - if (InheritanceUtil.isInheritor(defaultType, CommonClassNames.JAVA_LANG_CLASS)) { - classParameter = PsiUtil.substituteTypeParameter(defaultType, CommonClassNames.JAVA_LANG_CLASS, 0, false); - } - } boolean addInheritors = false; PsiElement position = parameters.getPosition(); diff --git a/java/java-tests/testData/codeInsight/completion/smartTypeSorting/GetWildcardLogger.java b/java/java-tests/testData/codeInsight/completion/smartTypeSorting/GetWildcardLogger.java new file mode 100644 index 000000000000..775bc137c7ad --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartTypeSorting/GetWildcardLogger.java @@ -0,0 +1,7 @@ +public class Foo { + public static final Logger LOG = Logger.getInstance() +} + +class Logger { + static Logger getInstance(Class c) {} +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionOrderingTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionOrderingTest.groovy index b0604679254d..11784200fef5 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionOrderingTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionOrderingTest.groovy @@ -314,6 +314,9 @@ public class SmartTypeCompletionOrderingTest extends CompletionSortingTestCase { public void testGetLogger() { checkPreferredItems 0, 'Foo.class', 'forName' } + public void testGetWildcardLogger() { + checkPreferredItems 0, 'Foo.class', 'forName' + } @Override protected String getBasePath() {