Skip to content

Commit

Permalink
Cleaned up the type constraints analysis files.
Browse files Browse the repository at this point in the history
  • Loading branch information
Abdul Zreika committed Nov 12, 2020
1 parent a4831eb commit 3d0de79
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 30 deletions.
27 changes: 27 additions & 0 deletions src/ast/analysis/TypeConstraints.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -605,4 +605,31 @@ void TypeConstraintsAnalysis::visitAggregator(const Aggregator& agg) {
}
}

void TypeConstraintsAnalysis::iterateOverAtom(
const Atom& atom, std::function<void(const Argument&, const Type&)> map) {
// get relation
auto rel = getAtomRelation(&atom, &program);
if (rel == nullptr) {
return; // error in input program
}

auto atts = rel->getAttributes();
auto args = atom.getArguments();
if (atts.size() != args.size()) {
return; // error in input program
}

for (size_t i = 0; i < atts.size(); i++) {
const auto& typeName = atts[i]->getTypeName();
if (typeEnv.isType(typeName)) {
map(*args[i], typeEnv.getType(typeName));
}
}
}

void TypeConstraintsAnalysis::collectConstraints(const Clause& clause) {
sinks.insert(clause.getHead());
visitDepthFirstPreOrder(clause, *this);
}

} // namespace souffle::ast::analysis
38 changes: 8 additions & 30 deletions src/ast/analysis/TypeConstraints.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,11 +93,15 @@ class TypeConstraintsAnalysis : public ConstraintAnalysis<TypeVar> {
// Sinks = {head} ∪ {negated atoms}
std::set<const Atom*> sinks;

void collectConstraints(const Clause& clause) override {
sinks.insert(clause.getHead());
visitDepthFirstPreOrder(clause, *this);
}
/**
* Utility function.
* Iterate over atoms valid pairs of (argument, type-attribute) and apply procedure `map` for its
* side-effects.
*/
void iterateOverAtom(const Atom& atom, std::function<void(const Argument&, const Type&)> map);

/** Visitors */
void collectConstraints(const Clause& clause) override;
void visitSink(const Atom& atom);
void visitAtom(const Atom& atom) override;
void visitNegation(const Negation& cur) override;
Expand All @@ -110,32 +114,6 @@ class TypeConstraintsAnalysis : public ConstraintAnalysis<TypeVar> {
void visitRecordInit(const RecordInit& record) override;
void visitBranchInit(const BranchInit& adt) override;
void visitAggregator(const Aggregator& agg) override;

/**
* Utility function.
* Iterate over atoms valid pairs of (argument, type-attribute) and apply procedure `map` for its
* side-effects.
*/
void iterateOverAtom(const Atom& atom, std::function<void(const Argument&, const Type&)> map) {
// get relation
auto rel = getAtomRelation(&atom, &program);
if (rel == nullptr) {
return; // error in input program
}

auto atts = rel->getAttributes();
auto args = atom.getArguments();
if (atts.size() != args.size()) {
return; // error in input program
}

for (size_t i = 0; i < atts.size(); i++) {
const auto& typeName = atts[i]->getTypeName();
if (typeEnv.isType(typeName)) {
map(*args[i], typeEnv.getType(typeName));
}
}
}
};

} // namespace souffle::ast::analysis

0 comments on commit 3d0de79

Please sign in to comment.