mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
[IDE][Refactoring] Update syntactic rename to support braceless multiple trailing closures.
This commit is contained in:
committed by
John McCall
parent
58859f5699
commit
78b7bce3a0
@@ -108,10 +108,12 @@ public:
|
||||
/// Adds replacements to rename the given label ranges
|
||||
/// \return true if the label ranges do not match the old name
|
||||
bool renameLabels(ArrayRef<CharSourceRange> LabelRanges,
|
||||
Optional<unsigned> FirstTrailingLabel,
|
||||
LabelRangeType RangeType, bool isCallSite) {
|
||||
if (isCallSite)
|
||||
return renameLabelsLenient(LabelRanges, RangeType);
|
||||
return renameLabelsLenient(LabelRanges, FirstTrailingLabel, RangeType);
|
||||
|
||||
assert(!FirstTrailingLabel);
|
||||
ArrayRef<StringRef> OldLabels = Old.args();
|
||||
|
||||
if (OldLabels.size() != LabelRanges.size())
|
||||
@@ -261,10 +263,56 @@ private:
|
||||
}
|
||||
|
||||
bool renameLabelsLenient(ArrayRef<CharSourceRange> LabelRanges,
|
||||
Optional<unsigned> FirstTrailingLabel,
|
||||
LabelRangeType RangeType) {
|
||||
|
||||
ArrayRef<StringRef> OldNames = Old.args();
|
||||
|
||||
// First, match trailing closure arguments in reverse
|
||||
if (FirstTrailingLabel) {
|
||||
auto TrailingLabels = LabelRanges.drop_front(*FirstTrailingLabel);
|
||||
LabelRanges = LabelRanges.take_front(*FirstTrailingLabel);
|
||||
|
||||
for (auto LabelIndex: llvm::reverse(indices(TrailingLabels))) {
|
||||
CharSourceRange Label = TrailingLabels[LabelIndex];
|
||||
|
||||
if (Label.getByteLength()) {
|
||||
if (OldNames.empty())
|
||||
return true;
|
||||
|
||||
while (!labelRangeMatches(Label, LabelRangeType::Selector,
|
||||
OldNames.back())) {
|
||||
if ((OldNames = OldNames.drop_back()).empty())
|
||||
return true;
|
||||
}
|
||||
splitAndRenameLabel(Label, LabelRangeType::Selector,
|
||||
OldNames.size() - 1);
|
||||
OldNames = OldNames.drop_back();
|
||||
continue;
|
||||
}
|
||||
|
||||
// empty labelled trailing closure label
|
||||
if (LabelIndex) {
|
||||
if (OldNames.empty())
|
||||
return true;
|
||||
|
||||
while (!OldNames.back().empty()) {
|
||||
if ((OldNames = OldNames.drop_back()).empty())
|
||||
return true;
|
||||
}
|
||||
splitAndRenameLabel(Label, LabelRangeType::Selector,
|
||||
OldNames.size() - 1);
|
||||
OldNames = OldNames.drop_back();
|
||||
continue;
|
||||
}
|
||||
|
||||
// unlabelled trailing closure label
|
||||
OldNames = OldNames.drop_back();
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// Next, match the non-trailing arguments.
|
||||
size_t NameIndex = 0;
|
||||
|
||||
for (CharSourceRange Label : LabelRanges) {
|
||||
@@ -399,7 +447,8 @@ public:
|
||||
(Config.Usage != NameUsage::Reference || IsSubscript) &&
|
||||
Resolved.LabelType == LabelRangeType::CallArg;
|
||||
|
||||
if (renameLabels(Resolved.LabelRanges, Resolved.LabelType, isCallSite))
|
||||
if (renameLabels(Resolved.LabelRanges, Resolved.FirstTrailingLabel,
|
||||
Resolved.LabelType, isCallSite))
|
||||
return Config.Usage == NameUsage::Unknown ?
|
||||
RegionType::Unmatched : RegionType::Mismatch;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user