isEffectivelyFinal: disallow effectively final variables to be initialized twice (IDEA-165060)

This commit is contained in:
Anna.Kozlova
2016-12-06 17:54:19 +01:00
parent dff2942958
commit e55fbf3f1d
3 changed files with 38 additions and 7 deletions
@@ -723,16 +723,15 @@ public class HighlightControlFlowUtil {
return true;
}
final List<PsiReferenceExpression> readBeforeWriteLocals = ControlFlowUtil.getReadBeforeWriteLocals(controlFlow);
for (PsiReferenceExpression expression : readBeforeWriteLocals) {
if (expression.resolve() == variable) {
return PsiUtil.isAccessedForReading(expression);
}
}
final Collection<ControlFlowUtil.VariableInfo> initializedTwice = ControlFlowUtil.getInitializedTwice(controlFlow);
effectivelyFinal = !initializedTwice.contains(new ControlFlowUtil.VariableInfo(variable, null));
if (effectivelyFinal) {
final List<PsiReferenceExpression> readBeforeWriteLocals = ControlFlowUtil.getReadBeforeWriteLocals(controlFlow);
for (PsiReferenceExpression expression : readBeforeWriteLocals) {
if (expression.resolve() == variable) {
return PsiUtil.isAccessedForReading(expression);
}
}
effectivelyFinal = notAccessedForWriting(variable, new LocalSearchScope(scope));
}
}
@@ -175,4 +175,16 @@ class AssignmentToFinalInsideLambda {
}
};
}
}
class NonInitializedButWrittenTwice {
private void test(boolean b) {
int s;
if(b) {
s = 1;
J is = () -> <error descr="Variable used in lambda expression should be final or effectively final">s</error>;
System.out.println(is.m());
}
<error descr="Variable 's' might not have been initialized">s</error>++;
}
}
@@ -0,0 +1,20 @@
// "Replace with collect" "false"
import java.util.ArrayList;
import java.util.List;
class Main {
public List<Integer> test(boolean b, List<String> list) {
int s;
if(b) {
s = 1;
}
List<Integer> result = new ArrayList<>();
for(String str : li<caret>st) {
if(str != null) {
result.add(s++);
}
}
return result;
}
}