diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeCastFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeCastFix.java index 58e0719dabe6..889379f3ca25 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeCastFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeCastFix.java @@ -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 conjuncts = GuessManager.getInstance(qualifier.getProject()).getControlFlowExpressionTypeConjuncts(qualifier); for (PsiType conjunct : conjuncts) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeInsideLambda.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeInsideLambda.java new file mode 100644 index 000000000000..7dacc09a49cc --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeInsideLambda.java @@ -0,0 +1,19 @@ +// "Cast qualifier to 'java.lang.String'" "false" +class A { + interface I { + void m(T t); + } + + void method() { + CharSequence cs = ""; + int p = foo(s -> { + if (s instanceof String) { + s.substring(1); + } + }, cs); + } + + K foo(I i, K k) { + return null; + } +} \ No newline at end of file