@@ -22,7 +22,7 @@ using namespace swift;
2222using namespace swift ::ide;
2323
2424#if SWIFT_BUILD_SWIFT_SYNTAX
25- std::vector<ResolvedLoc >
25+ std::vector<ResolvedAndRenameLoc >
2626swift::ide::resolveRenameLocations (ArrayRef<RenameLoc> RenameLocs,
2727 StringRef NewName, SourceFile &SF,
2828 DiagnosticEngine &Diags) {
@@ -72,6 +72,8 @@ swift::ide::resolveRenameLocations(ArrayRef<RenameLoc> RenameLocs,
7272 UnresolvedLocs.push_back ({Location});
7373 }
7474
75+ assert (UnresolvedLocs.size () == RenameLocs.size ());
76+
7577 std::vector<BridgedSourceLoc> BridgedUnresolvedLocs;
7678 BridgedUnresolvedLocs.reserve (UnresolvedLocs.size ());
7779 for (SourceLoc Loc : UnresolvedLocs) {
@@ -85,26 +87,28 @@ swift::ide::resolveRenameLocations(ArrayRef<RenameLoc> RenameLocs,
8587 const std::vector<ResolvedLoc> &resolvedLocsInSourceOrder =
8688 bridgedResolvedLocs.takeUnbridged ();
8789
88- // Callers expect the resolved locs in the same order as the unresolved locs.
89- // Sort them.
90- // FIXME: (NameMatcher) Can we change the callers to not rely on this?
91- std::vector<ResolvedLoc> resolvedLocsInRequestedOrder;
92- for (SourceLoc unresolvedLoc : UnresolvedLocs) {
93- auto found =
94- llvm::find_if (resolvedLocsInSourceOrder,
95- [unresolvedLoc](const ResolvedLoc &resolved) {
96- return resolved.range .getStart () == unresolvedLoc;
97- });
90+ // Callers need to corrolate the `ResolvedLoc` with the `RenameLoc` that they
91+ // originated from. Match them.
92+ std::vector<ResolvedAndRenameLoc> resolvedAndRenameLocs;
93+ for (auto [unresolvedLoc, renameLoc] :
94+ llvm::zip_equal (UnresolvedLocs, RenameLocs)) {
95+ auto found = llvm::find_if (
96+ resolvedLocsInSourceOrder,
97+ [unresolvedLoc = unresolvedLoc](const ResolvedLoc &resolved) {
98+ return resolved.range .getStart () == unresolvedLoc;
99+ });
100+ ResolvedLoc resolvedLoc;
98101 if (found == resolvedLocsInSourceOrder.end ()) {
99- resolvedLocsInRequestedOrder. push_back (
102+ resolvedLoc =
100103 ResolvedLoc (CharSourceRange (),
101104 /* LabelRanges=*/ {}, llvm::None, LabelRangeType::None,
102- /* IsActive=*/ true , ResolvedLocContext::Comment)) ;
105+ /* IsActive=*/ true , ResolvedLocContext::Comment);
103106 } else {
104- resolvedLocsInRequestedOrder. push_back ( *found) ;
107+ resolvedLoc = *found;
105108 }
109+ resolvedAndRenameLocs.push_back ({renameLoc, resolvedLoc});
106110 }
107- return resolvedLocsInRequestedOrder ;
111+ return resolvedAndRenameLocs ;
108112}
109113#endif
110114
@@ -126,21 +130,19 @@ swift::ide::findSyntacticRenameRanges(SourceFile *SF,
126130 swift::PrintingDiagnosticConsumer DiagConsumer (DiagOS);
127131 DiagEngine.addConsumer (DiagConsumer);
128132
129- auto ResolvedLocs =
133+ auto ResolvedAndRenameLocs =
130134 resolveRenameLocations (RenameLocs, NewName, *SF, DiagEngine);
131- if (ResolvedLocs.size () != RenameLocs.size () || DiagConsumer.didErrorOccur ())
135+ if (ResolvedAndRenameLocs.size () != RenameLocs.size () ||
136+ DiagConsumer.didErrorOccur ())
132137 return ResultType::failure (ErrBuffer);
133138
134139 std::vector<SyntacticRenameRangeDetails> Result;
135- size_t index = 0 ;
136- for (const RenameLoc &Rename : RenameLocs) {
137- ResolvedLoc &Resolved = ResolvedLocs[index++];
138-
139- SyntacticRenameRangeDetails Details =
140- getSyntacticRenameRangeDetails (SM, Rename.OldName , Resolved, Rename);
140+ for (const ResolvedAndRenameLoc &Loc : ResolvedAndRenameLocs) {
141+ SyntacticRenameRangeDetails Details = getSyntacticRenameRangeDetails (
142+ SM, Loc.renameLoc .OldName , Loc.resolved , Loc.renameLoc );
141143 if (Details.Type == RegionType::Mismatch) {
142- DiagEngine.diagnose (Resolved. range .getStart (), diag::mismatched_rename ,
143- NewName);
144+ DiagEngine.diagnose (Loc. resolved . range .getStart (),
145+ diag::mismatched_rename, NewName);
144146 Result.emplace_back (SyntacticRenameRangeDetails{Details.Type , {}});
145147 } else {
146148 Result.push_back (Details);
0 commit comments