package com.kls.typechecker; import com.common.ast.Location; import com.common.typechecker.error.AError; import com.common.typechecker.error.NotUniqueID; import com.common.typechecker.error.UnexpectedValue; import com.kls.ast.IVisitor; import com.kls.ast.node.*; import com.kls.ast.node.property.AProperty; import com.kls.ast.node.value.AValue; import java.util.ArrayList; import java.util.List; /** * Created by Timon on 07.03.2015. */ public class Typechecker implements IVisitor<Void> { private final List<AError> errors; private final List<String> questionIds; public Typechecker() { this.errors = new ArrayList<>(); this.questionIds = new ArrayList<>(); } @Override public Void visit(StylesheetNode stylesheetNode) { for (AGroupNodeBase groupNodeBase : stylesheetNode.getGroups()) { } return null; } @Override public Void visit(PageNode pageNode) { return null; } @Override public Void visit(SectionNode sectionNode) { return null; } @Override public Void visit(QuestionNode questionNode) { String id = questionNode.getIdentifier(); if (questionIds.contains(id)){ Location location = questionNode.getLocation(); NotUniqueID idError = new NotUniqueID(id, location); errors.add(idError); } else { questionIds.add(id); } for (DeclarationNode declaration : questionNode.getDeclarations()) { visit(declaration); } return null; } @Override public Void visit(DefaultNode defaultNode) { return null; } @Override public Void visit(DeclarationNode declarationNode) { AProperty property = declarationNode.getProperty().getProperty(); AValue value = declarationNode.getValue().getValue(); if (!property.isCompatibleWith(value)){ AError unexpectedValue = new UnexpectedValue(property, value, declarationNode.getLocation()); errors.add(unexpectedValue); } return null; } @Override public Void visit(PropertyNode propertyNode) { return null; } @Override public Void visit(ValueNode valueNode) { return null; } }