package fr.inria.diversify.codeFragmentProcessor;
import fr.inria.diversify.codeFragment.Statement;
import fr.inria.diversify.util.Log;
import spoon.reflect.code.CtStatement;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StatementProcessor extends AbstractCodeFragmentProcessor<CtStatement> {
protected ValidStatementVisitor valid;
protected List<File> sourceFilter = null;
public StatementProcessor(String externalSourceCodeDir) {
if (!externalSourceCodeDir.equals("")) {
sourceFilter = new ArrayList<>();
for ( String s : externalSourceCodeDir.split(System.getProperty("path.separator")) )
sourceFilter.add(new File(s));
}
}
public void process(CtStatement element) {
try {
if (isValidStatement(element)) {
Statement stmt = new Statement(element);
addCf(stmt);
}
} catch (Exception e) {
try {
Log.warn("error in StatementProcessor.process with the statement: " + element, e);
} catch (Exception ee) {
Log.warn("error in StatementProcessor.process with the statement ");
}
}
}
protected boolean isValidStatement(CtStatement element) throws IOException {
if (sourceFilter != null) {
String file = element.getPosition().getCompilationUnit().getFile().toString();
for (File filter : sourceFilter) {
if (file.contains(filter.getCanonicalPath().toString())) return false;
}
}
valid = new ValidStatementVisitor(element, false);
element.getParent().accept(valid);
return !valid.inExpression(element) && valid.isValid();
}
}