Skip to content

Commit 55ef1bc

Browse files
committed
[SourceKit] Print backticks if needed in printDisplayName
Ensure we print raw identifier names with backticks for e.g the document structure request. rdar://152524780
1 parent 7f7a5b1 commit 55ef1bc

11 files changed

+210
-13
lines changed

include/swift/AST/Identifier.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -663,8 +663,12 @@ class DeclName {
663663
///
664664
/// \param skipEmptyArgumentNames When true, don't print the argument labels
665665
/// if they are all empty.
666+
///
667+
/// \param escapeIfNeeded When true, escape identifiers with backticks
668+
/// when required.
666669
llvm::raw_ostream &print(llvm::raw_ostream &os,
667-
bool skipEmptyArgumentNames = false) const;
670+
bool skipEmptyArgumentNames = false,
671+
bool escapeIfNeeded = false) const;
668672

669673
/// Print a "pretty" representation of this declaration name to the given
670674
/// stream.

lib/AST/Identifier.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -166,9 +166,15 @@ StringRef DeclName::getString(llvm::SmallVectorImpl<char> &scratch,
166166
}
167167

168168
llvm::raw_ostream &DeclName::print(llvm::raw_ostream &os,
169-
bool skipEmptyArgumentNames) const {
169+
bool skipEmptyArgumentNames,
170+
bool escapeIfNeeded) const {
170171
// Print the base name.
171-
os << getBaseName();
172+
auto baseName = getBaseName();
173+
if (escapeIfNeeded && baseName.mustAlwaysBeEscaped()) {
174+
os << "`" << baseName << "`";
175+
} else {
176+
os << baseName;
177+
}
172178

173179
// If this is a simple name, we're done.
174180
if (isSimpleName())
@@ -193,8 +199,13 @@ llvm::raw_ostream &DeclName::print(llvm::raw_ostream &os,
193199

194200
// Print the argument names.
195201
os << "(";
196-
for (auto c : getArgumentNames()) {
197-
os << c << ':';
202+
for (auto argName : getArgumentNames()) {
203+
if (escapeIfNeeded && argName.mustAlwaysBeEscaped()) {
204+
os << "`" << argName << "`";
205+
} else {
206+
os << argName;
207+
}
208+
os << ':';
198209
}
199210
os << ")";
200211
return os;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
struct `A.B` {
2+
func `foo bar`(`a b`: Int, c: Int, `$`: String) {}
3+
func `3four`() {}
4+
func `baz`(`x`: Int) {}
5+
}
6+
extension `A.B` {}
7+
8+
struct Outer {
9+
struct Inner {}
10+
}
11+
extension Outer.Inner {}
12+
13+
func + (lhs: `A.B`, rhs: `A.B`) -> `A.B` { lhs }

test/SourceKit/DocumentStructure/structure.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
// RUN: %sourcekitd-test -req=structure %S/../Inputs/placeholders.swift | %sed_clean > %t.placeholders.response
88
// RUN: %diff -u %s.placeholders.response %t.placeholders.response
99

10+
// RUN: %sourcekitd-test -req=structure %S/Inputs/raw-identifiers.swift | %sed_clean > %t.raw-identifiers.swift.response
11+
// RUN: %diff -u %s.raw-identifiers.swift.response %t.raw-identifiers.swift.response
12+
1013
// RUN: %sourcekitd-test -req=structure %S/Inputs/main.swift -name -foobar | %sed_clean > %t.foobar.response
1114
// RUN: %diff -u %s.foobar.response %t.foobar.response
1215

test/SourceKit/DocumentStructure/structure.swift.empty.response

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1113,7 +1113,7 @@
11131113
key.kind: source.lang.swift.decl.var.global,
11141114
key.accessibility: source.lang.swift.accessibility.internal,
11151115
key.setter_accessibility: source.lang.swift.accessibility.internal,
1116-
key.name: "$",
1116+
key.name: "`$`",
11171117
key.offset: 1982,
11181118
key.length: 24,
11191119
key.nameoffset: 1999,

test/SourceKit/DocumentStructure/structure.swift.foobar.response

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1113,7 +1113,7 @@
11131113
key.kind: source.lang.swift.decl.var.global,
11141114
key.accessibility: source.lang.swift.accessibility.internal,
11151115
key.setter_accessibility: source.lang.swift.accessibility.internal,
1116-
key.name: "$",
1116+
key.name: "`$`",
11171117
key.offset: 1982,
11181118
key.length: 24,
11191119
key.nameoffset: 1999,

test/SourceKit/DocumentStructure/structure.swift.invalid.response

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
{
6161
key.kind: source.lang.swift.decl.class,
6262
key.accessibility: source.lang.swift.accessibility.internal,
63-
key.name: "3",
63+
key.name: "`3`",
6464
key.offset: 84,
6565
key.length: 10,
6666
key.nameoffset: 90,

test/SourceKit/DocumentStructure/structure.swift.placeholders.response

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
{
77
key.kind: source.lang.swift.decl.class,
88
key.accessibility: source.lang.swift.accessibility.internal,
9-
key.name: "<#MyCls#>",
9+
key.name: "`<#MyCls#>`",
1010
key.offset: 0,
1111
key.length: 35,
1212
key.nameoffset: 6,
@@ -29,7 +29,7 @@
2929
{
3030
key.kind: source.lang.swift.decl.function.free,
3131
key.accessibility: source.lang.swift.accessibility.internal,
32-
key.name: "<#test1#>()",
32+
key.name: "`<#test1#>`()",
3333
key.offset: 37,
3434
key.length: 52,
3535
key.nameoffset: 42,
@@ -56,7 +56,7 @@
5656
key.substructure: [
5757
{
5858
key.kind: source.lang.swift.decl.var.local,
59-
key.name: "<#name#>",
59+
key.name: "`<#name#>`",
6060
key.offset: 63,
6161
key.length: 8,
6262
key.nameoffset: 63,
Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
{
2+
key.offset: 0,
3+
key.length: 246,
4+
key.diagnostic_stage: source.diagnostic.stage.swift.parse,
5+
key.substructure: [
6+
{
7+
key.kind: source.lang.swift.decl.struct,
8+
key.accessibility: source.lang.swift.accessibility.internal,
9+
key.name: "`A.B`",
10+
key.offset: 0,
11+
key.length: 115,
12+
key.nameoffset: 7,
13+
key.namelength: 3,
14+
key.bodyoffset: 14,
15+
key.bodylength: 100,
16+
key.substructure: [
17+
{
18+
key.kind: source.lang.swift.decl.function.method.instance,
19+
key.accessibility: source.lang.swift.accessibility.internal,
20+
key.name: "`foo bar`(`a b`:c:`$`:)",
21+
key.offset: 17,
22+
key.length: 50,
23+
key.nameoffset: 22,
24+
key.namelength: 42,
25+
key.bodyoffset: 66,
26+
key.bodylength: 0,
27+
key.substructure: [
28+
{
29+
key.kind: source.lang.swift.decl.var.parameter,
30+
key.name: "`a b`",
31+
key.offset: 32,
32+
key.length: 10,
33+
key.typename: "Int",
34+
key.nameoffset: 32,
35+
key.namelength: 3
36+
},
37+
{
38+
key.kind: source.lang.swift.decl.var.parameter,
39+
key.name: "c",
40+
key.offset: 44,
41+
key.length: 6,
42+
key.typename: "Int",
43+
key.nameoffset: 44,
44+
key.namelength: 1
45+
},
46+
{
47+
key.kind: source.lang.swift.decl.var.parameter,
48+
key.name: "`$`",
49+
key.offset: 52,
50+
key.length: 11,
51+
key.typename: "String",
52+
key.nameoffset: 52,
53+
key.namelength: 1
54+
}
55+
]
56+
},
57+
{
58+
key.kind: source.lang.swift.decl.function.method.instance,
59+
key.accessibility: source.lang.swift.accessibility.internal,
60+
key.name: "`3four`()",
61+
key.offset: 70,
62+
key.length: 17,
63+
key.nameoffset: 75,
64+
key.namelength: 9,
65+
key.bodyoffset: 86,
66+
key.bodylength: 0
67+
},
68+
{
69+
key.kind: source.lang.swift.decl.function.method.instance,
70+
key.accessibility: source.lang.swift.accessibility.internal,
71+
key.name: "baz(x:)",
72+
key.offset: 90,
73+
key.length: 23,
74+
key.nameoffset: 95,
75+
key.namelength: 15,
76+
key.bodyoffset: 112,
77+
key.bodylength: 0,
78+
key.substructure: [
79+
{
80+
key.kind: source.lang.swift.decl.var.parameter,
81+
key.name: "x",
82+
key.offset: 101,
83+
key.length: 8,
84+
key.typename: "Int",
85+
key.nameoffset: 101,
86+
key.namelength: 1
87+
}
88+
]
89+
}
90+
]
91+
},
92+
{
93+
key.kind: source.lang.swift.decl.extension,
94+
key.name: "`A.B`",
95+
key.offset: 116,
96+
key.length: 18,
97+
key.nameoffset: 126,
98+
key.namelength: 5,
99+
key.bodyoffset: 133,
100+
key.bodylength: 0
101+
},
102+
{
103+
key.kind: source.lang.swift.decl.struct,
104+
key.accessibility: source.lang.swift.accessibility.internal,
105+
key.name: "Outer",
106+
key.offset: 136,
107+
key.length: 34,
108+
key.nameoffset: 143,
109+
key.namelength: 5,
110+
key.bodyoffset: 150,
111+
key.bodylength: 19,
112+
key.substructure: [
113+
{
114+
key.kind: source.lang.swift.decl.struct,
115+
key.accessibility: source.lang.swift.accessibility.internal,
116+
key.name: "Inner",
117+
key.offset: 153,
118+
key.length: 15,
119+
key.nameoffset: 160,
120+
key.namelength: 5,
121+
key.bodyoffset: 167,
122+
key.bodylength: 0
123+
}
124+
]
125+
},
126+
{
127+
key.kind: source.lang.swift.decl.extension,
128+
key.name: "Outer.Inner",
129+
key.offset: 171,
130+
key.length: 24,
131+
key.nameoffset: 181,
132+
key.namelength: 11,
133+
key.bodyoffset: 194,
134+
key.bodylength: 0
135+
},
136+
{
137+
key.kind: source.lang.swift.decl.function.free,
138+
key.accessibility: source.lang.swift.accessibility.internal,
139+
key.name: "+(_:_:)",
140+
key.offset: 197,
141+
key.length: 48,
142+
key.typename: "`A.B`",
143+
key.nameoffset: 202,
144+
key.namelength: 26,
145+
key.bodyoffset: 239,
146+
key.bodylength: 5,
147+
key.substructure: [
148+
{
149+
key.kind: source.lang.swift.decl.var.parameter,
150+
key.name: "lhs",
151+
key.offset: 205,
152+
key.length: 10,
153+
key.typename: "`A.B`"
154+
},
155+
{
156+
key.kind: source.lang.swift.decl.var.parameter,
157+
key.name: "rhs",
158+
key.offset: 217,
159+
key.length: 10,
160+
key.typename: "`A.B`"
161+
}
162+
]
163+
}
164+
]
165+
}

test/SourceKit/DocumentStructure/structure.swift.response

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1113,7 +1113,7 @@
11131113
key.kind: source.lang.swift.decl.var.global,
11141114
key.accessibility: source.lang.swift.accessibility.internal,
11151115
key.setter_accessibility: source.lang.swift.accessibility.internal,
1116-
key.name: "$",
1116+
key.name: "`$`",
11171117
key.offset: 1982,
11181118
key.length: 24,
11191119
key.nameoffset: 1999,

0 commit comments

Comments
 (0)