diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java index 2193f3c8b577..ffc134295967 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java @@ -385,7 +385,8 @@ public class HighlightUtil extends HighlightUtilBase { } if (expression == null) return false; PsiType rType = expression.getType(); - return rType != null && toType != null && TypeConversionUtil.areTypesConvertible(rType, toType); + PsiType castType = GenericsUtil.getVariableTypeByExpressionType(toType); + return rType != null && toType != null && TypeConversionUtil.areTypesConvertible(rType, toType) && toType.isAssignableFrom(castType); } diff --git a/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java b/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java index 03d9ea53fd1d..89a665efc29a 100644 --- a/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java @@ -303,6 +303,10 @@ public class GenericsUtil { @Contract("null, _ -> null") public static PsiType getVariableTypeByExpressionType(@Nullable PsiType type, final boolean openCaptured) { if (type == null) return null; + PsiClass refClass = PsiUtil.resolveClassInType(type); + if (refClass instanceof PsiAnonymousClass) { + type = ((PsiAnonymousClass)refClass).getBaseClassType(); + } if (type instanceof PsiCapturedWildcardType) { type = ((PsiCapturedWildcardType)type).getUpperBound(); } diff --git a/java/java-psi-impl/src/com/intellij/refactoring/util/RefactoringChangeUtil.java b/java/java-psi-impl/src/com/intellij/refactoring/util/RefactoringChangeUtil.java index 53f2e41fa738..119669aa06b5 100644 --- a/java/java-psi-impl/src/com/intellij/refactoring/util/RefactoringChangeUtil.java +++ b/java/java-psi-impl/src/com/intellij/refactoring/util/RefactoringChangeUtil.java @@ -46,10 +46,6 @@ public class RefactoringChangeUtil { } return null; } - PsiClass refClass = PsiUtil.resolveClassInType(type); - if (refClass instanceof PsiAnonymousClass) { - type = ((PsiAnonymousClass)refClass).getBaseClassType(); - } return GenericsUtil.getVariableTypeByExpressionType(type); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeNonDenotableLType.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeNonDenotableLType.java new file mode 100644 index 000000000000..c3d46d93f94a --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeNonDenotableLType.java @@ -0,0 +1,11 @@ +// "Cast to 'java.lang.Object'" "false" +class Scope { + T val; + void f() { + var y = new Object(); + var x = new Object() { + int a = 12; + }; + x = val; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeNonDenotableVarType.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeNonDenotableVarType.java new file mode 100644 index 000000000000..ec47d45113c5 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeNonDenotableVarType.java @@ -0,0 +1,10 @@ +// "Cast to 'java.lang.Object'" "false" +class A { + void f() { + var y = new Object(); + var x = new Object() { + int a = 12; + }; + x = y; + } +} \ No newline at end of file