}
}
}
+ final Collection<PsiVariable> writtenVariables = ControlFlowUtil.getWrittenVariables(controlFlow, 0, controlFlow.getSize(), false);
final List<PsiReferenceExpression> readBeforeWrites = ControlFlowUtil.getReadBeforeWrite(controlFlow);
for (final PsiReferenceExpression readBeforeWrite : readBeforeWrites) {
final PsiElement resolved = readBeforeWrite.resolve();
if (resolved instanceof PsiField) {
final PsiField field = (PsiField)resolved;
- PsiElement parent = body.getParent();
- if (!(parent instanceof PsiMethod) ||
- !((PsiMethod)parent).isConstructor() ||
- field.getInitializer() == null ||
- field.hasModifierProperty(PsiModifier.STATIC)) {
- candidates.remove(field);
+ if (writtenVariables.contains(field)){
+ PsiElement parent = body.getParent();
+ if (!(parent instanceof PsiMethod) ||
+ !((PsiMethod)parent).isConstructor() ||
+ field.getInitializer() == null ||
+ field.hasModifierProperty(PsiModifier.STATIC) ||
+ !PsiTreeUtil.isAncestor(((PsiMethod)parent).getContainingClass(), field, true)) {
+ candidates.remove(field);
+ }
}
}
}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<problems>
+ <problem>
+ <file>Test.java</file>
+ <line>2</line>
+ <problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Field can be local</problem_class>
+ <description>Field can be converted to a local variable</description>
+ </problem>
+</problems>
\ No newline at end of file
public void testConstructor () throws Exception { doTest(); }
public void testStaticFinal() throws Exception { doTest(); }
public void testStaticAccess() throws Exception { doTest(); }
+ public void testInnerClassConstructor() throws Exception { doTest(); }
+ public void testLocalVar2InnerClass() throws Exception { doTest(); }
}