Skip to content

Commit 38648ec

Browse files
authored
Merge pull request #60328 from ahoppen/pr/nil-highlighting-in-case
[SourceKit] Don’t provide incorrect semantic highlighting of `nil` in case statements as enum decl element
2 parents bd8ebcf + 1e9eac6 commit 38648ec

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
func foo(o: Int?) {
2+
switch o {
3+
case nil:
4+
break
5+
case .none:
6+
break
7+
}
8+
}
9+
10+
11+
// RUN: %sourcekitd-test -req=open %s -- %s == -req=print-annotations %s -- %s | %FileCheck %s
12+
13+
// CHECK: [
14+
// CHECK-NEXT: {
15+
// CHECK-NEXT: key.kind: source.lang.swift.ref.struct,
16+
// CHECK-NEXT: key.offset: 12,
17+
// CHECK-NEXT: key.length: 3,
18+
// CHECK-NEXT: key.is_system: 1
19+
// CHECK-NEXT: },
20+
// CHECK-NEXT: {
21+
// CHECK-NEXT: key.kind: source.lang.swift.ref.var.local,
22+
// CHECK-NEXT: key.offset: 29,
23+
// CHECK-NEXT: key.length: 1
24+
// CHECK-NEXT: },
25+
// CHECK-NEXT: {
26+
// CHECK-NEXT: key.kind: source.lang.swift.ref.enumelement,
27+
// CHECK-NEXT: key.offset: 63,
28+
// CHECK-NEXT: key.length: 4,
29+
// CHECK-NEXT: key.is_system: 1
30+
// CHECK-NEXT: }
31+
// CHECK-NEXT: ]

tools/SourceKit/lib/SwiftLang/SwiftEditor.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -963,6 +963,15 @@ class SemanticAnnotator : public SourceEntityWalker {
963963
if (AvailableAttr::isUnavailable(D))
964964
return true;
965965

966+
auto &SM = D->getASTContext().SourceMgr;
967+
if (D == D->getASTContext().getOptionalNoneDecl() &&
968+
SM.extractText(Range, BufferID) == "nil") {
969+
// If a 'nil' literal occurs in a swift-case statement, it gets replaced
970+
// by a reference to 'Optional.none' in the AST. We want to continue
971+
// highlighting 'nil' as a keyword and not as an enum element.
972+
return true;
973+
}
974+
966975
if (CtorTyRef)
967976
D = CtorTyRef;
968977
annotate(D, /*IsRef=*/true, Range);

0 commit comments

Comments
 (0)