java: disable heavy weight add type cast for lambda bodies with failed inference on top

for long chained calls with many type errors, DFA checks may be too slow

GitOrigin-RevId: 851604a1252743c92d8c33973845cdda7bbb996a
This commit is contained in:
Anna Kozlova
2019-08-12 19:04:15 +03:00
committed by intellij-monorepo-bot
parent b2e0f2a958
commit c1b79848e1
2 changed files with 34 additions and 0 deletions
@@ -28,6 +28,8 @@ import com.intellij.openapi.util.TextRange;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.psi.infos.MethodCandidateInfo;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiTypesUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.TypeConversionUtil;
@@ -138,6 +140,19 @@ public class AddTypeCastFix extends LocalQuickFixAndIntentionActionOnPsiElement
TextRange fixRange) {
String referenceName = ref.getReferenceName();
if (referenceName == null) return;
if (qualifier instanceof PsiReferenceExpression) {
PsiElement resolve = ((PsiReferenceExpression)qualifier).resolve();
if (resolve == null) return;
if (resolve instanceof PsiParameter && ((PsiParameter)resolve).getTypeElement() == null) {
PsiMethodCallExpression callExpression = PsiTreeUtil.getParentOfType(resolve, PsiMethodCallExpression.class);
if (callExpression != null) {
JavaResolveResult result = callExpression.resolveMethodGenerics();
if (result instanceof MethodCandidateInfo && ((MethodCandidateInfo)result).getInferenceErrorMessage() != null) {
return;
}
}
}
}
PsiElement gParent = ref.getParent();
List<PsiType> conjuncts = GuessManager.getInstance(qualifier.getProject()).getControlFlowExpressionTypeConjuncts(qualifier);
for (PsiType conjunct : conjuncts) {
@@ -0,0 +1,19 @@
// "Cast qualifier to 'java.lang.String'" "false"
class A {
interface I<T> {
void m(T t);
}
void method() {
CharSequence cs = "";
int p = foo(s -> {
if (s instanceof String) {
s.subs<caret>tring(1);
}
}, cs);
}
<K> K foo(I<K> i, K k) {
return null;
}
}