support Class<?> in loggers (IDEA-105064)

This commit is contained in:
peter
2013-10-18 22:43:12 +02:00
parent c9c171a271
commit 06ee80f144
4 changed files with 24 additions and 18 deletions
@@ -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));
}
}
}
}
@@ -33,18 +33,15 @@ public class ClassLiteralGetter {
public static void addCompletions(@NotNull final JavaSmartCompletionParameters parameters,
@NotNull Consumer<LookupElement> 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();
@@ -0,0 +1,7 @@
public class Foo {
public static final Logger LOG = Logger.getInstance(<caret>)
}
class Logger {
static Logger getInstance(Class<?> c) {}
}
@@ -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() {