From 09c0ca15d8a7c8246a4ad2b9e7c76c06b4eb709e Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 19 Dec 2011 12:37:02 +0100 Subject: [PATCH] IDEA-78031 diamonds with new qualifiers --- .../com/intellij/psi/PsiDiamondTypeImpl.java | 25 ++++++++++++++++++- .../advHighlighting7/DiamondMisc.java | 23 +++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/PsiDiamondTypeImpl.java b/java/java-psi-impl/src/com/intellij/psi/PsiDiamondTypeImpl.java index fad4772ca4b1..53277ce348e8 100644 --- a/java/java-psi-impl/src/com/intellij/psi/PsiDiamondTypeImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/PsiDiamondTypeImpl.java @@ -169,9 +169,32 @@ public class PsiDiamondTypeImpl extends PsiDiamondType { final Project project = newExpression.getProject(); final JavaPsiFacade facade = JavaPsiFacade.getInstance(project); final PsiResolveHelper resolveHelper = facade.getResolveHelper(); + final PsiExpression newExpressionQualifier = newExpression.getQualifier(); final PsiElement qualifierElement = classReference.getQualifier(); final String qualifier = qualifierElement != null ? qualifierElement.getText() : ""; - return resolveHelper.resolveReferencedClass(StringUtil.getQualifiedName(qualifier, text), newExpression); + 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); + } + } + } + } + return resolveHelper.resolveReferencedClass(qualifiedName, newExpression); } else { return null; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/DiamondMisc.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/DiamondMisc.java index 4c808e765eb9..7755d35f0c84 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/DiamondMisc.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/DiamondMisc.java @@ -181,3 +181,26 @@ class PredefinedErrorsOverRaw { PredefinedErrorsOverRaw mc = new PredefinedErrorsOverRaw<>(""); } } + +class Outer { + class Inner {} +} +class Outer1 {} + +class Another { + public static void main(String[] args) { + Outer o = new Outer(); + Outer.Inner i = o.new Inner<>(); + Outer.Inner i1 = m().new Inner<>(); + Outer.Inner i2 = m1().new Inner<>(); + + Outer.Inner i3 = m2().new Inner<>(); + + System.out.println(i); + } + + static Outer m() {return null;} + static T m1() {return null;} + static T m2() {return null;} + +} \ No newline at end of file