package nl.uva.softwcons.qls.validation.questionidentifier; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import nl.uva.softwcons.ql.ast.expression.identifier.Identifier; import nl.uva.softwcons.ql.ast.form.Form; import nl.uva.softwcons.ql.ast.form.FormVisitor; import nl.uva.softwcons.ql.ast.statement.ComputedQuestion; import nl.uva.softwcons.ql.ast.statement.Conditional; import nl.uva.softwcons.ql.ast.statement.Question; import nl.uva.softwcons.ql.ast.statement.Statement; import nl.uva.softwcons.ql.ast.statement.StatementVisitor; public final class FormQuestionCollector implements FormVisitor<Set<Identifier>>, StatementVisitor<Set<Identifier>> { public static Set<Identifier> collectFrom(final Form form) { return form.accept(new FormQuestionCollector()); } private FormQuestionCollector() { } @Override public Set<Identifier> visit(final ComputedQuestion question) { return new HashSet<>(Arrays.asList(question.getId())); } @Override public Set<Identifier> visit(final Question question) { return new HashSet<>(Arrays.asList(question.getId())); } @Override public Set<Identifier> visit(final Conditional statement) { return visitAndFlatten(statement.getQuestions()); } @Override public Set<Identifier> visit(final Form form) { return visitAndFlatten(form.getStatements()); } /** * Visits the given statements, collects found identifiers and merges them * into a flat resulting set. */ private Set<Identifier> visitAndFlatten(final List<? extends Statement> statements) { return statements.stream().flatMap(s -> s.accept(this).stream()).collect(Collectors.toSet()); } }