void ParserDriver::addType(std::unique_ptr<AstType> type) { const auto& name = type->getName(); if (const AstType* prev = translationUnit->getProgram()->getType(name)) { Diagnostic err(Diagnostic::ERROR, DiagnosticMessage("Redefinition of type " + toString(name), type->getSrcLoc()), {DiagnosticMessage("Previous definition", prev->getSrcLoc())}); translationUnit->getErrorReport().addDiagnostic(err); } else { translationUnit->getProgram()->addType(std::move(type)); } }
void ParserDriver::addFunctorDeclaration(std::unique_ptr<AstFunctorDeclaration> f) { const std::string& name = f->getName(); if (AstFunctorDeclaration* prev = translationUnit->getProgram()->getFunctorDeclaration(name)) { Diagnostic err(Diagnostic::ERROR, DiagnosticMessage("Redefinition of functor " + toString(name), f->getSrcLoc()), {DiagnosticMessage("Previous definition", prev->getSrcLoc())}); translationUnit->getErrorReport().addDiagnostic(err); } else { translationUnit->getProgram()->addFunctorDeclaration(std::move(f)); } }
void ParserDriver::addRelation(std::unique_ptr<AstRelation> r) { const auto& name = r->getName(); if (AstRelation* prev = translationUnit->getProgram()->getRelation(name)) { Diagnostic err(Diagnostic::ERROR, DiagnosticMessage("Redefinition of relation " + toString(name), r->getSrcLoc()), {DiagnosticMessage("Previous definition", prev->getSrcLoc())}); translationUnit->getErrorReport().addDiagnostic(err); } else { if (!r->getStores().empty() || !r->getLoads().empty()) { translationUnit->getErrorReport().addWarning( "Deprecated io qualifier was used in relation " + toString(name), r->getSrcLoc()); } translationUnit->getProgram()->addRelation(std::move(r)); } }
void ParserDriver::addStore(std::unique_ptr<AstStore> d) { if (dynamic_cast<AstPrintSize*>(d.get()) != nullptr) { for (const auto& cur : translationUnit->getProgram()->getStores()) { if (cur->getName() == d->getName() && dynamic_cast<AstPrintSize*>(cur.get()) != nullptr) { Diagnostic err(Diagnostic::ERROR, DiagnosticMessage( "Redefinition of printsize directives for relation " + toString(d->getName()), d->getSrcLoc()), {DiagnosticMessage("Previous definition", cur->getSrcLoc())}); translationUnit->getErrorReport().addDiagnostic(err); return; } } } translationUnit->getProgram()->addStore(std::move(d)); }