in nullaway/src/main/java/com/uber/nullaway/dataflow/AccessPathNullnessAnalysis.java [220:248]
public NullnessStore getNullnessInfoBeforeNewContext(
TreePath path, VisitorState state, Handler handler) {
NullnessStore store = dataFlow.resultBefore(path, state.context, nullnessPropagation);
if (store == null) {
return NullnessStore.empty();
}
return store.filterAccessPaths(
(ap) -> {
boolean allAPNonRootElementsAreFinalFields = true;
for (AccessPathElement ape : ap.getElements()) {
Element e = ape.getJavaElement();
if (!e.getKind().equals(ElementKind.FIELD)
|| !e.getModifiers().contains(Modifier.FINAL)) {
allAPNonRootElementsAreFinalFields = false;
break;
}
}
if (allAPNonRootElementsAreFinalFields) {
Element e = ap.getRoot();
return e == null // This is the case for: this(.f)* where each f is a final field.
|| e.getKind().equals(ElementKind.PARAMETER)
|| e.getKind().equals(ElementKind.LOCAL_VARIABLE)
|| (e.getKind().equals(ElementKind.FIELD)
&& e.getModifiers().contains(Modifier.FINAL));
}
return handler.includeApInfoInSavedContext(ap, state);
});
}