Skip to content

Commit bb0d657

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 6a50851 commit bb0d657

File tree

4 files changed

+24
-10
lines changed

4 files changed

+24
-10
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'
@@ -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
}

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

Lines changed: 3 additions & 2 deletions
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'
@@ -37,7 +38,7 @@ export interface LanguageDocument {
3738
documentLinks(): Promise<DocumentLink[]>
3839
documentColors(): Promise<ColorInformation[]>
3940
codeLenses(): Promise<CodeLens[]>
40-
diagnostics(kinds?: DiagnosticKind[]): Promise<AugmentedDiagnostic[]>
41+
diagnostics(kinds?: DiagnosticKind[]): Promise<DocumentDiagnosticReport>
4142
codeActions(range: Range, context: CodeActionContext): Promise<CodeAction[]>
4243
completions(position: Position, ctx?: CompletionContext): Promise<CompletionList | null>
4344
resolveCompletion(item: CompletionItem): Promise<CompletionItem>

0 commit comments

Comments
 (0)