@@ -1250,6 +1250,62 @@ void PotentialBindings::infer(Constraint *constraint) {
1250
1250
}
1251
1251
}
1252
1252
1253
+ void PotentialBindings::retract (Constraint *constraint) {
1254
+ Bindings.remove_if ([&constraint](const PotentialBinding &binding) {
1255
+ return binding.getSource () == constraint;
1256
+ });
1257
+
1258
+ auto isMatchingConstraint = [&constraint](Constraint *existing) {
1259
+ return existing == constraint;
1260
+ };
1261
+
1262
+ auto hasMatchingSource =
1263
+ [&constraint](
1264
+ const std::pair<TypeVariableType *, Constraint *> &adjacency) {
1265
+ return adjacency.second == constraint;
1266
+ };
1267
+
1268
+ switch (constraint->getKind ()) {
1269
+ case ConstraintKind::ConformsTo:
1270
+ case ConstraintKind::SelfObjectOfProtocol:
1271
+ Protocols.erase (llvm::remove_if (Protocols, isMatchingConstraint),
1272
+ Protocols.end ());
1273
+ break ;
1274
+
1275
+ case ConstraintKind::LiteralConformsTo:
1276
+ Literals.erase (constraint->getProtocol ());
1277
+ break ;
1278
+
1279
+ case ConstraintKind::Defaultable:
1280
+ case ConstraintKind::DefaultClosureType: {
1281
+ auto defaultType = constraint->getSecondType ();
1282
+ Defaults.erase (defaultType->getCanonicalType ());
1283
+ break ;
1284
+ }
1285
+
1286
+ default :
1287
+ break ;
1288
+ }
1289
+
1290
+ {
1291
+ llvm::SmallPtrSet<TypeVariableType *, 2 > unviable;
1292
+ for (const auto &adjacent : AdjacentVars) {
1293
+ if (adjacent.second == constraint)
1294
+ unviable.insert (adjacent.first );
1295
+ }
1296
+
1297
+ for (auto *adjacentVar : unviable)
1298
+ AdjacentVars.erase (std::make_pair (adjacentVar, constraint));
1299
+ }
1300
+
1301
+ DelayedBy.erase (llvm::remove_if (DelayedBy, isMatchingConstraint),
1302
+ DelayedBy.end ());
1303
+
1304
+ SubtypeOf.remove_if (hasMatchingSource);
1305
+ SupertypeOf.remove_if (hasMatchingSource);
1306
+ EquivalentTo.remove_if (hasMatchingSource);
1307
+ }
1308
+
1253
1309
LiteralBindingKind PotentialBindings::getLiteralKind () const {
1254
1310
LiteralBindingKind kind = LiteralBindingKind::None;
1255
1311
0 commit comments