From a5af84762daf70523c11d48c5f28b1313ebbe0d7 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 11 Aug 2016 13:44:12 +0200 Subject: [PATCH] can be diamond: ensure inner class is referenced as simple name, otherwise qualified text with generics outer class would lead to kinda raw type (IDEA-159179) --- .../com/intellij/psi/impl/PsiDiamondTypeUtil.java | 9 +++++++-- ...ithInnerClassArgumentInsideGenericOuterClass.java | 12 ++++++++++++ ...ithInnerClassArgumentInsideGenericOuterClass.java | 12 ++++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/explicit2diamond/afterDiamondWithInnerClassArgumentInsideGenericOuterClass.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/explicit2diamond/beforeDiamondWithInnerClassArgumentInsideGenericOuterClass.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 30a61e2267de..dd59bda73e85 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 @@ -17,10 +17,12 @@ package com.intellij.psi.impl; import com.intellij.codeInsight.FileModificationService; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; +import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiTypesUtil; import com.intellij.psi.util.PsiUtil; @@ -163,8 +165,11 @@ public class PsiDiamondTypeUtil { final PsiType typeByParent = PsiTypesUtil.getExpectedTypeByParent(expression); if (typeByParent != null) { final String arrayInitializer = "new " + typeByParent.getCanonicalText() + "[]{0}"; - final PsiNewExpression newExpr = - (PsiNewExpression)JavaPsiFacade.getInstance(expression.getProject()).getElementFactory().createExpressionFromText(arrayInitializer, expression); + final Project project = expression.getProject(); + final PsiElementFactory elementFactory = JavaPsiFacade.getInstance(project).getElementFactory(); + PsiNewExpression newExpr = (PsiNewExpression)elementFactory.createExpressionFromText(arrayInitializer, expression); + //ensure refs to inner classes are collapsed to avoid raw types (container type would be raw in qualified text) + newExpr = (PsiNewExpression)JavaCodeStyleManager.getInstance(project).shortenClassReferences(newExpr); final PsiArrayInitializerExpression initializer = newExpr.getArrayInitializer(); LOG.assertTrue(initializer != null); copy = initializer.getInitializers()[0].replace(expression); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/explicit2diamond/afterDiamondWithInnerClassArgumentInsideGenericOuterClass.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/explicit2diamond/afterDiamondWithInnerClassArgumentInsideGenericOuterClass.java new file mode 100644 index 000000000000..b1c5282f40c3 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/explicit2diamond/afterDiamondWithInnerClassArgumentInsideGenericOuterClass.java @@ -0,0 +1,12 @@ +// "Replace with <>" "true" +import java.util.ArrayList; +import java.util.List; + +class Util { + + private class WithPosition {} + + public void addNewlyAddedChildrenOf() { + List addings = new ArrayList<>(); + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/explicit2diamond/beforeDiamondWithInnerClassArgumentInsideGenericOuterClass.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/explicit2diamond/beforeDiamondWithInnerClassArgumentInsideGenericOuterClass.java new file mode 100644 index 000000000000..b9884c44f57b --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/explicit2diamond/beforeDiamondWithInnerClassArgumentInsideGenericOuterClass.java @@ -0,0 +1,12 @@ +// "Replace with <>" "true" +import java.util.ArrayList; +import java.util.List; + +class Util { + + private class WithPosition {} + + public void addNewlyAddedChildrenOf() { + List addings = new ArrayListPosition>(); + } +}