diamonds: retrieve qualifier type

This commit is contained in:
anna
2011-12-19 18:23:27 +01:00
parent 53bd6b8877
commit 042e92601f
2 changed files with 9 additions and 18 deletions
@@ -174,24 +174,9 @@ public class PsiDiamondTypeImpl extends PsiDiamondType {
final String qualifier = qualifierElement != null ? qualifierElement.getText() : "";
final String qualifiedName = StringUtil.getQualifiedName(qualifier, text);
if (newExpressionQualifier != null) {
final String newExpressionQualifierText = newExpressionQualifier.getText();
if (newExpressionQualifier instanceof PsiReferenceExpression) {
final PsiVariable variable = resolveHelper.resolveReferencedVariable(newExpressionQualifierText, newExpression);
if (variable != null) {
final PsiClass aClass = PsiUtil.resolveClassInType(variable.getType());
if (aClass != null) {
return aClass.findInnerClassByName(qualifiedName, false);
}
}
} else if (newExpressionQualifier instanceof PsiCallExpression) {
final JavaResolveResult resolveResult = ((PsiCallExpression)newExpressionQualifier).resolveMethodGenerics();
final PsiElement method = resolveResult.getElement();
if (method instanceof PsiMethod) {
final PsiClass aClass = PsiUtil.resolveClassInType(resolveResult.getSubstitutor().substitute(((PsiMethod)method).getReturnType()));
if (aClass != null) {
return aClass.findInnerClassByName(qualifiedName, false);
}
}
final PsiClass aClass = PsiUtil.resolveClassInClassTypeOnly(newExpressionQualifier.getType());
if (aClass != null) {
return aClass.findInnerClassByName(qualifiedName, false);
}
}
return resolveHelper.resolveReferencedClass(qualifiedName, newExpression);
@@ -187,6 +187,10 @@ class Outer {
}
class Outer1 {}
class Outer2<K> {
class Inner2<T> {}
}
class Another {
public static void main(String[] args) {
Outer o = new Outer();
@@ -197,6 +201,8 @@ class Another {
Outer.Inner<String> i3 = m2().new <error descr="Cannot resolve symbol 'Inner'">Inner</error><>();
System.out.println(i);
<error descr="Incompatible types. Found: 'Outer2.Inner2<java.lang.String>', required: 'Outer2.Inner2<java.lang.String>'">Outer2<Integer>.Inner2<String> i5 = new Outer2<>().new Inner2<>();</error>
}
static Outer m() {return null;}