package org.nlamah.QLS.TypeChecker; import java.util.List; import org.nlamah.QBase.Constants.QBaseQuestionType; import org.nlamah.QBase.Tools.QLSTools; import org.nlamah.QBase.TypeChecker.QBaseAbstractTypeChecker; import org.nlamah.QL.Model.Form.Form; import org.nlamah.QL.Model.Form.Abstract.FormQuestion; import org.nlamah.QL.TypeChecker.FormQuestionsCollector; import org.nlamah.QLS.Error.WidgetTypeMismatchError; import org.nlamah.QLS.Interfaces.QLSNodeVisitor; import org.nlamah.QLS.Model.Abstract.QLSNode; import org.nlamah.QLS.Model.Declaration.ColorDeclaration; import org.nlamah.QLS.Model.Declaration.FontDeclaration; import org.nlamah.QLS.Model.Declaration.FontSizeDeclaration; import org.nlamah.QLS.Model.Declaration.WidgetDeclaration; import org.nlamah.QLS.Model.Declaration.WidthDeclaration; import org.nlamah.QLS.Model.StylesheetBlock.DefaultBlock; import org.nlamah.QLS.Model.StylesheetBlock.Page; import org.nlamah.QLS.Model.StylesheetBlock.StyleBlock; import org.nlamah.QLS.Model.StylesheetBlock.StyledQuestion; import org.nlamah.QLS.Model.StylesheetBlock.Stylesheet; import org.nlamah.QLS.Model.StylesheetBlock.Section; import org.nlamah.QLS.Model.Value.IdentifierValue; public class WidgetTypeChecker extends QBaseAbstractTypeChecker implements QLSNodeVisitor { private List<FormQuestion> formQuestions; private List<WidgetDeclaration> widgetDeclarations; private WidgetDeclaration currentWidgetDeclaration; public WidgetTypeChecker(Form form, Stylesheet stylesheet) { formQuestions = new FormQuestionsCollector(form).questions(); widgetDeclarations = new WidgetDeclarationsCollector(stylesheet).widgetDeclarations(); } public void check() { for (WidgetDeclaration widgetDeclaration : widgetDeclarations) { currentWidgetDeclaration = widgetDeclaration; widgetDeclaration.parentNode().accept(this); } } @Override public QLSNode visit(Stylesheet stylesheet) { assert(false); return null; } @Override public QLSNode visit(Page page) { assert(false); return null; } @Override public QLSNode visit(Section section) { assert(false); return null; } @Override public QLSNode visit(WidgetDeclaration widgetDeclaration) { assert(false); return null; } @Override public QLSNode visit(StyledQuestion styledQuestion) { QBaseQuestionType formQuestionType = QLSTools.getTypeForStyledQuestion(styledQuestion, formQuestions); if (formQuestionType != currentWidgetDeclaration.returnType()) { errors.add(new WidgetTypeMismatchError(currentWidgetDeclaration, formQuestionType)); } return null; } @Override public QLSNode visit(DefaultBlock defaultBlock) { if (defaultBlock.questionType() != currentWidgetDeclaration.returnType()) { errors.add(new WidgetTypeMismatchError(currentWidgetDeclaration, currentWidgetDeclaration.returnType())); } return null; } @Override public QLSNode visit(StyleBlock styleBlock) { styleBlock.parentNode().accept(this); return null; } @Override public QLSNode visit(IdentifierValue identifierValue) { assert(false); return null; } @Override public QLSNode visit(ColorDeclaration colorDeclaration) { assert(false); return null; } @Override public QLSNode visit(FontDeclaration fontDeclaration) { assert(false); return null; } @Override public QLSNode visit(FontSizeDeclaration fontSizeDeclaration) { assert(false); return null; } @Override public QLSNode visit(WidthDeclaration widthDeclaration) { assert(false); return null; } }