package nl.uva.sc.encoders.qls.validation;
import static nl.uva.sc.encoders.ql.validation.ValidationMessage.Type.ERROR;
import java.util.ArrayList;
import java.util.List;
import nl.uva.sc.encoders.ql.ast.Questionnaire;
import nl.uva.sc.encoders.ql.ast.TextLocation;
import nl.uva.sc.encoders.ql.validation.TypeValidation;
import nl.uva.sc.encoders.qls.ast.Page;
import nl.uva.sc.encoders.qls.ast.Question;
import nl.uva.sc.encoders.qls.ast.Section;
import nl.uva.sc.encoders.qls.ast.Stylesheet;
import nl.uva.sc.encoders.qls.visitor.AstVisitor;
public class TypeChecker implements AstVisitor<List<TypeValidation>> {
private final Stylesheet stylesheet;
private final Questionnaire questionnaire;
public TypeChecker(Stylesheet stylesheet, Questionnaire questionnaire) {
this.stylesheet = stylesheet;
this.questionnaire = questionnaire;
}
public List<TypeValidation> checkTypes() {
List<TypeValidation> validations = new ArrayList<>();
List<Page> pages = stylesheet.getPages();
for (Page page : pages) {
List<Section> sections = page.getSections();
for (Section section : sections) {
validations.addAll(section.accept(this));
}
}
return validations;
}
@Override
public List<TypeValidation> visit(Section section) {
List<TypeValidation> validations = new ArrayList<>();
List<Question> questions = section.getQuestions();
for (Question question : questions) {
validations.addAll(question.accept(this));
}
List<Section> subSections = section.getSubSections();
for (Section subSection : subSections) {
List<TypeValidation> subSectionValidations = subSection.accept(this);
validations.addAll(subSectionValidations);
}
return validations;
}
@Override
public List<TypeValidation> visit(Question question) {
List<TypeValidation> validations = new ArrayList<>();
if (!questionnaire.containsQuestion(question.getName())) {
String validationMessage = "Question '" + question + "' does not exist in questionnaire";
TextLocation textLocation = question.getTextLocation();
validations.add(new TypeValidation(validationMessage, textLocation, ERROR));
}
return validations;
}
}