collapse to diamond in more cases (following IDEA-CR-16753)

This commit is contained in:
Anna.Kozlova
2016-12-13 15:47:37 +01:00
parent b02b6bef9d
commit 56a364de17
4 changed files with 48 additions and 24 deletions
@@ -30,6 +30,7 @@ import com.intellij.psi.statistics.JavaStatisticsManager;
import com.intellij.psi.statistics.StatisticsInfo;
import com.intellij.psi.statistics.StatisticsManager;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiTypesUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.util.*;
@@ -186,34 +187,30 @@ public class JavaInheritorsGetter extends CompletionProvider<CompletionParameter
}
private static boolean areInferredTypesApplicable(@NotNull PsiType[] types, PsiElement position) {
final PsiMethodCallExpression methodCallExpression = PsiTreeUtil.getParentOfType(position, PsiMethodCallExpression.class, false, PsiStatement.class);
if (methodCallExpression != null) {
if (PsiUtil.isLanguageLevel8OrHigher(methodCallExpression)) {
final PsiNewExpression newExpression = PsiTreeUtil.getParentOfType(position, PsiNewExpression.class, false);
if (newExpression != null) {
PsiElement parent = newExpression;
while (parent.getParent() instanceof PsiParenthesizedExpression) {
parent = parent.getParent();
}
final int idx = ArrayUtil.find(methodCallExpression.getArgumentList().getExpressions(), parent);
if (idx > -1) {
final JavaResolveResult resolveResult = methodCallExpression.resolveMethodGenerics();
final PsiMethod method = (PsiMethod)resolveResult.getElement();
if (method != null) {
final PsiParameter[] parameters = method.getParameterList().getParameters();
if (idx < parameters.length) {
final PsiType expectedType = resolveResult.getSubstitutor().substitute(parameters[idx].getType());
final PsiClass aClass = PsiUtil.resolveClassInType(expectedType);
if (aClass != null) {
final PsiClassType inferredArg = JavaPsiFacade.getElementFactory(method.getProject()).createType(aClass, types);
return TypeConversionUtil.isAssignable(expectedType, inferredArg);
}
}
final PsiNewExpression newExpression = PsiTreeUtil.getParentOfType(position, PsiNewExpression.class, false);
if (!PsiUtil.isLanguageLevel8OrHigher(position)) {
return PsiTypesUtil.getExpectedTypeByParent(newExpression) != null;
}
final PsiCallExpression methodCallExpression = PsiTreeUtil.getParentOfType(newExpression, PsiCallExpression.class, false, PsiStatement.class);
if (methodCallExpression != null && PsiUtil.isLanguageLevel8OrHigher(methodCallExpression)) {
PsiElement parent = PsiUtil.skipParenthesizedExprUp(newExpression.getParent());
PsiExpressionList argumentList = methodCallExpression.getArgumentList();
final int idx = argumentList != null ? ArrayUtil.find(argumentList.getExpressions(), parent) : -1;
if (idx > -1) {
final JavaResolveResult resolveResult = methodCallExpression.resolveMethodGenerics();
final PsiMethod method = (PsiMethod)resolveResult.getElement();
if (method != null) {
final PsiParameter[] parameters = method.getParameterList().getParameters();
if (idx < parameters.length) {
final PsiType expectedType = resolveResult.getSubstitutor().substitute(parameters[idx].getType());
final PsiClass aClass = PsiUtil.resolveClassInType(expectedType);
if (aClass != null) {
final PsiClassType inferredArg = JavaPsiFacade.getElementFactory(method.getProject()).createType(aClass, types);
return TypeConversionUtil.isAssignable(expectedType, inferredArg);
}
}
}
}
return false;
}
return true;
}
@@ -0,0 +1,12 @@
import java.util.ArrayList;
import java.util.List;
class Temp {
{
new Runnable() {
List<String> result = new ArrayList<>();
}.run();
}
}
@@ -0,0 +1,11 @@
import java.util.List;
class Temp {
{
new Runnable() {
List<String> result = new <caret>
}.run();
}
}
@@ -95,6 +95,10 @@ public class SmartType18CompletionTest extends LightFixtureCompletionTestCase {
doTest();
}
public void testDiamondCollapsedInFieldInitializerInsideAnonymous() throws Exception {
doTest();
}
public void testInheritorConstructorRef() {
myFixture.addClass("package intf; public interface Intf<T> {}");
myFixture.addClass("package foo; public class ImplBar implements intf.Intf<String> {}");