java inline variable: keep anonymous class on diamond expansion (IDEA-225616)

GitOrigin-RevId: e1d0cf134358b4bec7339416e8b5b7776bbf85d4
This commit is contained in:
Anna Kozlova
2020-05-26 08:30:59 +02:00
committed by intellij-monorepo-bot
parent c066f2bb2f
commit 5e9ef5eb3c
4 changed files with 32 additions and 8 deletions

View File

@@ -398,14 +398,12 @@ public class InlineUtil {
if (!result.equals(inferenceResult)) {
final String inferredTypeText = StringUtil.join(inferenceResult.getTypes(),
psiType -> psiType.getCanonicalText(), ", ");
final PsiExpressionList argumentList = ((PsiNewExpression)initializer).getArgumentList();
if (argumentList != null) {
final PsiJavaCodeReferenceElement classReference = ((PsiNewExpression)initializer).getClassOrAnonymousClassReference();
LOG.assertTrue(classReference != null);
final PsiExpression expression = JavaPsiFacade.getElementFactory(initializer.getProject())
.createExpressionFromText("new " + classReference.getReferenceName() + "<" + inferredTypeText + ">" + argumentList.getText(), initializer);
return ref.replace(expression);
}
final PsiJavaCodeReferenceElement classReference = ((PsiNewExpression)initializer).getClassOrAnonymousClassReference();
final PsiNewExpression expandedDiamond = (PsiNewExpression)JavaPsiFacade.getElementFactory(initializer.getProject())
.createExpressionFromText("new " + Objects.requireNonNull(classReference).getReferenceName() + "<" + inferredTypeText + ">()", initializer);
PsiNewExpression newExpression = (PsiNewExpression)initializer.copy();
Objects.requireNonNull(newExpression.getClassOrAnonymousClassReference()).replace(Objects.requireNonNull(expandedDiamond.getClassReference()));
return ref.replace(newExpression);
}
}
}

View File

@@ -0,0 +1,13 @@
interface I<T> {
void m(T t);
}
class MyTest {
{
I<String> i = new I<>() {
public void m(String s) {}
};
<caret>i.m("");
}
}

View File

@@ -0,0 +1,12 @@
interface I<T> {
void m(T t);
}
class MyTest {
{
new I<String>() {
public void m(String s) {}
}.m("");
}
}

View File

@@ -220,6 +220,7 @@ public class InlineLocalTest extends LightJavaCodeInsightTestCase {
public void testCastAroundLambda() { doTest(true, LanguageLevel.JDK_1_8); }
public void testNoCastAroundLambda() { doTest(true, LanguageLevel.JDK_1_8); }
public void testNoCastWithVar() { doTest(true, LanguageLevel.JDK_10); }
public void testDiamondInAnonymousClass() { doTest(true, LanguageLevel.JDK_11); }
public void testUncheckedCast() {
doTest(true);