silly assignment: ignore non-trivial casts involving primitives (IDEA-146830)

This commit is contained in:
Anna Kozlova
2015-10-27 19:35:20 +01:00
parent 40db0beb8d
commit e27c654b20
3 changed files with 29 additions and 6 deletions
@@ -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;
}
@@ -21,6 +21,9 @@ class a {
<warning descr="Variable 'i' is assigned to itself">i = i</warning>;
<warning descr="Variable 'i' is assigned to itself">i = (int)i</warning>;
<warning descr="Variable 'o' is assigned to itself">o = ((Object)(o))</warning>;
Object o1 = <warning descr="Variable 'o' is assigned to itself">o = ((Object)(o))</warning>;
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?
@@ -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); }