forbid references on final fields from another ones (IDEA-100237)

This commit is contained in:
anna
2013-10-22 21:02:23 +02:00
parent 34f23fba00
commit 18ee2d80f1
2 changed files with 16 additions and 4 deletions

View File

@@ -276,10 +276,10 @@ public class HighlightControlFlowUtil {
&& HighlightUtil.findEnclosingFieldInitializer(expression) == null) {
return null;
}
// access to final fields from inner classes always allowed
if (inInnerClass(expression, ((PsiField)variable).getContainingClass(),containingFile)) return null;
if (topBlock == null) return null;
final PsiElement parent = topBlock.getParent();
// access to final fields from inner classes always allowed
if ((parent instanceof PsiMethod || parent instanceof PsiClassInitializer) && inInnerClass(expression, ((PsiField)variable).getContainingClass(),containingFile)) return null;
final PsiCodeBlock block;
final PsiClass aClass;
if (parent instanceof PsiMethod) {
@@ -317,7 +317,7 @@ public class HighlightControlFlowUtil {
if (aClass == null || isFieldInitializedInOtherFieldInitializer(aClass, field, field.hasModifierProperty(PsiModifier.STATIC))) {
return null;
}
final PsiField anotherField = PsiTreeUtil.getParentOfType(expression, PsiField.class);
final PsiField anotherField = PsiTreeUtil.getTopmostParentOfType(expression, PsiField.class);
if (anotherField != null && anotherField.getContainingClass() == aClass) {
startOffset = 0;
}

View File

@@ -227,4 +227,16 @@ class Y {
}
}
class IDEA100237 {
static class Foo {
final int bar;
Foo() {
bar = 1;
}
final Object baz = new Object() {
final int qux = <error descr="Variable 'bar' might not have been initialized">bar</error>.hashCode() + 1;
};
}
}