diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/sillyAssignment/SillyAssignmentInspectionBase.java b/java/java-analysis-impl/src/com/intellij/codeInspection/sillyAssignment/SillyAssignmentInspectionBase.java index c6aeb59b5b24..5ab01c3ce6f6 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/sillyAssignment/SillyAssignmentInspectionBase.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/sillyAssignment/SillyAssignmentInspectionBase.java @@ -96,28 +96,45 @@ public class SillyAssignmentInspectionBase extends BaseJavaBatchLocalInspectionT PsiExpression lExpression = assignment.getLExpression(); PsiExpression rExpression = assignment.getRExpression(); if (rExpression == null) return; + lExpression = PsiUtil.deparenthesizeExpression(lExpression); - rExpression = PsiUtil.deparenthesizeExpression(rExpression); if (!(lExpression instanceof PsiReferenceExpression)) return; + PsiReferenceExpression lRef = (PsiReferenceExpression)lExpression; + final PsiVariable variable = (PsiVariable)lRef.resolve(); + if (variable == null) return; + + rExpression = deparenthesizeRExpr(rExpression, variable); + PsiReferenceExpression rRef; if (!(rExpression instanceof PsiReferenceExpression)) { if (!(rExpression instanceof PsiAssignmentExpression)) return; final PsiAssignmentExpression rAssignmentExpression = (PsiAssignmentExpression)rExpression; - final PsiExpression assignee = PsiUtil.deparenthesizeExpression(rAssignmentExpression.getLExpression()); + final PsiExpression assignee = deparenthesizeRExpr(rAssignmentExpression.getLExpression(), variable); if (!(assignee instanceof PsiReferenceExpression)) return; rRef = (PsiReferenceExpression)assignee; } else { rRef = (PsiReferenceExpression)rExpression; } - PsiReferenceExpression lRef = (PsiReferenceExpression)lExpression; PsiManager manager = assignment.getManager(); if (!sameInstanceReferences(lRef, rRef, manager)) return; - final PsiVariable variable = (PsiVariable)lRef.resolve(); - if (variable == null) return; holder.registerProblem(assignment, InspectionsBundle.message("assignment.to.itself.problem.descriptor", variable.getName()), ProblemHighlightType.LIKE_UNUSED_SYMBOL, createRemoveAssignmentFix()); } + private static PsiExpression deparenthesizeRExpr(PsiExpression rExpression, PsiVariable variable) { + rExpression = PsiUtil.skipParenthesizedExprDown(rExpression); + if (rExpression instanceof PsiTypeCastExpression) { + final PsiTypeElement castTypeElement = ((PsiTypeCastExpression)rExpression).getCastType(); + if (castTypeElement != null && + castTypeElement.getType() instanceof PsiPrimitiveType && + variable.getType().equalsToText(CommonClassNames.JAVA_LANG_OBJECT)) { + return rExpression; + } + return PsiUtil.deparenthesizeExpression(rExpression); + } + return rExpression; + } + protected LocalQuickFix createRemoveAssignmentFix() { return null; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/SillyAssignment.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/SillyAssignment.java index 60bdb4f8dcac..feb81d8e0499 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/SillyAssignment.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/SillyAssignment.java @@ -21,6 +21,9 @@ class a { i = i; i = (int)i; o = ((Object)(o)); + Object o1 = o = ((Object)(o)); + System.out.println(o1); + o = (double)o; } void f4() { fpanel.getSize().height = this.fpanel.getSize().height; // not silly. Are you sure you can bet getSize() has no side effects? diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingTest.java index 6c788303243e..c826a7394f32 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingTest.java @@ -148,7 +148,10 @@ public class LightAdvHighlightingTest extends LightDaemonAnalyzerTestCase { public void testUnclosedBlockComment() { doTest(false, false); } public void testUnclosedComment() { doTest(false, false); } public void testUnclosedDecl() { doTest(false, false); } - public void testSillyAssignment() { doTest(true, false); } + public void testSillyAssignment() { + LanguageLevelProjectExtension.getInstance(getJavaFacade().getProject()).setLanguageLevel(LanguageLevel.JDK_1_7); + doTest(true, false); + } public void testTernary() { doTest(false, false); } public void testDuplicateClass() { doTest(false, false); } public void testCatchType() { doTest(false, false); }