@@ -22,7 +22,7 @@ using namespace swift;
22
22
using namespace swift ::ide;
23
23
24
24
#if SWIFT_BUILD_SWIFT_SYNTAX
25
- std::vector<ResolvedLoc >
25
+ std::vector<ResolvedAndRenameLoc >
26
26
swift::ide::resolveRenameLocations (ArrayRef<RenameLoc> RenameLocs,
27
27
StringRef NewName, SourceFile &SF,
28
28
DiagnosticEngine &Diags) {
@@ -72,6 +72,8 @@ swift::ide::resolveRenameLocations(ArrayRef<RenameLoc> RenameLocs,
72
72
UnresolvedLocs.push_back ({Location});
73
73
}
74
74
75
+ assert (UnresolvedLocs.size () == RenameLocs.size ());
76
+
75
77
std::vector<BridgedSourceLoc> BridgedUnresolvedLocs;
76
78
BridgedUnresolvedLocs.reserve (UnresolvedLocs.size ());
77
79
for (SourceLoc Loc : UnresolvedLocs) {
@@ -85,26 +87,28 @@ swift::ide::resolveRenameLocations(ArrayRef<RenameLoc> RenameLocs,
85
87
const std::vector<ResolvedLoc> &resolvedLocsInSourceOrder =
86
88
bridgedResolvedLocs.takeUnbridged ();
87
89
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;
98
101
if (found == resolvedLocsInSourceOrder.end ()) {
99
- resolvedLocsInRequestedOrder. push_back (
102
+ resolvedLoc =
100
103
ResolvedLoc (CharSourceRange (),
101
104
/* LabelRanges=*/ {}, llvm::None, LabelRangeType::None,
102
- /* IsActive=*/ true , ResolvedLocContext::Comment)) ;
105
+ /* IsActive=*/ true , ResolvedLocContext::Comment);
103
106
} else {
104
- resolvedLocsInRequestedOrder. push_back ( *found) ;
107
+ resolvedLoc = *found;
105
108
}
109
+ resolvedAndRenameLocs.push_back ({renameLoc, resolvedLoc});
106
110
}
107
- return resolvedLocsInRequestedOrder ;
111
+ return resolvedAndRenameLocs ;
108
112
}
109
113
#endif
110
114
@@ -126,21 +130,19 @@ swift::ide::findSyntacticRenameRanges(SourceFile *SF,
126
130
swift::PrintingDiagnosticConsumer DiagConsumer (DiagOS);
127
131
DiagEngine.addConsumer (DiagConsumer);
128
132
129
- auto ResolvedLocs =
133
+ auto ResolvedAndRenameLocs =
130
134
resolveRenameLocations (RenameLocs, NewName, *SF, DiagEngine);
131
- if (ResolvedLocs.size () != RenameLocs.size () || DiagConsumer.didErrorOccur ())
135
+ if (ResolvedAndRenameLocs.size () != RenameLocs.size () ||
136
+ DiagConsumer.didErrorOccur ())
132
137
return ResultType::failure (ErrBuffer);
133
138
134
139
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 );
141
143
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);
144
146
Result.emplace_back (SyntacticRenameRangeDetails{Details.Type , {}});
145
147
} else {
146
148
Result.push_back (Details);
0 commit comments