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); }