From 5e63a12b4812cb9b980e09077f8791236fb212c4 Mon Sep 17 00:00:00 2001 From: Brad Cornes Date: Fri, 12 Jun 2020 16:56:02 +0100 Subject: [PATCH] add initial "unknown variant" lint rule --- package.json | 15 +++++++ src/lsp/providers/diagnosticsProvider.ts | 54 ++++++++++++++++++++++-- src/lsp/server.ts | 1 + src/lsp/util/state.ts | 1 + 4 files changed, 68 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index aff66ab..5992723 100755 --- a/package.json +++ b/package.json @@ -119,6 +119,21 @@ "", "" ] + }, + "tailwindCSS.lint.unknownVariant": { + "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 ccb74ac..bf87c9f 100644 --- a/src/lsp/providers/diagnosticsProvider.ts +++ b/src/lsp/providers/diagnosticsProvider.ts @@ -14,7 +14,7 @@ import { } from '../util/find' import { getClassNameMeta } from '../util/getClassNameMeta' import { getClassNameDecls } from '../util/getClassNameDecls' -import { equal } from '../../util/array' +import { equal, flatten } from '../../util/array' import { getDocumentSettings } from '../util/getDocumentSettings' const dlv = require('dlv') @@ -131,7 +131,7 @@ function getUtilityConflictDiagnostics( return diagnostics } -function getScreenDirectiveDiagnostics( +function getUnknownScreenDiagnostics( state: State, document: TextDocument, settings: Settings @@ -170,6 +170,53 @@ function getScreenDirectiveDiagnostics( .filter(Boolean) } +function getUnknownVariantDiagnostics( + state: State, + document: TextDocument, + settings: Settings +): Diagnostic[] { + let severity = settings.lint.unknownVariant + if (severity === 'ignore') return [] + + let text = document.getText() + let matches = findAll(/(?:\s|^)@variants\s+(?[^{]+)/g, text) + + return flatten( + matches + .map((match) => { + let diagnostics: Diagnostic[] = [] + let variants = match.groups.variants.split(/(\s*,\s*)/) + let listStartIndex = + match.index + match[0].length - match.groups.variants.length + + for (let i = 0; i < variants.length; i += 2) { + let variant = variants[i].trim() + if (state.variants.includes(variant)) { + continue + } + + let variantStartIndex = + listStartIndex + variants.slice(0, i).join('').length + + diagnostics.push({ + range: { + start: indexToPosition(text, variantStartIndex), + end: indexToPosition(text, variantStartIndex + variant.length), + }, + severity: + severity === 'error' + ? DiagnosticSeverity.Error + : DiagnosticSeverity.Warning, + message: `Unknown variant: ${variant}`, + }) + } + + return diagnostics + }) + .filter(Boolean) + ) +} + export async function provideDiagnostics( state: State, document: TextDocument @@ -182,7 +229,8 @@ export async function provideDiagnostics( ...(isCssDoc(state, document) ? [ ...getUnsupportedApplyDiagnostics(state, document, settings), - ...getScreenDirectiveDiagnostics(state, document, settings), + ...getUnknownScreenDiagnostics(state, document, settings), + ...getUnknownVariantDiagnostics(state, document, settings), ] : []), ] diff --git a/src/lsp/server.ts b/src/lsp/server.ts index 979c318..c3cefc3 100644 --- a/src/lsp/server.ts +++ b/src/lsp/server.ts @@ -41,6 +41,7 @@ const defaultSettings: Settings = { utilityConflicts: 'warning', unsupportedApply: 'error', unknownScreen: 'error', + unknownVariant: 'error', }, } let globalSettings: Settings = defaultSettings diff --git a/src/lsp/util/state.ts b/src/lsp/util/state.ts index 44ebc1a..f4d8a9f 100644 --- a/src/lsp/util/state.ts +++ b/src/lsp/util/state.ts @@ -35,6 +35,7 @@ export type Settings = { utilityConflicts: DiagnosticSeveritySetting unsupportedApply: DiagnosticSeveritySetting unknownScreen: DiagnosticSeveritySetting + unknownVariant: DiagnosticSeveritySetting } }