use of org.sonar.java.collections.PMap in project sonar-java by SonarSource.
the class ProgramState method cleanupConstraints.
public ProgramState cleanupConstraints(Collection<SymbolicValue> protectedSymbolicValues) {
class CleanAction implements BiConsumer<SymbolicValue, ConstraintsByDomain> {
boolean newProgramState = false;
PMap<SymbolicValue, ConstraintsByDomain> newConstraints = constraints;
PMap<SymbolicValue, Integer> newReferences = references;
@Override
public void accept(SymbolicValue symbolicValue, ConstraintsByDomain constraintPMap) {
constraintPMap.forEach((domain, constraint) -> {
if (!protectedSymbolicValues.contains(symbolicValue) && !isReachable(symbolicValue, newReferences) && isDisposable(symbolicValue, constraint) && !inStack(stack, symbolicValue)) {
newProgramState = true;
ConstraintsByDomain removed = newConstraints.get(symbolicValue).remove(domain);
if (removed.isEmpty()) {
newConstraints = newConstraints.remove(symbolicValue);
} else {
newConstraints = newConstraints.put(symbolicValue, removed);
}
newReferences = newReferences.remove(symbolicValue);
}
});
}
}
CleanAction cleanAction = new CleanAction();
constraints.forEach(cleanAction);
return cleanAction.newProgramState ? new ProgramState(values, cleanAction.newReferences, cleanAction.newConstraints, visitedPoints, stack, exitSymbolicValue) : this;
}
Aggregations