@@ -552,18 +552,11 @@ void ConstraintGraph::retractBindings(TypeVariableType *typeVar,
552
552
553
553
#pragma mark Algorithms
554
554
555
- // / Perform a depth-first search.
556
- // /
557
- // / \param cg The constraint graph.
558
- // / \param typeVar The type variable we're searching from.
559
- // / \param visitConstraint Called before considering a constraint.
560
- // / \param visitedConstraints Set of already-visited constraints, used
561
- // / internally to avoid duplicated work.
562
555
static void depthFirstSearch (
563
556
ConstraintGraph &cg,
564
557
TypeVariableType *typeVar,
565
- llvm::function_ref<void (Constraint *)> visitConstraint,
566
558
llvm::SmallPtrSet<TypeVariableType *, 4 > &typeVars,
559
+ llvm::TinyPtrVector<Constraint *> &constraints,
567
560
llvm::SmallPtrSet<Constraint *, 8 > &visitedConstraints) {
568
561
// If we're not looking at this type variable right now because we're
569
562
// solving a conjunction element, don't consider its adjacencies.
@@ -577,11 +570,8 @@ static void depthFirstSearch(
577
570
// Local function to visit adjacent type variables.
578
571
auto visitAdjacencies = [&](ArrayRef<TypeVariableType *> adjTypeVars) {
579
572
for (auto adj : adjTypeVars) {
580
- if (adj == typeVar)
581
- continue ;
582
-
583
- // Recurse into this node.
584
- depthFirstSearch (cg, adj, visitConstraint, typeVars, visitedConstraints);
573
+ if (adj != typeVar)
574
+ depthFirstSearch (cg, adj, typeVars, constraints, visitedConstraints);
585
575
}
586
576
};
587
577
@@ -592,7 +582,7 @@ static void depthFirstSearch(
592
582
if (!visitedConstraints.insert (constraint).second )
593
583
continue ;
594
584
595
- visitConstraint (constraint);
585
+ constraints. push_back (constraint);
596
586
}
597
587
598
588
// Visit all of the other nodes in the equivalence class.
@@ -611,28 +601,22 @@ static void depthFirstSearch(
611
601
visitAdjacencies (node.getReferencedVars ());
612
602
}
613
603
614
- llvm::TinyPtrVector<Constraint *> ConstraintGraph::gatherConstraints (
615
- TypeVariableType *typeVar, GatheringKind kind,
616
- llvm::function_ref<bool (Constraint *)> acceptConstraintFn) {
604
+ llvm::TinyPtrVector<Constraint *> ConstraintGraph::gatherAllConstraints (
605
+ TypeVariableType *typeVar) {
617
606
llvm::TinyPtrVector<Constraint *> constraints;
618
607
llvm::SmallPtrSet<TypeVariableType *, 4 > typeVars;
619
608
llvm::SmallPtrSet<Constraint *, 8 > visitedConstraints;
620
609
621
- if (kind == GatheringKind::AllMentions) {
622
- // If we've been asked for "all mentions" of a type variable, search for
623
- // constraints involving both it and its fixed bindings.
624
- depthFirstSearch (
625
- *this , typeVar,
626
- [&](Constraint *constraint) {
627
- if (acceptConstraintFn (constraint))
628
- constraints.push_back (constraint);
629
- },
630
- typeVars, visitedConstraints);
631
- return constraints;
632
- }
610
+ depthFirstSearch (*this , typeVar, typeVars, constraints, visitedConstraints);
611
+ return constraints;
612
+ }
633
613
634
- // Otherwise only search in the type var's equivalence class and immediate
635
- // fixed bindings.
614
+ llvm::TinyPtrVector<Constraint *> ConstraintGraph::gatherNearbyConstraints (
615
+ TypeVariableType *typeVar,
616
+ llvm::function_ref<bool (Constraint *)> acceptConstraintFn) {
617
+ llvm::TinyPtrVector<Constraint *> constraints;
618
+ llvm::SmallPtrSet<TypeVariableType *, 4 > typeVars;
619
+ llvm::SmallPtrSet<Constraint *, 8 > visitedConstraints;
636
620
637
621
// Local function to add constraints.
638
622
auto addTypeVarConstraints = [&](TypeVariableType *adjTypeVar) {
0 commit comments