Skip to content

Commit 379df94

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 server
1 parent a4d2549 commit 379df94

File tree

4 files changed

+24
-10
lines changed

4 files changed

+24
-10
lines changed

Diff for: packages/tailwindcss-language-server/src/lsp/diagnosticsProvider.ts

+5-2
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
}

Diff for: packages/tailwindcss-language-service/src/codeActions/codeActionProvider.ts

+3-2
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) => {

Diff for: packages/tailwindcss-language-service/src/diagnostics/diagnosticsProvider.ts

+13-4
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'
@@ -23,10 +27,10 @@ export async function doValidate(
2327
DiagnosticKind.InvalidSourceDirective,
2428
DiagnosticKind.RecommendedVariantOrder,
2529
],
26-
): Promise<AugmentedDiagnostic[]> {
27-
const settings = await state.editor.getConfiguration(document.uri)
30+
): Promise<FullDocumentDiagnosticReport> {
31+
let settings = await state.editor.getConfiguration(document.uri)
2832

29-
return settings.tailwindCSS.validate
33+
let items = settings.tailwindCSS.validate
3034
? [
3135
...(only.includes(DiagnosticKind.CssConflict)
3236
? await getCssConflictDiagnostics(state, document, settings)
@@ -54,4 +58,9 @@ export async function doValidate(
5458
: []),
5559
]
5660
: []
61+
62+
return {
63+
kind: DocumentDiagnosticReportKind.Full,
64+
items,
65+
}
5766
}

Diff for: packages/tailwindcss-language-service/src/service.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@ import type {
1212
DocumentLink,
1313
Hover,
1414
ColorPresentation,
15+
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>

0 commit comments

Comments
 (0)