Sema: Record result builder transforms in the trail

This commit is contained in:
Slava Pestov
2024-10-02 22:43:42 -04:00
parent 64293ece51
commit c7edc3494e
5 changed files with 54 additions and 16 deletions

View File

@@ -1211,15 +1211,7 @@ ConstraintSystem::matchResultBuilder(AnyFunctionRef fn, Type builderType,
transformInfo.transformedBody = transformedBody->second;
// Record the transformation.
assert(
std::find_if(
resultBuilderTransformed.begin(), resultBuilderTransformed.end(),
[&](const std::pair<AnyFunctionRef, AppliedBuilderTransform> &elt) {
return elt.first == fn;
}) == resultBuilderTransformed.end() &&
"already transformed this body along this path!?!");
resultBuilderTransformed.insert(
std::make_pair(fn, std::move(transformInfo)));
recordResultBuilderTransform(fn, std::move(transformInfo));
if (generateConstraints(fn, transformInfo.transformedBody))
return getTypeMatchFailure(locator);
@@ -1227,6 +1219,22 @@ ConstraintSystem::matchResultBuilder(AnyFunctionRef fn, Type builderType,
return getTypeMatchSuccess();
}
void ConstraintSystem::recordResultBuilderTransform(AnyFunctionRef fn,
AppliedBuilderTransform transformInfo) {
bool inserted = resultBuilderTransformed.insert(
std::make_pair(fn, std::move(transformInfo))).second;
ASSERT(inserted);
if (solverState)
recordChange(SolverTrail::Change::recordedResultBuilderTransform(fn));
}
/// Undo the above change.
void ConstraintSystem::removeResultBuilderTransform(AnyFunctionRef fn) {
bool erased = resultBuilderTransformed.erase(fn);
ASSERT(erased);
}
namespace {
class ReturnStmtFinder : public ASTWalker {
std::vector<ReturnStmt *> ReturnStmts;