package qlProject.typeChecking;
import qlProject.ast.Questionnaire;
import qlProject.ast.value.Value;
import qlProject.typeChecking.complaints.Complaint;
import qlProject.typeChecking.typeCheckVisitors.QuestionsStoringVisitor;
import qlProject.typeChecking.typeCheckVisitors.StatementsTypeCheckVisitor;
import qlProject.util.QuestionDetails;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class TypeCheckManager {
private Questionnaire questionnaire;
private Map<String,QuestionDetails> questionsDetails;
private Map<String, Value> valuesEnvironment;
private Map<String,Set<String>> dependencies;
private Map<String,Set<String>> awaitingCalculationIds;
private final HashSet<Complaint> complaints = new HashSet<Complaint>();
public TypeCheckManager(Questionnaire questionnaire, Map<String, QuestionDetails> questionsDetails, Map<String, Value> valuesEnvironment,
Map<String, Set<String>> dependencies, Map<String, Set<String>> awaitingCalculationIds){
this.questionnaire = questionnaire;
this.questionsDetails = questionsDetails;
this.valuesEnvironment = valuesEnvironment;
this.dependencies = dependencies;
this.awaitingCalculationIds = awaitingCalculationIds;
}
public void manageTypeChecking(){
/*A visitor for storing the questions info in maps,
* also collects complaints about already existing elements */
QuestionsStoringVisitor questionsStoringVisitor = new QuestionsStoringVisitor(
questionsDetails, valuesEnvironment, dependencies, complaints, awaitingCalculationIds);
questionnaire.accept(questionsStoringVisitor);
/*after the data environment are initiated and populated, the transitive
* dependencies have to be added, which is done by the function called next */
questionsStoringVisitor.extractTransitiveClosureDependencies();
/*A visitor for checking compatibility between expressions' and questions' types
* When an expression is present, the expression type checker is then being used */
StatementsTypeCheckVisitor checker = new StatementsTypeCheckVisitor(questionsDetails, complaints, dependencies);
questionnaire.accept(checker);
checker.showComplaints();
}
}