diff --git a/package.json b/package.json index 2b5746f..6800a5f 100755 --- a/package.json +++ b/package.json @@ -69,6 +69,41 @@ }, "default": {}, "markdownDescription": "Enable features in languages that are not supported by default. Add a mapping here between the new language and an already supported language.\n E.g.: `{\"plaintext\": \"html\"}`" + }, + "tailwindCSS.validate": { + "type": "boolean", + "default": true, + "markdownDescription": "" + }, + "tailwindCSS.lint.utilityConflicts": { + "type": "string", + "enum": [ + "ignore", + "warning", + "error" + ], + "default": "warning", + "markdownDescription": "", + "markdownEnumDescriptions": [ + "", + "", + "" + ] + }, + "tailwindCSS.lint.unsupportedApply": { + "type": "string", + "enum": [ + "ignore", + "warning", + "error" + ], + "default": "error", + "markdownDescription": "", + "markdownEnumDescriptions": [ + "", + "", + "" + ] } } } diff --git a/src/lsp/providers/diagnosticsProvider.ts b/src/lsp/providers/diagnosticsProvider.ts index 9f483ac..9602ee7 100644 --- a/src/lsp/providers/diagnosticsProvider.ts +++ b/src/lsp/providers/diagnosticsProvider.ts @@ -3,7 +3,7 @@ import { Diagnostic, DiagnosticSeverity, } from 'vscode-languageserver' -import { State } from '../util/state' +import { State, Settings } from '../util/state' import { isCssDoc } from '../util/css' import { findClassNamesInRange, @@ -13,8 +13,16 @@ import { import { getClassNameMeta } from '../util/getClassNameMeta' import { getClassNameDecls } from '../util/getClassNameDecls' import { equal } from '../../util/array' +import { getDocumentSettings } from '../util/getDocumentSettings' + +function getCssDiagnostics( + state: State, + document: TextDocument, + settings: Settings +): Diagnostic[] { + let severity = settings.lint.unsupportedApply + if (severity === 'ignore') return [] -function getCssDiagnostics(state: State, document: TextDocument): Diagnostic[] { const classNames = findClassNamesInRange(document, undefined, 'css') let diagnostics: Diagnostic[] = classNames @@ -49,7 +57,10 @@ function getCssDiagnostics(state: State, document: TextDocument): Diagnostic[] { if (!message) return null return { - severity: DiagnosticSeverity.Error, + severity: + severity === 'error' + ? DiagnosticSeverity.Error + : DiagnosticSeverity.Warning, range, message, } @@ -59,10 +70,14 @@ function getCssDiagnostics(state: State, document: TextDocument): Diagnostic[] { return diagnostics } -function getConflictDiagnostics( +function getUtilityConflictDiagnostics( state: State, - document: TextDocument + document: TextDocument, + settings: Settings ): Diagnostic[] { + let severity = settings.lint.utilityConflicts + if (severity === 'ignore') return [] + let diagnostics: Diagnostic[] = [] const classLists = findClassListsInDocument(state, document) @@ -90,7 +105,10 @@ function getConflictDiagnostics( ) { diagnostics.push({ range: className.range, - severity: DiagnosticSeverity.Warning, + severity: + severity === 'error' + ? DiagnosticSeverity.Error + : DiagnosticSeverity.Warning, message: `You can’t use \`${className.className}\` and \`${otherClassName.className}\` together`, relatedInformation: [ { @@ -114,11 +132,19 @@ export async function provideDiagnostics( state: State, document: TextDocument ): Promise { + const settings = await getDocumentSettings(state, document.uri) + + const diagnostics: Diagnostic[] = settings.validate + ? [ + ...getUtilityConflictDiagnostics(state, document, settings), + ...(isCssDoc(state, document) + ? getCssDiagnostics(state, document, settings) + : []), + ] + : [] + state.editor.connection.sendDiagnostics({ uri: document.uri, - diagnostics: [ - ...getConflictDiagnostics(state, document), - ...(isCssDoc(state, document) ? getCssDiagnostics(state, document) : []), - ], + diagnostics, }) } diff --git a/src/lsp/server.ts b/src/lsp/server.ts index 480aa28..efbe0ab 100644 --- a/src/lsp/server.ts +++ b/src/lsp/server.ts @@ -36,6 +36,11 @@ let workspaceFolder: string | null const defaultSettings: Settings = { emmetCompletions: false, includeLanguages: {}, + validate: true, + lint: { + utilityConflicts: 'warning', + unsupportedApply: 'error', + }, } let globalSettings: Settings = defaultSettings let documentSettings: Map = new Map() @@ -172,9 +177,9 @@ connection.onDidChangeConfiguration((change) => { ) } - state.editor.documents - .all() - .forEach((doc) => getDocumentSettings(state, doc.uri)) + state.editor.documents.all().forEach((doc) => { + provideDiagnostics(state, doc) + }) }) connection.onCompletion( diff --git a/src/lsp/util/state.ts b/src/lsp/util/state.ts index dad7e76..97aca8a 100644 --- a/src/lsp/util/state.ts +++ b/src/lsp/util/state.ts @@ -25,9 +25,16 @@ export type EditorState = { } } +type DiagnosticSeveritySetting = 'ignore' | 'warning' | 'error' + export type Settings = { emmetCompletions: boolean includeLanguages: Record + validate: boolean + lint: { + utilityConflicts: DiagnosticSeveritySetting + unsupportedApply: DiagnosticSeveritySetting + } } export type State = null | {