@@ -855,11 +855,14 @@ getCalleeDeclAndArgs(ConstraintSystem &cs,
855855
856856class ArgumentFailureTracker : public MatchCallArgumentListener {
857857 ConstraintSystem &CS;
858+ SmallVectorImpl<ParamBinding> &Bindings;
858859 ConstraintLocatorBuilder Locator;
859860
860861public:
861- ArgumentFailureTracker (ConstraintSystem &cs, ConstraintLocatorBuilder locator)
862- : CS(cs), Locator(locator) {}
862+ ArgumentFailureTracker (ConstraintSystem &cs,
863+ SmallVectorImpl<ParamBinding> &bindings,
864+ ConstraintLocatorBuilder locator)
865+ : CS(cs), Bindings(bindings), Locator(locator) {}
863866
864867 bool missingLabel (unsigned paramIndex) override {
865868 return !CS.shouldAttemptFixes ();
@@ -873,6 +876,16 @@ class ArgumentFailureTracker : public MatchCallArgumentListener {
873876 return !CS.shouldAttemptFixes ();
874877 }
875878
879+ bool outOfOrderArgument (unsigned argIdx, unsigned prevArgIdx) override {
880+ if (CS.shouldAttemptFixes ()) {
881+ auto *fix = MoveOutOfOrderArgument::create (
882+ CS, argIdx, prevArgIdx, Bindings, CS.getConstraintLocator (Locator));
883+ return CS.recordFix (fix);
884+ }
885+
886+ return true ;
887+ }
888+
876889 bool relabelArguments (ArrayRef<Identifier> newLabels) override {
877890 if (!CS.shouldAttemptFixes ())
878891 return true ;
@@ -940,8 +953,8 @@ ConstraintSystem::TypeMatchResult constraints::matchCallArguments(
940953 }
941954
942955 // Match up the call arguments to the parameters.
943- ArgumentFailureTracker listener (cs, locator);
944956 SmallVector<ParamBinding, 4 > parameterBindings;
957+ ArgumentFailureTracker listener (cs, parameterBindings, locator);
945958 if (constraints::matchCallArguments (argsWithLabels, params,
946959 defaultMap,
947960 hasTrailingClosure,
@@ -6022,6 +6035,7 @@ ConstraintSystem::SolutionKind ConstraintSystem::simplifyFixConstraint(
60226035 case FixKind::AllowInvalidPartialApplication:
60236036 case FixKind::AllowInvalidInitRef:
60246037 case FixKind::AllowClosureParameterDestructuring:
6038+ case FixKind::MoveOutOfOrderArgument:
60256039 llvm_unreachable (" handled elsewhere" );
60266040 }
60276041
0 commit comments