Skip to content

Commit 7f9e54d

Browse files
authored
Merge pull request #25913 from rintaro/sourcekit-completion-kind-rdar52352045
[SourceKit] Add completion kind field to completion response
2 parents cc668c2 + 9525f16 commit 7f9e54d

File tree

5 files changed

+123
-0
lines changed

5 files changed

+123
-0
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
enum Foo {
2+
case east, west
3+
case other(String)
4+
init(i: Int) {}
5+
init(s: String) {}
6+
static var instance: Foo { .east }
7+
static func create() -> Foo { .west }
8+
}
9+
10+
func test() -> Foo {
11+
return .
12+
}
13+
14+
// RUN: %sourcekitd-test -req=complete -pos=11:11 %s -- %s > %t.response
15+
// RUN: diff -u %s.response %t.response
16+
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
{
2+
key.results: [
3+
{
4+
key.kind: source.lang.swift.decl.function.method.class,
5+
key.name: "create()",
6+
key.sourcetext: "create()",
7+
key.description: "create()",
8+
key.typename: "Foo",
9+
key.context: source.codecompletion.context.thisclass,
10+
key.num_bytes_to_erase: 0,
11+
key.associated_usrs: "s:25complete_unresolvedmember3FooO6createACyFZ",
12+
key.modulename: "complete_unresolvedmember"
13+
},
14+
{
15+
key.kind: source.lang.swift.decl.enumelement,
16+
key.name: "east",
17+
key.sourcetext: "east",
18+
key.description: "east",
19+
key.typename: "Foo",
20+
key.context: source.codecompletion.context.exprspecific,
21+
key.num_bytes_to_erase: 0,
22+
key.associated_usrs: "s:25complete_unresolvedmember3FooO4eastyA2CmF",
23+
key.modulename: "complete_unresolvedmember"
24+
},
25+
{
26+
key.kind: source.lang.swift.decl.function.constructor,
27+
key.name: "init(i:)",
28+
key.sourcetext: "init(i: <#T##Int#>)",
29+
key.description: "init(i: Int)",
30+
key.typename: "Foo",
31+
key.context: source.codecompletion.context.thisclass,
32+
key.num_bytes_to_erase: 0,
33+
key.associated_usrs: "s:25complete_unresolvedmember3FooO1iACSi_tcfc",
34+
key.modulename: "complete_unresolvedmember"
35+
},
36+
{
37+
key.kind: source.lang.swift.decl.function.constructor,
38+
key.name: "init(s:)",
39+
key.sourcetext: "init(s: <#T##String#>)",
40+
key.description: "init(s: String)",
41+
key.typename: "Foo",
42+
key.context: source.codecompletion.context.thisclass,
43+
key.num_bytes_to_erase: 0,
44+
key.associated_usrs: "s:25complete_unresolvedmember3FooO1sACSS_tcfc",
45+
key.modulename: "complete_unresolvedmember"
46+
},
47+
{
48+
key.kind: source.lang.swift.decl.var.class,
49+
key.name: "instance",
50+
key.sourcetext: "instance",
51+
key.description: "instance",
52+
key.typename: "Foo",
53+
key.context: source.codecompletion.context.thisclass,
54+
key.num_bytes_to_erase: 0,
55+
key.associated_usrs: "s:25complete_unresolvedmember3FooO8instanceACvpZ",
56+
key.modulename: "complete_unresolvedmember"
57+
},
58+
{
59+
key.kind: source.lang.swift.decl.enumelement,
60+
key.name: "other()",
61+
key.sourcetext: "other(<#T##String#>)",
62+
key.description: "other(String)",
63+
key.typename: "Foo",
64+
key.context: source.codecompletion.context.exprspecific,
65+
key.num_bytes_to_erase: 0,
66+
key.associated_usrs: "s:25complete_unresolvedmember3FooO5otheryACSScACmF",
67+
key.modulename: "complete_unresolvedmember"
68+
},
69+
{
70+
key.kind: source.lang.swift.decl.enumelement,
71+
key.name: "west",
72+
key.sourcetext: "west",
73+
key.description: "west",
74+
key.typename: "Foo",
75+
key.context: source.codecompletion.context.exprspecific,
76+
key.num_bytes_to_erase: 0,
77+
key.associated_usrs: "s:25complete_unresolvedmember3FooO4westyA2CmF",
78+
key.modulename: "complete_unresolvedmember"
79+
}
80+
],
81+
key.kind: source.lang.swift.completion.unresolvedmember
82+
}

tools/SourceKit/include/SourceKit/Core/LangSupport.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ class CodeCompletionConsumer {
141141

142142
virtual void failed(StringRef ErrDescription) = 0;
143143

144+
virtual void setCompletionKind(UIdent kind) {};
144145
virtual bool handleResult(const CodeCompletionInfo &Info) = 0;
145146
};
146147

tools/SourceKit/lib/SwiftLang/SwiftCompletion.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,18 @@ struct SwiftCodeCompletionConsumer
105105
};
106106
} // anonymous namespace
107107

108+
/// Returns completion context kind \c UIdent to report to the client.
109+
/// For now, only returns "unresolved member" kind because others are unstable.
110+
/// Returns invalid \c UIents other cases.
111+
static UIdent getUIDForCodeCompletionKindToReport(CompletionKind kind) {
112+
switch (kind) {
113+
case CompletionKind::UnresolvedMember:
114+
return UIdent("source.lang.swift.completion.unresolvedmember");
115+
default:
116+
return UIdent();
117+
}
118+
}
119+
108120
static bool swiftCodeCompleteImpl(SwiftLangSupport &Lang,
109121
llvm::MemoryBuffer *UnresolvedInputFile,
110122
unsigned Offset,
@@ -205,6 +217,12 @@ void SwiftLangSupport::codeComplete(llvm::MemoryBuffer *UnresolvedInputFile,
205217
SwiftCodeCompletionConsumer SwiftConsumer([&](
206218
MutableArrayRef<CodeCompletionResult *> Results,
207219
SwiftCompletionInfo &info) {
220+
221+
auto kind = getUIDForCodeCompletionKindToReport(
222+
info.completionContext->CodeCompletionKind);
223+
if (kind.isValid())
224+
SKConsumer.setCompletionKind(kind);
225+
208226
bool hasRequiredType = info.completionContext->typeContextKind == TypeContextKind::Required;
209227
CodeCompletionContext::sortCompletionResults(Results);
210228
// FIXME: this adhoc filtering should be configurable like it is in the

tools/SourceKit/tools/sourcekitd/lib/API/Requests.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1835,6 +1835,7 @@ class SKCodeCompletionConsumer : public CodeCompletionConsumer {
18351835

18361836
void failed(StringRef ErrDescription) override;
18371837

1838+
void setCompletionKind(UIdent kind) override;
18381839
bool handleResult(const CodeCompletionInfo &Info) override;
18391840
};
18401841
} // end anonymous namespace
@@ -1853,6 +1854,11 @@ void SKCodeCompletionConsumer::failed(StringRef ErrDescription) {
18531854
ErrorDescription = ErrDescription;
18541855
}
18551856

1857+
void SKCodeCompletionConsumer::setCompletionKind(UIdent kind) {
1858+
assert(kind.isValid());
1859+
RespBuilder.getDictionary().set(KeyKind, kind);
1860+
}
1861+
18561862
bool SKCodeCompletionConsumer::handleResult(const CodeCompletionInfo &R) {
18571863
Optional<StringRef> ModuleNameOpt;
18581864
if (!R.ModuleName.empty())

0 commit comments

Comments
 (0)