MoveFieldAssignmentToInitializer: disable for self-references

Fixes IDEA-174956 "Move assignment to field declaration" produces red code
This commit is contained in:
Tagir Valeev
2017-06-28 10:34:33 +03:00
parent 9643e2d238
commit cdce28fae8
2 changed files with 17 additions and 3 deletions

View File

@@ -115,13 +115,16 @@ public class MoveFieldAssignmentToInitializerInspection extends BaseJavaBatchLoc
super.visitReferenceExpression(expression);
PsiElement resolved = expression.resolve();
if (resolved == null) return;
if (resolved == field) {
result.set(Boolean.FALSE);
return;
}
if (PsiTreeUtil.isAncestor(ctrOrInitializer, resolved, false) && !PsiTreeUtil.isAncestor(initializer, resolved, false)) {
// resolved somewhere inside constructor but outside initializer
result.set(Boolean.FALSE);
return;
}
if (resolved instanceof PsiMember &&
resolved != field &&
((PsiMember)resolved).getContainingClass() == field.getContainingClass()) {
if (resolved instanceof PsiMember && ((PsiMember)resolved).getContainingClass() == field.getContainingClass()) {
if (field.hasModifierProperty(PsiModifier.STATIC) ||
!((PsiMember)resolved).hasModifierProperty(PsiModifier.STATIC)) {
// refers to another field/method of the same class (except referring from non-static member to static)

View File

@@ -0,0 +1,11 @@
// "Move assignment to field declaration" "false"
class Foo {
int[] s;
void foo() {
if (s != null) {
s = s.cl<caret>one();
}
}
}