diff --git a/src/lsp/providers/diagnosticsProvider.ts b/src/lsp/providers/diagnosticsProvider.ts index 9f483ac9f69be7fbc5deeae70607194fafacf66b..e76bf49249f86a753313ebc8aecd65c29403d89a 100644 --- a/src/lsp/providers/diagnosticsProvider.ts +++ b/src/lsp/providers/diagnosticsProvider.ts @@ -5,18 +5,12 @@ DiagnosticSeverity, } from 'vscode-languageserver' import { State } from '../util/state' import { isCssDoc } from '../util/css' -import { - findClassNamesInRange, findClassListsInDocument, - getClassNamesInClassList, -} from '../util/find' + findClassNamesInRange, import { getClassNameMeta } from '../util/getClassNameMeta' import { - Diagnostic, -import { equal } from '../../util/array' -import { } from 'vscode-languageserver' -function getCssDiagnostics(state: State, document: TextDocument): Diagnostic[] { +function provideCssDiagnostics(state: State, document: TextDocument): void { const classNames = findClassNamesInRange(document, undefined, 'css') let diagnostics: Diagnostic[] = classNames @@ -54,97 +48,58 @@ return { severity: DiagnosticSeverity.Error, range, message, + // source: 'ex', } }) .filter(Boolean) - return diagnostics -} import { -} from 'vscode-languageserver' -} from 'vscode-languageserver' -} from 'vscode-languageserver' import { -} from 'vscode-languageserver' + getClassNamesInClassList, TextDocument, -} from 'vscode-languageserver' + getClassNamesInClassList, Diagnostic, -} from 'vscode-languageserver' + getClassNamesInClassList, DiagnosticSeverity, -} from 'vscode-languageserver' + getClassNamesInClassList, } from 'vscode-languageserver' import { -} from 'vscode-languageserver' -} from 'vscode-languageserver' import { State } from '../util/state' -} from 'vscode-languageserver' + getClassNamesInClassList, import { isCssDoc } from '../util/css' import { -} from 'vscode-languageserver' -} from 'vscode-languageserver' findClassNamesInRange, - let otherClassNames = classNames.filter((_className, i) => i !== index) -import { State } from '../util/state' +import { - let decls = getClassNameDecls(state, className.className) - if (!decls) return + findClassListsInDocument, import { -} from 'vscode-languageserver' -import { State } from '../util/state' Diagnostic, -import { State } from '../util/state' + getClassNamesInClassList, DiagnosticSeverity, import { } from 'vscode-languageserver' - let meta = getClassNameMeta(state, className.className) -import { State } from '../util/state' + getClassNamesInClassList, import { State } from '../util/state' import { -} from 'vscode-languageserver' -import { State } from '../util/state' import { isCssDoc } from '../util/css' -import { State } from '../util/state' + getClassNamesInClassList, findClassNamesInRange, - !Array.isArray(meta) && -import { isCssDoc } from '../util/css' +import { - equal(meta.context, otherMeta.context) && - equal(meta.pseudo, otherMeta.pseudo) - ) { - diagnostics.push({ - range: className.range, - severity: DiagnosticSeverity.Warning, - message: `You can’t use \`${className.className}\` and \`${otherClassName.className}\` together`, - relatedInformation: [ -import { isCssDoc } from '../util/css' findClassListsInDocument, - findClassNamesInRange, +} from '../util/find' - findClassNamesInRange, import { - uri: document.uri, - range: otherClassName.range, - }, - }, - ], - }) - } - }) - }) - }) +} from '../util/find' - return diagnostics + state.editor.connection.sendDiagnostics({ uri: document.uri, diagnostics }) } export async function provideDiagnostics( state: State, document: TextDocument ): Promise { - state.editor.connection.sendDiagnostics({ - findClassListsInDocument, +} from '../util/find' Diagnostic, - findClassListsInDocument, +} from '../util/find' DiagnosticSeverity, - findClassListsInDocument, +} from '../util/find' } from 'vscode-languageserver' - ...(isCssDoc(state, document) ? getCssDiagnostics(state, document) : []), - ], - }) } diff --git a/src/lsp/util/find.ts b/src/lsp/util/find.ts index 9a04ac4de58771e60379719acd0b50a5e1ebcdf2..6b1bfca7fbce3737b86c7529b4e7141715d17f58 100644 --- a/src/lsp/util/find.ts +++ b/src/lsp/util/find.ts @@ -6,7 +6,6 @@ import { isHtmlContext, isHtmlDoc, isSvelteDoc, isVueDoc } from './html' import { isWithinRange } from './isWithinRange' import { isJsContext, isJsDoc } from './js' import { getClassAttributeLexer } from './lexers' -import { flatten } from '../../util/array' export function findAll(re: RegExp, str: string): RegExpMatchArray[] { let match: RegExpMatchArray @@ -25,64 +24,77 @@ } return matches[matches.length - 1] } +export function findClassNamesInRange( +import { isHtmlContext, isHtmlDoc, isSvelteDoc, isVueDoc } from './html' import { DocumentClassName, DocumentClassList, State } from './state' + range?: Range, +import { isHtmlContext, isHtmlDoc, isSvelteDoc, isVueDoc } from './html' import { isCssContext, isCssDoc } from './css' -import { DocumentClassName, DocumentClassList, State } from './state' +import { isHtmlContext, isHtmlDoc, isSvelteDoc, isVueDoc } from './html' import { isHtmlContext, isHtmlDoc, isSvelteDoc, isVueDoc } from './html' + const classLists = findClassListsInRange(doc, range, mode) +import { DocumentClassName, DocumentClassList, State } from './state' range, import { DocumentClassName, DocumentClassList, State } from './state' +import { DocumentClassName, DocumentClassList, State } from './state' import { isJsContext, isJsDoc } from './js' +import { DocumentClassName, DocumentClassList, State } from './state' const parts = classList.split(/(\s+)/) import { DocumentClassName, DocumentClassList, State } from './state' +import { DocumentClassName, DocumentClassList, State } from './state' import { flatten } from '../../util/array' +import { DocumentClassName, DocumentClassList, State } from './state' let index = 0 +import { DocumentClassName, DocumentClassList, State } from './state' for (let i = 0; i < parts.length; i++) { +import { DocumentClassName, DocumentClassList, State } from './state' if (i % 2 === 0) { +import { DocumentClassName, DocumentClassList, State } from './state' const start = indexToPosition(classList, index) +import { DocumentClassName, DocumentClassList, State } from './state' const end = indexToPosition(classList, index + parts[i].length) +import { DocumentClassName, DocumentClassList, State } from './state' names.push({ +import { DocumentClassName, DocumentClassList, State } from './state' className: parts[i], +import { DocumentClassName, DocumentClassList, State } from './state' range: { - start: { - line: range.start.line + start.line, - character: -import { isCssContext, isCssDoc } from './css' import { TextDocument, Range, Position } from 'vscode-languageserver' }, +import { TextDocument, Range, Position } from 'vscode-languageserver' end: { - line: range.start.line + end.line, + line: range.start.line + start.line, - character: +import { TextDocument, Range, Position } from 'vscode-languageserver' (end.line === 0 ? range.start.character : 0) + end.character, -import { isCssContext, isCssDoc } from './css' import { DocumentClassName, DocumentClassList, State } from './state' + line: range.start.line + start.line, - }, +import { TextDocument, Range, Position } from 'vscode-languageserver' }) +import { TextDocument, Range, Position } from 'vscode-languageserver' } +import { TextDocument, Range, Position } from 'vscode-languageserver' index += parts[i].length - } + line: range.start.line + end.line, + while ((match = re.exec(str)) !== null) { import { isHtmlContext, isHtmlDoc, isSvelteDoc, isVueDoc } from './html' +export function getClassNamesInClassList({ import { TextDocument, Range, Position } from 'vscode-languageserver' -import { getClassAttributeLexer } from './lexers' import { TextDocument, Range, Position } from 'vscode-languageserver' + } -import { isHtmlContext, isHtmlDoc, isSvelteDoc, isVueDoc } from './html' import { TextDocument, Range, Position } from 'vscode-languageserver' doc: TextDocument, - range?: Range, -import { isHtmlContext, isHtmlDoc, isSvelteDoc, isVueDoc } from './html' +import { DocumentClassName, DocumentClassList, State } from './state' import { isCssContext, isCssDoc } from './css' +import { DocumentClassName, DocumentClassList, State } from './state' -): DocumentClassName[] { + } - const classLists = findClassListsInRange(doc, range, mode) - return flatten(classLists.map(getClassNamesInClassList)) + index += parts[i].length import { TextDocument, Range, Position } from 'vscode-languageserver' -import { getClassAttributeLexer } from './lexers' import { TextDocument, Range, Position } from 'vscode-languageserver' +import { isCssContext, isCssDoc } from './css' -export function findClassNamesInDocument( - state: State, + return names -import { isWithinRange } from './isWithinRange' +import { DocumentClassName, DocumentClassList, State } from './state' -): DocumentClassName[] { -import { isWithinRange } from './isWithinRange' import { TextDocument, Range, Position } from 'vscode-languageserver' - return flatten(classLists.map(getClassNamesInClassList)) + ) } export function findClassListsInCssRange( @@ -114,7 +131,7 @@ } export function findClassListsInHtmlRange( doc: TextDocument, - range?: Range + range: Range ): DocumentClassList[] { const text = doc.getText(range) const matches = findAll(/[\s:]class(?:Name)?=['"`{]/g, text) @@ -190,18 +207,16 @@ return { classList: value, range: { start: { - line: (range?.start.line || 0) + start.line, + line: range.start.line + start.line, character: - (end.line === 0 ? range?.start.character || 0 : 0) + + (end.line === 0 ? range.start.character : 0) + start.character, }, end: { - matches.push({ ...match }) +export function getClassNamesInClassList({ character: -import { TextDocument, Range, Position } from 'vscode-languageserver' +import { DocumentClassName, DocumentClassList, State } from './state' import { isCssContext, isCssDoc } from './css' -import { isWithinRange } from './isWithinRange' - matches.push({ ...match }) import { TextDocument, Range, Position } from 'vscode-languageserver' }, }, @@ -216,9 +231,10 @@ } export function findClassListsInRange( doc: TextDocument, - range?: Range, + range: Range, -import { isHtmlContext, isHtmlDoc, isSvelteDoc, isVueDoc } from './html' +import { DocumentClassName, DocumentClassList, State } from './state' import { isCssContext, isCssDoc } from './css' +import { isJsContext, isJsDoc } from './js' ): DocumentClassList[] { if (mode === 'css') { return findClassListsInCssRange(doc, range)