From 8a3dedbe78832b15c9cae5188e3bb37f4c7f994d Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Tue, 17 Mar 2026 21:50:22 +0100 Subject: [PATCH] IDEA-296461 [java]: allow replacing explicit type with var on anonymous class instantiation GitOrigin-RevId: eeafb5c598bc5b984e0599ffdd362337cf6b8c5a --- .../intellij/psi/impl/PsiDiamondTypeUtil.java | 16 +++++++++++++--- .../explicit2var/afterAnonymousGeneric.java | 12 ++++++++++++ .../explicit2var/beforeAnonymousGeneric.java | 12 ++++++++++++ 3 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/explicit2var/afterAnonymousGeneric.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/explicit2var/beforeAnonymousGeneric.java diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/PsiDiamondTypeUtil.java b/java/java-psi-impl/src/com/intellij/psi/impl/PsiDiamondTypeUtil.java index 3e29bfcdbc26..25c20e105e40 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/PsiDiamondTypeUtil.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/PsiDiamondTypeUtil.java @@ -1,4 +1,4 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.psi.impl; import com.intellij.lang.injection.InjectedLanguageManager; @@ -148,13 +148,23 @@ public final class PsiDiamondTypeUtil { public static PsiExpression expandTopLevelDiamondsInside(PsiExpression expr) { if (expr instanceof PsiNewExpression) { - final PsiJavaCodeReferenceElement classReference = ((PsiNewExpression)expr).getClassReference(); + PsiJavaCodeReferenceElement classReference = ((PsiNewExpression)expr).getClassReference(); + if (classReference == null) { + classReference = ((PsiNewExpression)expr).getClassOrAnonymousClassReference(); + } if (classReference != null) { final PsiReferenceParameterList parameterList = classReference.getParameterList(); if (parameterList != null) { final PsiTypeElement[] typeParameterElements = parameterList.getTypeParameterElements(); if (typeParameterElements.length == 1 && typeParameterElements[0].getType() instanceof PsiDiamondType) { - return (PsiExpression)replaceDiamondWithExplicitTypes(parameterList).getParent(); + PsiElement parent = replaceDiamondWithExplicitTypes(parameterList).getParent(); + if (parent instanceof PsiExpression) { + return (PsiExpression)parent; + } + PsiElement grandParent = parent.getParent(); + if (grandParent instanceof PsiExpression) { + return (PsiExpression)grandParent; + } } } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/explicit2var/afterAnonymousGeneric.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/explicit2var/afterAnonymousGeneric.java new file mode 100644 index 000000000000..6f4590923a96 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/explicit2var/afterAnonymousGeneric.java @@ -0,0 +1,12 @@ +// "Replace explicit type with 'var'" "true" +import java.util.*; + +class X { + + void x() { + var list = new ArrayList() {{ + add("one"); + add("two"); + }}; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/explicit2var/beforeAnonymousGeneric.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/explicit2var/beforeAnonymousGeneric.java new file mode 100644 index 000000000000..2c75e1fe82c9 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/explicit2var/beforeAnonymousGeneric.java @@ -0,0 +1,12 @@ +// "Replace explicit type with 'var'" "true" +import java.util.*; + +class X { + + void x() { + ArrayList list = new ArrayList<>() {{ + add("one"); + add("two"); + }}; + } +} \ No newline at end of file