mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
silly assignment: ignore non-trivial casts involving primitives (IDEA-146830)
This commit is contained in:
+22
-5
@@ -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;
|
||||
}
|
||||
|
||||
+3
@@ -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?
|
||||
|
||||
+4
-1
@@ -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); }
|
||||
|
||||
Reference in New Issue
Block a user