mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Sema: Record pack expansion environments in the trail
This commit is contained in:
@@ -71,6 +71,8 @@ public:
|
|||||||
RecordedOpenedExistentialType,
|
RecordedOpenedExistentialType,
|
||||||
/// Recorded the opening of a pack existential type.
|
/// Recorded the opening of a pack existential type.
|
||||||
RecordedOpenedPackExpansionType,
|
RecordedOpenedPackExpansionType,
|
||||||
|
/// Recorded the creation of a generic environment for a pack expansion expression.
|
||||||
|
RecordedPackExpansionEnvironment,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// A change made to the constraint system.
|
/// A change made to the constraint system.
|
||||||
@@ -203,6 +205,9 @@ public:
|
|||||||
/// Create a change that recorded the opening of a pack expansion type.
|
/// Create a change that recorded the opening of a pack expansion type.
|
||||||
static Change recordedOpenedPackExpansionType(PackExpansionType *expansion);
|
static Change recordedOpenedPackExpansionType(PackExpansionType *expansion);
|
||||||
|
|
||||||
|
/// Create a change that recorded the opening of a pack expansion type.
|
||||||
|
static Change recordedPackExpansionEnvironment(ConstraintLocator *locator);
|
||||||
|
|
||||||
/// Undo this change, reverting the constraint graph to the state it
|
/// Undo this change, reverting the constraint graph to the state it
|
||||||
/// had prior to this change.
|
/// had prior to this change.
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -2397,7 +2397,7 @@ private:
|
|||||||
llvm::SmallDenseMap<PackExpansionType *, TypeVariableType *, 4>
|
llvm::SmallDenseMap<PackExpansionType *, TypeVariableType *, 4>
|
||||||
OpenedPackExpansionTypes;
|
OpenedPackExpansionTypes;
|
||||||
|
|
||||||
llvm::SmallMapVector<ConstraintLocator *, std::pair<UUID, Type>, 4>
|
llvm::SmallDenseMap<ConstraintLocator *, std::pair<UUID, Type>, 4>
|
||||||
PackExpansionEnvironments;
|
PackExpansionEnvironments;
|
||||||
|
|
||||||
llvm::SmallMapVector<PackElementExpr *, PackExpansionExpr *, 2>
|
llvm::SmallMapVector<PackElementExpr *, PackExpansionExpr *, 2>
|
||||||
@@ -2883,9 +2883,6 @@ public:
|
|||||||
/// FIXME: Remove this.
|
/// FIXME: Remove this.
|
||||||
unsigned numFixes;
|
unsigned numFixes;
|
||||||
|
|
||||||
/// The length of \c PackExpansionEnvironments.
|
|
||||||
unsigned numPackExpansionEnvironments;
|
|
||||||
|
|
||||||
/// The length of \c PackEnvironments.
|
/// The length of \c PackEnvironments.
|
||||||
unsigned numPackEnvironments;
|
unsigned numPackEnvironments;
|
||||||
|
|
||||||
@@ -3464,6 +3461,16 @@ public:
|
|||||||
GenericEnvironment *getPackElementEnvironment(ConstraintLocator *locator,
|
GenericEnvironment *getPackElementEnvironment(ConstraintLocator *locator,
|
||||||
CanType shapeClass);
|
CanType shapeClass);
|
||||||
|
|
||||||
|
/// Update PackExpansionEnvironments and record a change in the trail.
|
||||||
|
void recordPackExpansionEnvironment(ConstraintLocator *locator,
|
||||||
|
std::pair<UUID, Type> uuidAndShape);
|
||||||
|
|
||||||
|
/// Undo the above change.
|
||||||
|
void removePackExpansionEnvironment(ConstraintLocator *locator) {
|
||||||
|
bool erased = PackExpansionEnvironments.erase(locator);
|
||||||
|
ASSERT(erased);
|
||||||
|
}
|
||||||
|
|
||||||
/// Get the opened element generic environment for the given pack element.
|
/// Get the opened element generic environment for the given pack element.
|
||||||
PackExpansionExpr *getPackEnvironment(PackElementExpr *packElement) const;
|
PackExpansionExpr *getPackEnvironment(PackElementExpr *packElement) const;
|
||||||
|
|
||||||
|
|||||||
@@ -341,7 +341,7 @@ void ConstraintSystem::applySolution(const Solution &solution) {
|
|||||||
|
|
||||||
// Register the solutions's pack expansion environments.
|
// Register the solutions's pack expansion environments.
|
||||||
for (const auto &expansion : solution.PackExpansionEnvironments) {
|
for (const auto &expansion : solution.PackExpansionEnvironments) {
|
||||||
PackExpansionEnvironments.insert(expansion);
|
recordPackExpansionEnvironment(expansion.first, expansion.second);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Register the solutions's pack environments.
|
// Register the solutions's pack environments.
|
||||||
@@ -672,7 +672,6 @@ ConstraintSystem::SolverScope::SolverScope(ConstraintSystem &cs)
|
|||||||
|
|
||||||
numTypeVariables = cs.TypeVariables.size();
|
numTypeVariables = cs.TypeVariables.size();
|
||||||
numFixes = cs.Fixes.size();
|
numFixes = cs.Fixes.size();
|
||||||
numPackExpansionEnvironments = cs.PackExpansionEnvironments.size();
|
|
||||||
numPackEnvironments = cs.PackEnvironments.size();
|
numPackEnvironments = cs.PackEnvironments.size();
|
||||||
numPackElementGenericEnvironments = cs.PackElementGenericEnvironments.size();
|
numPackElementGenericEnvironments = cs.PackElementGenericEnvironments.size();
|
||||||
numDefaultedConstraints = cs.DefaultedConstraints.size();
|
numDefaultedConstraints = cs.DefaultedConstraints.size();
|
||||||
@@ -731,9 +730,6 @@ ConstraintSystem::SolverScope::~SolverScope() {
|
|||||||
// constraints introduced by the current scope.
|
// constraints introduced by the current scope.
|
||||||
cs.solverState->rollback(this);
|
cs.solverState->rollback(this);
|
||||||
|
|
||||||
// Remove any pack expansion environments.
|
|
||||||
truncate(cs.PackExpansionEnvironments, numPackExpansionEnvironments);
|
|
||||||
|
|
||||||
// Remove any pack environments.
|
// Remove any pack environments.
|
||||||
truncate(cs.PackEnvironments, numPackEnvironments);
|
truncate(cs.PackEnvironments, numPackEnvironments);
|
||||||
|
|
||||||
|
|||||||
@@ -201,6 +201,14 @@ SolverTrail::Change::recordedOpenedPackExpansionType(PackExpansionType *expansio
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SolverTrail::Change
|
||||||
|
SolverTrail::Change::recordedPackExpansionEnvironment(ConstraintLocator *locator) {
|
||||||
|
Change result;
|
||||||
|
result.Kind = ChangeKind::RecordedPackExpansionEnvironment;
|
||||||
|
result.Locator = locator;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
void SolverTrail::Change::undo(ConstraintSystem &cs) const {
|
void SolverTrail::Change::undo(ConstraintSystem &cs) const {
|
||||||
auto &cg = cs.getConstraintGraph();
|
auto &cg = cs.getConstraintGraph();
|
||||||
|
|
||||||
@@ -277,6 +285,10 @@ void SolverTrail::Change::undo(ConstraintSystem &cs) const {
|
|||||||
case ChangeKind::RecordedOpenedPackExpansionType:
|
case ChangeKind::RecordedOpenedPackExpansionType:
|
||||||
cs.removeOpenedPackExpansionType(ExpansionTy);
|
cs.removeOpenedPackExpansionType(ExpansionTy);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ChangeKind::RecordedPackExpansionEnvironment:
|
||||||
|
cs.removePackExpansionEnvironment(Locator);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -424,6 +436,12 @@ void SolverTrail::Change::dump(llvm::raw_ostream &out,
|
|||||||
ExpansionTy->print(out, PO);
|
ExpansionTy->print(out, PO);
|
||||||
out << ")\n";
|
out << ")\n";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ChangeKind::RecordedPackExpansionEnvironment:
|
||||||
|
out << "(recorded pack expansion environment at ";
|
||||||
|
Locator->dump(&cs.getASTContext().SourceMgr, out);
|
||||||
|
out << ")\n";
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -868,7 +868,7 @@ ConstraintSystem::getPackElementEnvironment(ConstraintLocator *locator,
|
|||||||
auto result = PackExpansionEnvironments.find(locator);
|
auto result = PackExpansionEnvironments.find(locator);
|
||||||
if (result == PackExpansionEnvironments.end()) {
|
if (result == PackExpansionEnvironments.end()) {
|
||||||
uuidAndShape = std::make_pair(UUID::fromTime(), shapeClass);
|
uuidAndShape = std::make_pair(UUID::fromTime(), shapeClass);
|
||||||
PackExpansionEnvironments[locator] = uuidAndShape;
|
recordPackExpansionEnvironment(locator, uuidAndShape);
|
||||||
} else {
|
} else {
|
||||||
uuidAndShape = result->second;
|
uuidAndShape = result->second;
|
||||||
}
|
}
|
||||||
@@ -891,6 +891,17 @@ ConstraintSystem::getPackElementEnvironment(ConstraintLocator *locator,
|
|||||||
shapeParam, contextSubs);
|
shapeParam, contextSubs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ConstraintSystem::recordPackExpansionEnvironment(
|
||||||
|
ConstraintLocator *locator, std::pair<UUID, Type> uuidAndShape) {
|
||||||
|
bool inserted = PackExpansionEnvironments.insert({locator, uuidAndShape}).second;
|
||||||
|
if (inserted) {
|
||||||
|
if (isRecordingChanges()) {
|
||||||
|
recordChange(
|
||||||
|
SolverTrail::Change::recordedPackExpansionEnvironment(locator));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PackExpansionExpr *
|
PackExpansionExpr *
|
||||||
ConstraintSystem::getPackEnvironment(PackElementExpr *packElement) const {
|
ConstraintSystem::getPackEnvironment(PackElementExpr *packElement) const {
|
||||||
const auto match = PackEnvironments.find(packElement);
|
const auto match = PackEnvironments.find(packElement);
|
||||||
|
|||||||
Reference in New Issue
Block a user