@@ -552,18 +552,11 @@ void ConstraintGraph::retractBindings(TypeVariableType *typeVar,
552552
553553#pragma mark Algorithms
554554
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.
562555static void depthFirstSearch (
563556 ConstraintGraph &cg,
564557 TypeVariableType *typeVar,
565- llvm::function_ref<void (Constraint *)> visitConstraint,
566558 llvm::SmallPtrSet<TypeVariableType *, 4 > &typeVars,
559+ llvm::TinyPtrVector<Constraint *> &constraints,
567560 llvm::SmallPtrSet<Constraint *, 8 > &visitedConstraints) {
568561 // If we're not looking at this type variable right now because we're
569562 // solving a conjunction element, don't consider its adjacencies.
@@ -577,11 +570,8 @@ static void depthFirstSearch(
577570 // Local function to visit adjacent type variables.
578571 auto visitAdjacencies = [&](ArrayRef<TypeVariableType *> adjTypeVars) {
579572 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);
585575 }
586576 };
587577
@@ -592,7 +582,7 @@ static void depthFirstSearch(
592582 if (!visitedConstraints.insert (constraint).second )
593583 continue ;
594584
595- visitConstraint (constraint);
585+ constraints. push_back (constraint);
596586 }
597587
598588 // Visit all of the other nodes in the equivalence class.
@@ -611,28 +601,22 @@ static void depthFirstSearch(
611601 visitAdjacencies (node.getReferencedVars ());
612602}
613603
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) {
617606 llvm::TinyPtrVector<Constraint *> constraints;
618607 llvm::SmallPtrSet<TypeVariableType *, 4 > typeVars;
619608 llvm::SmallPtrSet<Constraint *, 8 > visitedConstraints;
620609
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+ }
633613
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;
636620
637621 // Local function to add constraints.
638622 auto addTypeVarConstraints = [&](TypeVariableType *adjTypeVar) {
0 commit comments