Skip to content

Commit 4064ad1

Browse files
authored
Merge pull request #82966 from hamishknight/len-check
[Refactoring] Handle argument count mismatches in `renameLabelsLenient`
2 parents 5a02510 + 6a63f30 commit 4064ad1

File tree

2 files changed

+110
-6
lines changed

2 files changed

+110
-6
lines changed

lib/Refactoring/SyntacticRenameRangeDetails.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -283,12 +283,12 @@ bool RenameRangeDetailCollector::renameLabelsLenient(
283283
LabelRanges = LabelRanges.take_front(*FirstTrailingLabel);
284284

285285
for (auto LabelIndex : llvm::reverse(indices(TrailingLabels))) {
286+
if (OldNames.empty())
287+
return true;
288+
286289
CharSourceRange Label = TrailingLabels[LabelIndex];
287290

288291
if (Label.getByteLength()) {
289-
if (OldNames.empty())
290-
return true;
291-
292292
while (!labelRangeMatches(Label, LabelRangeType::CompoundName,
293293
OldNames.back())) {
294294
if ((OldNames = OldNames.drop_back()).empty())
@@ -302,9 +302,6 @@ bool RenameRangeDetailCollector::renameLabelsLenient(
302302

303303
// empty labelled trailing closure label
304304
if (LabelIndex) {
305-
if (OldNames.empty())
306-
return true;
307-
308305
while (!OldNames.back().empty()) {
309306
if ((OldNames = OldNames.drop_back()).empty())
310307
return true;
@@ -330,6 +327,8 @@ bool RenameRangeDetailCollector::renameLabelsLenient(
330327

331328
// first name pos
332329
if (!NameIndex) {
330+
if (NameIndex >= OldNames.size())
331+
return true;
333332
while (!OldNames[NameIndex].empty()) {
334333
if (++NameIndex >= OldNames.size())
335334
return true;
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: split-file %s %t
3+
// RUN: %sourcekitd-test -req=find-rename-ranges -rename-spec %t/spec.json %t/main.swift | %FileCheck %s
4+
5+
// REQUIRES: swift_swift_parser
6+
7+
//--- main.swift
8+
func foo() {}
9+
10+
// Make sure we don't crash on the unrelated comment refs:
11+
// foo()
12+
// foo(0)
13+
// foo(a: 0)
14+
// foo {}
15+
// foo {} a: {}
16+
17+
// Nor when written in code:
18+
foo()
19+
foo(0)
20+
foo(a: 0)
21+
foo {}
22+
foo {} a: {}
23+
24+
// CHECK: source.edit.kind.active:
25+
// CHECK-NEXT: 1:6-1:9 source.refactoring.range.kind.basename
26+
// CHECK-NEXT: source.edit.kind.comment:
27+
// CHECK-NEXT: 4:4-4:7 source.refactoring.range.kind.basename
28+
// CHECK-NEXT: source.edit.kind.unknown:
29+
// CHECK-NEXT: 5:4-5:7 source.refactoring.range.kind.basename
30+
// CHECK-NEXT: source.edit.kind.unknown:
31+
// CHECK-NEXT: 6:4-6:7 source.refactoring.range.kind.basename
32+
// CHECK-NEXT: source.edit.kind.unknown:
33+
// CHECK-NEXT: 7:4-7:7 source.refactoring.range.kind.basename
34+
// CHECK-NEXT: source.edit.kind.unknown:
35+
// CHECK-NEXT: 8:4-8:7 source.refactoring.range.kind.basename
36+
// CHECK-NEXT: source.edit.kind.active:
37+
// CHECK-NEXT: 11:1-11:4 source.refactoring.range.kind.basename
38+
// CHECK-NEXT: source.edit.kind.mismatch:
39+
// CHECK-NEXT: source.edit.kind.mismatch:
40+
// CHECK-NEXT: source.edit.kind.mismatch:
41+
// CHECK-NEXT: source.edit.kind.mismatch:
42+
43+
//--- spec.json
44+
[
45+
{
46+
"key.name": "foo()",
47+
"key.locations": [
48+
{
49+
"key.line": 1,
50+
"key.column": 6,
51+
"key.nametype": source.syntacticrename.definition
52+
},
53+
{
54+
"key.line": 4,
55+
"key.column": 4,
56+
"key.nametype": source.syntacticrename.unknown
57+
},
58+
{
59+
"key.line": 5,
60+
"key.column": 4,
61+
"key.nametype": source.syntacticrename.unknown
62+
},
63+
{
64+
"key.line": 6,
65+
"key.column": 4,
66+
"key.nametype": source.syntacticrename.unknown
67+
},
68+
{
69+
"key.line": 7,
70+
"key.column": 4,
71+
"key.nametype": source.syntacticrename.unknown
72+
},
73+
{
74+
"key.line": 8,
75+
"key.column": 4,
76+
"key.nametype": source.syntacticrename.unknown
77+
},
78+
{
79+
"key.line": 11,
80+
"key.column": 1,
81+
"key.nametype": source.syntacticrename.call
82+
},
83+
{
84+
"key.line": 12,
85+
"key.column": 1,
86+
"key.nametype": source.syntacticrename.call
87+
},
88+
{
89+
"key.line": 13,
90+
"key.column": 1,
91+
"key.nametype": source.syntacticrename.call
92+
},
93+
{
94+
"key.line": 14,
95+
"key.column": 1,
96+
"key.nametype": source.syntacticrename.call
97+
},
98+
{
99+
"key.line": 15,
100+
"key.column": 1,
101+
"key.nametype": source.syntacticrename.call
102+
},
103+
]
104+
}
105+
]

0 commit comments

Comments
 (0)