Skip to content

Commit 0bcd943

Browse files
committed
Use raw documentation for full documentation in completion
1 parent 61b8194 commit 0bcd943

File tree

8 files changed

+60
-25
lines changed

8 files changed

+60
-25
lines changed

Sources/Csourcekitd/include/CodeCompletionSwiftInterop.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -324,11 +324,15 @@ typedef struct {
324324
void (^_Null_unspecified handler)(const char *_Null_unspecified)
325325
);
326326

327-
void (*_Nullable completion_item_get_doc_full)(
328-
_Nonnull swiftide_api_completion_response_t,
329-
_Nonnull swiftide_api_completion_item_t,
330-
void (^_Nonnull handler)(const char *_Nullable)
331-
);
327+
void (*_Nullable completion_item_get_doc_full_as_xml)(
328+
_Nonnull swiftide_api_completion_response_t,
329+
_Nonnull swiftide_api_completion_item_t,
330+
void (^_Nonnull handler)(const char *_Nullable));
331+
332+
void (*_Nullable completion_item_get_doc_raw)(
333+
_Nonnull swiftide_api_completion_response_t,
334+
_Nonnull swiftide_api_completion_item_t,
335+
void (^_Nonnull handler)(const char *_Nullable));
332336

333337
void (*_Nonnull completion_item_get_associated_usrs)(
334338
_Null_unspecified swiftide_api_completion_response_t,

Sources/SKTestSupport/SkipUnless.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ package actor SkipUnless {
278278
return try await shared.skipUnlessSupportedByToolchain(swiftVersion: SwiftVersion(6, 2), file: file, line: line) {
279279
let sourcekitd = try await getSourceKitD()
280280

281-
return sourcekitd.ideApi.completion_item_get_doc_full != nil
281+
return sourcekitd.ideApi.completion_item_get_doc_raw != nil
282282
}
283283
}
284284

Sources/SourceKitD/sourcekitd_functions.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,8 @@ extension sourcekitd_ide_api_functions_t {
146146
completion_item_get_source_text: try loadRequired("swiftide_completion_item_get_source_text"),
147147
completion_item_get_type_name: try loadRequired("swiftide_completion_item_get_type_name"),
148148
completion_item_get_doc_brief: try loadRequired("swiftide_completion_item_get_doc_brief"),
149-
completion_item_get_doc_full: loadOptional("swiftide_completion_item_get_doc_full"),
149+
completion_item_get_doc_full_as_xml: loadOptional("swiftide_completion_item_get_doc_full_as_xml"),
150+
completion_item_get_doc_raw: loadOptional("swiftide_completion_item_get_doc_raw"),
150151
completion_item_get_associated_usrs: try loadRequired("swiftide_completion_item_get_associated_usrs"),
151152
completion_item_get_kind: try loadRequired("swiftide_completion_item_get_kind"),
152153
completion_item_get_associated_kind: try loadRequired("swiftide_completion_item_get_associated_kind"),

Sources/SwiftLanguageService/CodeCompletionSession.swift

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -586,10 +586,8 @@ class CodeCompletionSession {
586586
}
587587

588588
private static func documentationString(from response: SKDResponseDictionary, sourcekitd: SourceKitD) -> String? {
589-
if let docFullAsXML: String = response[sourcekitd.keys.docFullAsXML] {
590-
return orLog("Converting XML documentation to markdown") {
591-
try xmlDocumentationToMarkdown(docFullAsXML)
592-
}
589+
if let docComment: String = response[sourcekitd.keys.docComment] {
590+
return docComment
593591
}
594592

595593
return response[sourcekitd.keys.docBrief]

Sources/SwiftSourceKitPlugin/ASTCompletion/CompletionSession.swift

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,9 +241,19 @@ struct ExtendedCompletionInfo {
241241
return result
242242
}
243243

244-
var fullDocumentation: String? {
244+
var fullDocumentationAsXML: String? {
245245
var result: String? = nil
246-
session.sourcekitd.ideApi.completion_item_get_doc_full?(session.response, rawItem) {
246+
session.sourcekitd.ideApi.completion_item_get_doc_full_as_xml?(session.response, rawItem) {
247+
if let cstr = $0 {
248+
result = String(cString: cstr)
249+
}
250+
}
251+
return result
252+
}
253+
254+
var rawDocumentation: String? {
255+
var result: String? = nil
256+
session.sourcekitd.ideApi.completion_item_get_doc_raw?(session.response, rawItem) {
247257
if let cstr = $0 {
248258
result = String(cString: cstr)
249259
}

Sources/SwiftSourceKitPlugin/CompletionProvider.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,8 @@ actor CompletionProvider {
266266

267267
return request.sourcekitd.responseDictionary([
268268
request.sourcekitd.keys.docBrief: info.briefDocumentation,
269-
request.sourcekitd.keys.docFullAsXML: info.fullDocumentation,
269+
request.sourcekitd.keys.docFullAsXML: info.fullDocumentationAsXML,
270+
request.sourcekitd.keys.docComment: info.rawDocumentation,
270271
request.sourcekitd.keys.associatedUSRs: info.associatedUSRs as [SKDResponseValue]?,
271272
])
272273
}

Tests/SourceKitLSPTests/SwiftCompletionTests.swift

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,13 @@ final class SwiftCompletionTests: XCTestCase {
4040
"""
4141
struct S {
4242
/// Documentation for `abc`.
43+
///
44+
/// _More_ documentation for `abc`.
45+
///
46+
/// Usage:
47+
/// ```swift
48+
/// S().abc
49+
/// ```
4350
var abc: Int
4451
4552
func test(a: Int) {
@@ -71,10 +78,14 @@ final class SwiftCompletionTests: XCTestCase {
7178
assertMarkdown(
7279
documentation: abc.documentation,
7380
expected: """
81+
Documentation for `abc`.
82+
83+
_More_ documentation for `abc`.
84+
85+
Usage:
7486
```swift
75-
var abc: Int
87+
S().abc
7688
```
77-
Documentation for `abc`.
7889
"""
7990
)
8091
XCTAssertEqual(abc.filterText, "abc")
@@ -99,10 +110,14 @@ final class SwiftCompletionTests: XCTestCase {
99110
assertMarkdown(
100111
documentation: abc.documentation,
101112
expected: """
113+
Documentation for `abc`.
114+
115+
_More_ documentation for `abc`.
116+
117+
Usage:
102118
```swift
103-
var abc: Int
119+
S().abc
104120
```
105-
Documentation for `abc`.
106121
"""
107122
)
108123
XCTAssertEqual(abc.filterText, "abc")
@@ -1207,12 +1222,7 @@ final class SwiftCompletionTests: XCTestCase {
12071222
let resolvedItem = try await testClient.send(CompletionItemResolveRequest(item: item))
12081223
assertMarkdown(
12091224
documentation: resolvedItem.documentation,
1210-
expected: """
1211-
```swift
1212-
func makeBool() -> Bool
1213-
```
1214-
Creates a true value
1215-
"""
1225+
expected: "Creates a true value"
12161226
)
12171227
}
12181228

@@ -1310,7 +1320,12 @@ private func assertMarkdown(
13101320
file: StaticString = #filePath,
13111321
line: UInt = #line
13121322
) {
1313-
XCTAssertEqual(documentation, .markupContent(MarkupContent(kind: .markdown, value: expected)))
1323+
XCTAssertEqual(
1324+
documentation,
1325+
.markupContent(MarkupContent(kind: .markdown, value: expected)),
1326+
file: file,
1327+
line: line
1328+
)
13141329
}
13151330

13161331
fileprivate extension Position {

Tests/SwiftSourceKitPluginTests/SwiftSourceKitPluginTests.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ final class SwiftSourceKitPluginTests: XCTestCase {
205205
XCTAssertEqual(result2.items.count, 1)
206206
XCTAssertEqual(result2.items[0].name, "")
207207
let doc = try await sourcekitd.completeDocumentation(id: result2.items[0].id)
208+
XCTAssertNil(doc.docComment)
208209
XCTAssertNil(doc.docFullAsXML)
209210
XCTAssertNil(doc.docBrief)
210211
}
@@ -441,6 +442,7 @@ final class SwiftSourceKitPluginTests: XCTestCase {
441442
let sym3 = try unwrap(result.items.first(where: { $0.name == "foo3()" }), "did not find foo3; got \(result.items)")
442443

443444
let sym1Doc = try await sourcekitd.completeDocumentation(id: sym1.id)
445+
XCTAssertEqual(sym1Doc.docComment, "Protocol P foo1")
444446
XCTAssertEqual(
445447
sym1Doc.docFullAsXML,
446448
"""
@@ -461,6 +463,7 @@ final class SwiftSourceKitPluginTests: XCTestCase {
461463
XCTAssertEqual(sym1Doc.associatedUSRs, ["s:1a1SV4foo1yyF", "s:1a1PP4foo1yyF"])
462464

463465
let sym2Doc = try await sourcekitd.completeDocumentation(id: sym2.id)
466+
XCTAssertEqual(sym2Doc.docComment, "Struct S foo2")
464467
XCTAssertEqual(
465468
sym2Doc.docFullAsXML,
466469
"""
@@ -478,6 +481,7 @@ final class SwiftSourceKitPluginTests: XCTestCase {
478481
XCTAssertEqual(sym2Doc.associatedUSRs, ["s:1a1SV4foo2yyF"])
479482

480483
let sym3Doc = try await sourcekitd.completeDocumentation(id: sym3.id)
484+
XCTAssertNil(sym3Doc.docComment)
481485
XCTAssertNil(sym3Doc.docFullAsXML)
482486
XCTAssertNil(sym3Doc.docBrief)
483487
XCTAssertEqual(sym3Doc.associatedUSRs, ["s:1a1SV4foo3yyF"])
@@ -1801,12 +1805,14 @@ private struct CompletionResult: Equatable, Sendable {
18011805
}
18021806

18031807
private struct CompletionDocumentation {
1808+
var docComment: String? = nil
18041809
var docFullAsXML: String? = nil
18051810
var docBrief: String? = nil
18061811
var associatedUSRs: [String] = []
18071812

18081813
init(_ dict: SKDResponseDictionary) {
18091814
let keys = dict.sourcekitd.keys
1815+
self.docComment = dict[keys.docComment]
18101816
self.docFullAsXML = dict[keys.docFullAsXML]
18111817
self.docBrief = dict[keys.docBrief]
18121818
self.associatedUSRs = dict[keys.associatedUSRs]?.asStringArray ?? []

0 commit comments

Comments
 (0)