IDEA-105064 Is it possible to have even smarter code completion in case of Logger.getLogger(Class)?

This commit is contained in:
peter
2013-10-17 21:54:35 +02:00
parent ce10d38c4d
commit ec2d2d3d74
4 changed files with 30 additions and 1 deletions
@@ -1122,6 +1122,8 @@ public class ExpectedTypesProvider {
});
if (type != null) return type;
}
final PsiElementFactory factory = JavaPsiFacade.getElementFactory(containingClass.getProject());
if ("equals".equals(name)) {
final PsiType type = checkMethod(method, CommonClassNames.JAVA_LANG_OBJECT, new NullableFunction<PsiClass, PsiType>() {
@Override
@@ -1135,7 +1137,7 @@ public class ExpectedTypesProvider {
}
final PsiClass aClass = PsiTreeUtil.getContextOfType(parent, PsiClass.class, true);
if (aClass != null) {
return JavaPsiFacade.getInstance(aClass.getProject()).getElementFactory().createType(aClass);
return factory.createType(aClass);
}
}
return null;
@@ -1156,6 +1158,16 @@ 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));
}
}
}
return parameterType;
}
@@ -39,6 +39,12 @@ public class ClassLiteralGetter {
}
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) {}
}
@@ -311,6 +311,10 @@ public class SmartTypeCompletionOrderingTest extends CompletionSortingTestCase {
checkPreferredItems 0, 'e', 'createEvent'
}
public void testGetLogger() {
checkPreferredItems 0, 'Foo.class', 'forName'
}
@Override
protected String getBasePath() {
return JavaTestUtil.getRelativeJavaTestDataPath() + BASE_PATH;