Skip to content

Commit b52c6f4

Browse files
committed
[Diagnostics][SourceKit] Expose diagnostic educational notes through SourceKit requests
1 parent 78f10e7 commit b52c6f4

File tree

8 files changed

+55
-0
lines changed

8 files changed

+55
-0
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
extension (Int, Int) {}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Nominal Types
2+
-------------
3+
Nominal types documentation content

test/SourceKit/CompileNotifications/diagnostics.swift

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,42 @@
8787
// RUN: %sourcekitd-test -req=track-compiles == -req=syntax-map %s | %FileCheck %s -check-prefix=SYNTACTIC
8888
// SYNTACTIC: key.syntaxmap:
8989
// SYNTACTIC_NOT: key.notification: source.notification.compile-did-finish
90+
91+
// RUN: %sourcekitd-test -req=track-compiles == -req=sema %S/Inputs/descriptive-error.swift -- -Xfrontend -enable-descriptive-diagnostics -Xfrontend -diagnostic-documentation-path -Xfrontend %S/Inputs/test-docs %S/Inputs/descriptive-error.swift | %FileCheck %s -check-prefix=DESCRIPTIVE
92+
// DESCRIPTIVE: key.notification: source.notification.compile-did-finish
93+
// DESCRIPTIVE-NEXT: key.diagnostics: [
94+
// DESCRIPTIVE-NEXT: {
95+
// DESCRIPTIVE-NEXT: key.line: 1
96+
// DESCRIPTIVE-NEXT: key.column: 1
97+
// DESCRIPTIVE-NEXT: key.filepath: "{{.*}}descriptive-error.swift"
98+
// DESCRIPTIVE-NEXT: key.severity: source.diagnostic.severity.error
99+
// DESCRIPTIVE-NEXT: key.description: "non-nominal type
100+
// DESCRIPTIVE-NEXT: key.ranges: [
101+
// DESCRIPTIVE-NEXT: {
102+
// DESCRIPTIVE-NEXT: key.offset: 10,
103+
// DESCRIPTIVE-NEXT: key.length: 10
104+
// DESCRIPTIVE-NEXT: }
105+
// DESCRIPTIVE-NEXT: ],
106+
// DESCRIPTIVE-NEXT: key.educational_notes: [
107+
// DESCRIPTIVE-NEXT: "Nominal Types\n-------------\nNominal types documentation content\n"
108+
// DESCRIPTIVE-NEXT: ]
109+
// DESCRIPTIVE-NEXT: }
110+
// DESCRIPTIVE-NEXT: ],
111+
112+
// RUN: %sourcekitd-test -req=track-compiles == -req=sema %S/Inputs/descriptive-error.swift -- %S/Inputs/descriptive-error.swift | %FileCheck %s -check-prefix=DESCRIPTIVE-DISABLED
113+
// DESCRIPTIVE-DISABLED: key.notification: source.notification.compile-did-finish
114+
// DESCRIPTIVE-DISABLED-NEXT: key.diagnostics: [
115+
// DESCRIPTIVE-DISABLED-NEXT: {
116+
// DESCRIPTIVE-DISABLED-NEXT: key.line: 1
117+
// DESCRIPTIVE-DISABLED-NEXT: key.column: 1
118+
// DESCRIPTIVE-DISABLED-NEXT: key.filepath: "{{.*}}descriptive-error.swift"
119+
// DESCRIPTIVE-DISABLED-NEXT: key.severity: source.diagnostic.severity.error
120+
// DESCRIPTIVE-DISABLED-NEXT: key.description: "non-nominal type
121+
// DESCRIPTIVE-DISABLED-NEXT: key.ranges: [
122+
// DESCRIPTIVE-DISABLED-NEXT: {
123+
// DESCRIPTIVE-DISABLED-NEXT: key.offset: 10,
124+
// DESCRIPTIVE-DISABLED-NEXT: key.length: 10
125+
// DESCRIPTIVE-DISABLED-NEXT: }
126+
// DESCRIPTIVE-DISABLED-NEXT: ]
127+
// DESCRIPTIVE-DISABLED-NEXT: }
128+
// DESCRIPTIVE-DISABLED-NEXT: ],

tools/SourceKit/docs/Protocol.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,7 @@ of diagnostic entries. A diagnostic entry has this format:
418418
[opts] <key.fixits>: (array) [fixit+] // one or more entries for fixits
419419
[opts] <key.ranges>: (array) [range+] // one or more entries for ranges
420420
[opts] <key.diagnostics>: (array) [diagnostic+] // one or more sub-diagnostic entries
421+
[opts] <key.educational_notes>: (array) [string+] // one or more educational notes, fomatted as Markdown
421422
}
422423
```
423424

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ struct DiagnosticEntryInfoBase {
202202
std::string Filename;
203203
SmallVector<std::pair<unsigned, unsigned>, 2> Ranges;
204204
SmallVector<Fixit, 2> Fixits;
205+
SmallVector<std::string, 1> EducationalNotes;
205206
};
206207

207208
struct DiagnosticEntryInfo : DiagnosticEntryInfoBase {

tools/SourceKit/lib/SwiftLang/SwiftEditor.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,11 @@ void EditorDiagConsumer::handleDiagnostic(SourceManager &SM,
110110
}
111111
SKInfo.Description = Text.str();
112112

113+
for (auto notePath : Info.EducationalNotePaths) {
114+
if (auto buffer = SM.getFileSystem()->getBufferForFile(notePath))
115+
SKInfo.EducationalNotes.push_back(buffer->get()->getBuffer());
116+
}
117+
113118
Optional<unsigned> BufferIDOpt;
114119
if (Info.Loc.isValid()) {
115120
BufferIDOpt = SM.findBufferContainingLoc(Info.Loc);

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2651,6 +2651,10 @@ static void fillDictionaryForDiagnosticInfoBase(
26512651
if (!Info.Filename.empty())
26522652
Elem.set(KeyFilePath, Info.Filename);
26532653

2654+
if (!Info.EducationalNotes.empty()) {
2655+
Elem.set(KeyEducationalNotes, Info.EducationalNotes);
2656+
}
2657+
26542658
if (!Info.Ranges.empty()) {
26552659
auto RangesArr = Elem.setArray(KeyRanges);
26562660
for (auto R : Info.Ranges) {

utils/gyb_sourcekit_support/UIDs.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ def __init__(self, internal_name, external_name):
9595
KEY('Ranges', 'key.ranges'),
9696
KEY('Fixits', 'key.fixits'),
9797
KEY('Diagnostics', 'key.diagnostics'),
98+
KEY('EducationalNotes', 'key.educational_notes'),
9899
KEY('FormatOptions', 'key.editor.format.options'),
99100
KEY('CodeCompleteOptions', 'key.codecomplete.options'),
100101
KEY('FilterRules', 'key.codecomplete.filterrules'),

0 commit comments

Comments
 (0)