mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
collapse to diamond in more cases (following IDEA-CR-16753)
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
class Temp {
|
||||
{
|
||||
new Runnable() {
|
||||
List<String> result = new ArrayList<>();
|
||||
}.run();
|
||||
}
|
||||
|
||||
}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
|
||||
import java.util.List;
|
||||
|
||||
class Temp {
|
||||
{
|
||||
new Runnable() {
|
||||
List<String> result = new <caret>
|
||||
}.run();
|
||||
}
|
||||
|
||||
}
|
||||
+4
@@ -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> {}");
|
||||
|
||||
Reference in New Issue
Block a user