From 03394481671ac51ac4da3faa66a05faa2745c6b2 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 18 Jan 2017 11:17:18 +0300 Subject: [PATCH] diamonds with anonymous: ensure base type calculated over tree cause too much context should be created otherwise (IDEA-166600) --- .../psi/impl/source/PsiAnonymousClassImpl.java | 16 +++++++++++++++- .../DiamondsWithAnonymousDiamond.java | 11 +++++++++++ .../daemon/LightAdvHighlightingJdk9Test.java | 1 + 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting9/DiamondsWithAnonymousDiamond.java diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiAnonymousClassImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiAnonymousClassImpl.java index d63e372a501f..caadab9b081d 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiAnonymousClassImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiAnonymousClassImpl.java @@ -21,6 +21,7 @@ import com.intellij.psi.impl.java.stubs.JavaStubElementTypes; import com.intellij.psi.impl.java.stubs.PsiClassStub; import com.intellij.psi.impl.source.tree.ChildRole; import com.intellij.psi.scope.PsiScopeProcessor; +import com.intellij.psi.util.PsiUtil; import com.intellij.reference.SoftReference; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; @@ -74,7 +75,7 @@ public class PsiAnonymousClassImpl extends PsiClassImpl implements PsiAnonymousC PsiClassType type = SoftReference.dereference(myCachedBaseType); if (type != null) return type; - if (!isInQualifiedNew()) { + if (!isInQualifiedNew() && !isDiamond()) { final String refText = stub.getBaseClassReferenceText(); assert refText != null : stub; final PsiElementFactory factory = JavaPsiFacade.getInstance(getProject()).getElementFactory(); @@ -96,6 +97,19 @@ public class PsiAnonymousClassImpl extends PsiClassImpl implements PsiAnonymousC return getTypeByTree(); } } + + private boolean isDiamond() { + if (PsiUtil.isLanguageLevel9OrHigher(this)) { + final PsiReferenceParameterList parameterList = getBaseClassReference().getParameterList(); + if (parameterList != null) { + final PsiTypeElement[] parameterElements = parameterList.getTypeParameterElements(); + if (parameterElements.length == 1) { + return parameterElements[0].getType() instanceof PsiDiamondType; + } + } + } + return false; + } private PsiClassType getTypeByTree() { return JavaPsiFacade.getInstance(getProject()).getElementFactory().createType(getBaseClassReference()); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting9/DiamondsWithAnonymousDiamond.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting9/DiamondsWithAnonymousDiamond.java new file mode 100644 index 000000000000..91ad9e11ba0a --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting9/DiamondsWithAnonymousDiamond.java @@ -0,0 +1,11 @@ + +class Outer { + Comparable f() { + return new Comparable<>() { + @Override + public int compareTo(String o) { + return 0; + } + }; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk9Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk9Test.java index 5a000129aae9..873708a11487 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk9Test.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk9Test.java @@ -47,6 +47,7 @@ public class LightAdvHighlightingJdk9Test extends LightDaemonAnalyzerTestCase { public void testDiamondsWithAnonymousRejectNotAccessibleType() { doTest(false, false);} public void testDiamondsWithAnonymousRejectIntersectionType() { doTest(false, false);} public void testDiamondsWithAnonymousInsideCallToInfer() { doTest(false, false);} + public void testDiamondsWithAnonymousDiamond() { doTest(false, false);} public void testValueTypes() { setLanguageLevel(LanguageLevel.JDK_X); doTest(false, false); } }