Skip to content

Commit 9dfeb0a

Browse files
committed
[CursorInfo] Fix a bug that caused incorrect discriminators to be assigned to values in completion-like cursor info
1 parent a5f85ee commit 9dfeb0a

File tree

2 files changed

+67
-10
lines changed

2 files changed

+67
-10
lines changed

lib/Sema/TypeCheckStmt.cpp

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,11 @@ namespace {
281281
// Otherwise, it'll have been separately type-checked.
282282
if (!CE->isSeparatelyTypeChecked()) {
283283
SetLocalDiscriminators innerVisitor;
284+
if (auto params = CE->getParameters()) {
285+
for (auto *param : *params) {
286+
innerVisitor.setLocalDiscriminator(param);
287+
}
288+
}
284289
CE->getBody()->walk(innerVisitor);
285290
}
286291

@@ -332,16 +337,22 @@ namespace {
332337

333338
/// Set the local discriminator for a named declaration.
334339
void setLocalDiscriminator(ValueDecl *valueDecl) {
335-
if (valueDecl->hasLocalDiscriminator() &&
336-
valueDecl->getRawLocalDiscriminator() ==
337-
ValueDecl::InvalidDiscriminator) {
338-
// Assign the next discriminator.
339-
Identifier name = valueDecl->getBaseIdentifier();
340-
auto &discriminator = DeclDiscriminators[name];
341-
if (discriminator < InitialDiscriminator)
342-
discriminator = InitialDiscriminator;
343-
344-
valueDecl->setLocalDiscriminator(discriminator++);
340+
if (valueDecl->hasLocalDiscriminator()) {
341+
if (valueDecl->getRawLocalDiscriminator() ==
342+
ValueDecl::InvalidDiscriminator) {
343+
// Assign the next discriminator.
344+
Identifier name = valueDecl->getBaseIdentifier();
345+
auto &discriminator = DeclDiscriminators[name];
346+
if (discriminator < InitialDiscriminator)
347+
discriminator = InitialDiscriminator;
348+
349+
valueDecl->setLocalDiscriminator(discriminator++);
350+
} else {
351+
// Assign the next discriminator.
352+
Identifier name = valueDecl->getBaseIdentifier();
353+
auto &discriminator = DeclDiscriminators[name];
354+
discriminator = std::max(discriminator, std::max(InitialDiscriminator, valueDecl->getLocalDiscriminator() + 1));
355+
}
345356
}
346357

347358
// If this is a property wrapper, check for projected storage.
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
func sink(_ a: (Int) -> Void) {}
2+
3+
func testSingleStatementClosure() {
4+
sink { items in
5+
// RUN: %sourcekitd-test -req=cursor -pos=%(line + 1):9 %s -- %s | %FileCheck %s --check-prefix=SINGLE-STMT-CLOSURE
6+
var items = items
7+
}
8+
// SINGLE-STMT-CLOSURE: s:13discriminator26testSingleStatementClosureyyFySiXEfU_5itemsL0_Sivp
9+
}
10+
11+
12+
func testMultiStatementClosure() {
13+
sink { items in
14+
// RUN: %sourcekitd-test -req=cursor -pos=%(line + 1):9 %s -- %s | %FileCheck %s --check-prefix=MULTI-STMT-CLOSURE
15+
var items = items
16+
print("xxx")
17+
}
18+
// MULTI-STMT-CLOSURE: s:13discriminator25testMultiStatementClosureyyFySiXEfU_5itemsL0_Sivp
19+
}
20+
21+
func testNestedClosures() {
22+
func dataTask(completionHandler: (Int?) -> Void) {}
23+
func async2(execute work: () -> Void) {}
24+
25+
dataTask { (error) in
26+
do {
27+
// RUN: %sourcekitd-test -req=cursor -pos=%(line + 1):17 %s -- %s | %FileCheck %s --check-prefix=NESTED_CLOSURE
28+
} catch let error {
29+
async2 {
30+
print("")
31+
}
32+
}
33+
}
34+
// NESTED_CLOSURE: s:13discriminator18testNestedClosuresyyFySiSgXEfU_5errorL1_s5Error_pvp
35+
}
36+
37+
func testReuseAST(bytes: Int) {
38+
// RUN: %sourcekitd-test -req=cursor -pos=%(line + 2):7 -req-opts=verifysolverbasedcursorinfo=1 %s -- %s == \
39+
// RUN: -req=cursor -pos=%(line + 2):7 -req-opts=verifysolverbasedcursorinfo=1 %s -- %s | %FileCheck %s --check-prefix=REUSE_AST
40+
let size = 3
41+
var bytes = 6
42+
// REUSE_AST: source.lang.swift.decl.var.local (40:7-40:11)
43+
// REUSE_AST: s:13discriminator12testReuseAST5bytesySi_tF4sizeL_Sivp
44+
// REUSE_AST: source.lang.swift.decl.var.local (41:7-41:12)
45+
// REUSE_AST: s:13discriminator12testReuseAST5bytesySi_tFACL0_Sivp
46+
}

0 commit comments

Comments
 (0)