Skip to content

Commit 2f92433

Browse files
committed
Represent language service diagnostics using the pull model
Protocol v3.17 added support for pull-model diagnostics which are modeled as a “report” that is either a full set of diagnostics for a document (and related documents) or “unchanged” We can convert these to the push model by pulling the diagnostics like we were doing before and inspecting the report before pushing diagnostics to the client
1 parent 4a3e09d commit 2f92433

File tree

4 files changed

+28
-11
lines changed

4 files changed

+28
-11
lines changed

packages/tailwindcss-language-server/src/lsp/diagnosticsProvider.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,13 @@ export async function provideDiagnostics(
99
) {
1010
if (!state.enabled) return
1111
let doc = await service.open(document.uri)
12-
let diagnostics = await doc?.diagnostics()
12+
let report = await doc?.diagnostics()
13+
14+
// No need to send diagnostics if the document is unchanged
15+
if (report.kind === 'unchanged') return
1316

1417
state.editor?.connection.sendDiagnostics({
1518
uri: document.uri,
16-
diagnostics: diagnostics ?? [],
19+
diagnostics: report?.items ?? [],
1720
})
1821
}

packages/tailwindcss-language-service/src/codeActions/codeActionProvider.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import { doValidate } from '../diagnostics/diagnosticsProvider'
55
import { rangesEqual } from '../util/rangesEqual'
66
import {
77
type DiagnosticKind,
8-
isInvalidApplyDiagnostic,
98
type AugmentedDiagnostic,
9+
isInvalidApplyDiagnostic,
1010
isCssConflictDiagnostic,
1111
isInvalidConfigPathDiagnostic,
1212
isInvalidTailwindDirectiveDiagnostic,
@@ -26,7 +26,8 @@ async function getDiagnosticsFromCodeActionParams(
2626
only?: DiagnosticKind[],
2727
): Promise<AugmentedDiagnostic[]> {
2828
if (!document) return []
29-
let diagnostics = await doValidate(state, document, only)
29+
let report = await doValidate(state, document, only)
30+
let diagnostics = report.items as AugmentedDiagnostic[]
3031

3132
return params.context.diagnostics
3233
.map((diagnostic) => {

packages/tailwindcss-language-service/src/diagnostics/diagnosticsProvider.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import type { TextDocument } from 'vscode-languageserver-textdocument'
2+
import {
3+
DocumentDiagnosticReportKind,
4+
type FullDocumentDiagnosticReport,
5+
} from 'vscode-languageserver'
26
import type { State } from '../util/state'
3-
import { DiagnosticKind, type AugmentedDiagnostic } from './types'
7+
import { DiagnosticKind } from './types'
48
import { getCssConflictDiagnostics } from './getCssConflictDiagnostics'
59
import { getInvalidApplyDiagnostics } from './getInvalidApplyDiagnostics'
610
import { getInvalidScreenDiagnostics } from './getInvalidScreenDiagnostics'
@@ -25,10 +29,10 @@ export async function doValidate(
2529
DiagnosticKind.RecommendedVariantOrder,
2630
DiagnosticKind.UsedBlocklistedClass,
2731
],
28-
): Promise<AugmentedDiagnostic[]> {
29-
const settings = await state.editor.getConfiguration(document.uri)
32+
): Promise<FullDocumentDiagnosticReport> {
33+
let settings = await state.editor.getConfiguration(document.uri)
3034

31-
return settings.tailwindCSS.validate
35+
let items = settings.tailwindCSS.validate
3236
? [
3337
...(only.includes(DiagnosticKind.CssConflict)
3438
? await getCssConflictDiagnostics(state, document, settings)
@@ -59,4 +63,9 @@ export async function doValidate(
5963
: []),
6064
]
6165
: []
66+
67+
return {
68+
kind: DocumentDiagnosticReportKind.Full,
69+
items,
70+
}
6271
}

packages/tailwindcss-language-service/src/service.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@ import {
1212
type DocumentLink,
1313
type Hover,
1414
type ColorPresentation,
15+
type DocumentDiagnosticReport,
1516
} from 'vscode-languageserver'
1617
import type { State } from './util/state'
17-
import type { AugmentedDiagnostic, DiagnosticKind } from './diagnostics/types'
18+
import type { DiagnosticKind } from './diagnostics/types'
1819
import type { FileSystem } from './fs'
1920
import picomatch from 'picomatch'
2021
import { doHover } from './hoverProvider'
@@ -39,7 +40,7 @@ export interface LanguageDocument {
3940
documentLinks(): Promise<DocumentLink[]>
4041
documentColors(): Promise<ColorInformation[]>
4142
codeLenses(): Promise<CodeLens[]>
42-
diagnostics(kinds?: DiagnosticKind[]): Promise<AugmentedDiagnostic[]>
43+
diagnostics(kinds?: DiagnosticKind[]): Promise<DocumentDiagnosticReport>
4344
codeActions(range: Range, context: CodeActionContext): Promise<CodeAction[]>
4445
completions(position: Position, ctx?: CompletionContext): Promise<CompletionList | null>
4546
resolveCompletion(item: CompletionItem): Promise<CompletionItem>
@@ -150,7 +151,10 @@ async function createLanguageDocument(
150151

151152
async diagnostics(kinds?: DiagnosticKind[]) {
152153
if (!state.enabled || !settings.tailwindCSS.validate) {
153-
return []
154+
return {
155+
kind: 'full',
156+
items: [],
157+
}
154158
}
155159

156160
return doValidate(state, doc, kinds)

0 commit comments

Comments
 (0)