void ConstraintGraph::Change::undo(ConstraintGraph &cg) { /// Temporarily change the active scope to null, so we don't record /// any changes made while performing the undo operation. llvm::SaveAndRestore<ConstraintGraphScope *> prevActiveScope(cg.ActiveScope, nullptr); switch (Kind) { case ChangeKind::AddedTypeVariable: cg.removeNode(TypeVar); break; case ChangeKind::AddedConstraint: cg.removeConstraint(TheConstraint); break; case ChangeKind::RemovedConstraint: cg.addConstraint(TheConstraint); break; case ChangeKind::ExtendedEquivalenceClass: { auto &node = cg[EquivClass.TypeVar]; node.EquivalenceClass.erase( node.EquivalenceClass.begin() + EquivClass.PrevSize, node.EquivalenceClass.end()); break; } case ChangeKind::BoundTypeVariable: cg.unbindTypeVariable(Binding.TypeVar, Binding.FixedType); break; } }
void ConstraintGraph::Change::undo(ConstraintGraph &cg) { /// Temporarily change the active scope to null, so we don't record /// any changes made while performing the undo operation. llvm::SaveAndRestore<ConstraintGraphScope *> prevActiveScope(cg.ActiveScope, nullptr); switch (Kind) { case ChangeKind::AddedTypeVariable: cg.removeNode(TypeVar); break; case ChangeKind::AddedConstraint: cg.removeConstraint(TheConstraint); break; case ChangeKind::RemovedConstraint: cg.addConstraint(TheConstraint); break; case ChangeKind::ExtendedEquivalenceClass: { auto &node = cg[EquivClass.TypeVar]; node.EquivalenceClass.erase( node.EquivalenceClass.begin() + EquivClass.PrevSize, node.EquivalenceClass.end()); break; } case ChangeKind::BoundTypeVariable: cg.unbindTypeVariable(Binding.TypeVar, Binding.FixedType); break; case ChangeKind::AddedMemberType: { auto &node = cg[MemberType.TypeVar]; // Erase the member type entry from the auto known = node.MemberTypeIndex.find(MemberType.Name); assert(known != node.MemberTypeIndex.end() && "Constraint graph corrupted"); unsigned index = known->second; node.MemberTypeIndex.erase(known); // If this was not the last member type, swap it with the last // member type. if (index != node.MemberTypes.size()-1) { node.MemberTypes[index] = node.MemberTypes.back(); node.MemberTypeIndex[node.MemberTypes[index].first] = index; } // Pop off the last member type. node.MemberTypes.pop_back(); break; } } }