Skip to content

Commit a9a840c

Browse files
committed
Provide Data Types in Document Outline; Provide Code Documentation in CompletionItem
1 parent 0d19d7d commit a9a840c

File tree

5 files changed

+23
-17
lines changed

5 files changed

+23
-17
lines changed

Sources/LanguageServerProtocol/SupportTypes/CompletionItem.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ public struct CompletionItem: Codable, Hashable {
6363
{
6464
self.label = label
6565
self.detail = detail
66+
self.documentation = documentation
6667
self.sortText = sortText
6768
self.filterText = filterText
6869
self.textEdit = textEdit

Sources/SourceKitLSP/Swift/CodeCompletion.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ extension SwiftLanguageServer {
137137
var filterName: String? = value[self.keys.name]
138138
let insertText: String? = value[self.keys.sourcetext]
139139
let typeName: String? = value[self.keys.typename]
140+
let docBrief: String? = value[self.keys.doc_brief]
140141

141142
let clientCompletionCapabilities = self.clientCapabilities.textDocument?.completion
142143
let clientSupportsSnippets = clientCompletionCapabilities?.completionItem?.snippetSupport == true
@@ -173,6 +174,7 @@ extension SwiftLanguageServer {
173174
label: name,
174175
kind: kind?.asCompletionItemKind(self.values) ?? .value,
175176
detail: typeName,
177+
documentation: docBrief != nil ? .markupContent(MarkupContent(kind: .markdown, value: docBrief!)) : nil,
176178
sortText: nil,
177179
filterText: filterName,
178180
textEdit: textEdit,

Sources/SourceKitLSP/Swift/SwiftLanguageServer.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -564,7 +564,7 @@ extension SwiftLanguageServer {
564564
children = nil
565565
}
566566
return DocumentSymbol(name: name,
567-
detail: nil,
567+
detail: value[self.keys.typename] as String?,
568568
kind: kind,
569569
deprecated: nil,
570570
range: range,

Tests/SourceKitLSPTests/DocumentSymbolTests.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ func initialize(capabilities: DocumentSymbolCapabilities) {
422422
),
423423
DocumentSymbol(
424424
name: "computedVariable",
425-
detail: nil,
425+
detail: "Int",
426426
kind: .variable,
427427
deprecated: nil,
428428
range: range(from: (10, 0), to: (10, 38)),
@@ -540,7 +540,7 @@ func initialize(capabilities: DocumentSymbolCapabilities) {
540540
),
541541
DocumentSymbol(
542542
name: "computedProperty",
543-
detail: nil,
543+
detail: "Int",
544544
kind: .property,
545545
deprecated: nil,
546546
range: range(from: (21, 2), to: (21, 40)),
@@ -576,7 +576,7 @@ func initialize(capabilities: DocumentSymbolCapabilities) {
576576
),
577577
DocumentSymbol(
578578
name: "staticComputedProperty",
579-
detail: nil,
579+
detail: "Int",
580580
kind: .property,
581581
deprecated: nil,
582582
range: range(from: (25, 2), to: (25, 53)),
@@ -585,7 +585,7 @@ func initialize(capabilities: DocumentSymbolCapabilities) {
585585
),
586586
DocumentSymbol(
587587
name: "classProperty",
588-
detail: nil,
588+
detail: "Int",
589589
kind: .property,
590590
deprecated: nil,
591591
range: range(from: (26, 2), to: (26, 43)),
@@ -620,7 +620,7 @@ func initialize(capabilities: DocumentSymbolCapabilities) {
620620
),
621621
DocumentSymbol(
622622
name: "localComputedVariable",
623-
detail: nil,
623+
detail: "Int",
624624
kind: .variable,
625625
deprecated: nil,
626626
range: range(from: (30, 4), to: (30, 47)),

Tests/SourceKitLSPTests/SwiftCompletionTests.swift

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ final class SwiftCompletionTests: XCTestCase {
2323
/// Base document text to use for completion tests.
2424
let text: String = """
2525
struct S {
26+
/// Documentation for `abc`.
2627
var abc: Int
2728
2829
func test(a: Int) {
@@ -103,7 +104,7 @@ final class SwiftCompletionTests: XCTestCase {
103104

104105
let selfDot = try! sk.sendSync(CompletionRequest(
105106
textDocument: TextDocumentIdentifier(url),
106-
position: Position(line: 4, utf16index: 9)))
107+
position: Position(line: 5, utf16index: 9)))
107108

108109
XCTAssertEqual(selfDot.isIncomplete, options.serverSideFiltering)
109110
XCTAssertGreaterThanOrEqual(selfDot.items.count, 2)
@@ -112,16 +113,17 @@ final class SwiftCompletionTests: XCTestCase {
112113
if let abc = abc {
113114
XCTAssertEqual(abc.kind, .property)
114115
XCTAssertEqual(abc.detail, "Int")
116+
XCTAssertEqual(abc.documentation, .markupContent(MarkupContent(kind: .markdown, value: "Documentation for abc.")))
115117
XCTAssertEqual(abc.filterText, "abc")
116-
XCTAssertEqual(abc.textEdit, TextEdit(range: Position(line: 4, utf16index: 9)..<Position(line: 4, utf16index: 9), newText: "abc"))
118+
XCTAssertEqual(abc.textEdit, TextEdit(range: Position(line: 5, utf16index: 9)..<Position(line: 5, utf16index: 9), newText: "abc"))
117119
XCTAssertEqual(abc.insertText, "abc")
118120
XCTAssertEqual(abc.insertTextFormat, .plain)
119121
}
120122

121123
for col in 10...12 {
122124
let inIdent = try! sk.sendSync(CompletionRequest(
123125
textDocument: TextDocumentIdentifier(url),
124-
position: Position(line: 4, utf16index: col)))
126+
position: Position(line: 5, utf16index: col)))
125127
guard let abc = inIdent.items.first(where: { $0.label == "abc" }) else {
126128
XCTFail("No completion item with label 'abc'")
127129
return
@@ -130,15 +132,16 @@ final class SwiftCompletionTests: XCTestCase {
130132
// If we switch to server-side filtering this will change.
131133
XCTAssertEqual(abc.kind, .property)
132134
XCTAssertEqual(abc.detail, "Int")
135+
XCTAssertEqual(abc.documentation, .markupContent(MarkupContent(kind: .markdown, value: "Documentation for abc.")))
133136
XCTAssertEqual(abc.filterText, "abc")
134-
XCTAssertEqual(abc.textEdit, TextEdit(range: Position(line: 4, utf16index: 9)..<Position(line: 4, utf16index: col), newText: "abc"))
137+
XCTAssertEqual(abc.textEdit, TextEdit(range: Position(line: 5, utf16index: 9)..<Position(line: 5, utf16index: col), newText: "abc"))
135138
XCTAssertEqual(abc.insertText, "abc")
136139
XCTAssertEqual(abc.insertTextFormat, .plain)
137140
}
138141

139142
let after = try! sk.sendSync(CompletionRequest(
140143
textDocument: TextDocumentIdentifier(url),
141-
position: Position(line: 5, utf16index: 0)))
144+
position: Position(line: 6, utf16index: 0)))
142145
XCTAssertNotEqual(after, selfDot)
143146
}
144147

@@ -158,11 +161,11 @@ final class SwiftCompletionTests: XCTestCase {
158161
}
159162

160163
func getTestMethodACompletion() -> CompletionItem? {
161-
return getTestMethodCompletion(Position(line: 4, utf16index: 9), label: "test(a: Int)")
164+
return getTestMethodCompletion(Position(line: 5, utf16index: 9), label: "test(a: Int)")
162165
}
163166

164167
func getTestMethodBCompletion() -> CompletionItem? {
165-
return getTestMethodCompletion(Position(line: 8, utf16index: 9), label: "test(b: Int)")
168+
return getTestMethodCompletion(Position(line: 9, utf16index: 9), label: "test(b: Int)")
166169
}
167170

168171
var test = getTestMethodACompletion()
@@ -171,7 +174,7 @@ final class SwiftCompletionTests: XCTestCase {
171174
XCTAssertEqual(test.kind, .method)
172175
XCTAssertEqual(test.detail, "Void")
173176
XCTAssertEqual(test.filterText, "test(a:)")
174-
XCTAssertEqual(test.textEdit, TextEdit(range: Position(line: 4, utf16index: 9)..<Position(line: 4, utf16index: 9), newText: "test(a: ${1:Int})"))
177+
XCTAssertEqual(test.textEdit, TextEdit(range: Position(line: 5, utf16index: 9)..<Position(line: 5, utf16index: 9), newText: "test(a: ${1:Int})"))
175178
XCTAssertEqual(test.insertText, "test(a: ${1:Int})")
176179
XCTAssertEqual(test.insertTextFormat, .snippet)
177180
}
@@ -182,7 +185,7 @@ final class SwiftCompletionTests: XCTestCase {
182185
XCTAssertEqual(test.kind, .method)
183186
XCTAssertEqual(test.detail, "Void")
184187
XCTAssertEqual(test.filterText, "test(:)")
185-
XCTAssertEqual(test.textEdit, TextEdit(range: Position(line: 8, utf16index: 9)..<Position(line: 8, utf16index: 9), newText: "test(${1:b: Int})"))
188+
XCTAssertEqual(test.textEdit, TextEdit(range: Position(line: 9, utf16index: 9)..<Position(line: 9, utf16index: 9), newText: "test(${1:b: Int})"))
186189
XCTAssertEqual(test.insertText, "test(${1:b: Int})")
187190
XCTAssertEqual(test.insertTextFormat, .snippet)
188191
}
@@ -198,7 +201,7 @@ final class SwiftCompletionTests: XCTestCase {
198201
XCTAssertEqual(test.kind, .method)
199202
XCTAssertEqual(test.detail, "Void")
200203
XCTAssertEqual(test.filterText, "test(a:)")
201-
XCTAssertEqual(test.textEdit, TextEdit(range: Position(line: 4, utf16index: 9)..<Position(line: 4, utf16index: 9), newText: "test(a: )"))
204+
XCTAssertEqual(test.textEdit, TextEdit(range: Position(line: 5, utf16index: 9)..<Position(line: 5, utf16index: 9), newText: "test(a: )"))
202205
XCTAssertEqual(test.insertText, "test(a: )")
203206
XCTAssertEqual(test.insertTextFormat, .plain)
204207
}
@@ -210,7 +213,7 @@ final class SwiftCompletionTests: XCTestCase {
210213
XCTAssertEqual(test.detail, "Void")
211214
XCTAssertEqual(test.filterText, "test(:)")
212215
// FIXME:
213-
XCTAssertEqual(test.textEdit, TextEdit(range: Position(line: 8, utf16index: 9)..<Position(line: 8, utf16index: 9), newText: "test()"))
216+
XCTAssertEqual(test.textEdit, TextEdit(range: Position(line: 9, utf16index: 9)..<Position(line: 9, utf16index: 9), newText: "test()"))
214217
XCTAssertEqual(test.insertText, "test()")
215218
XCTAssertEqual(test.insertTextFormat, .plain)
216219
}

0 commit comments

Comments
 (0)