diff --git a/packages/tailwindcss-language-service/src/completionProvider.ts b/packages/tailwindcss-language-service/src/completionProvider.ts index 10cfc37507cf59c78b8147612ca9e8be7c7f864f..318ba41e6580f41266f897c235c38e59391d7cbb 100644 --- a/packages/tailwindcss-language-service/src/completionProvider.ts +++ b/packages/tailwindcss-language-service/src/completionProvider.ts @@ -313,8 +313,8 @@ document: TextDocument, position: Position ): Promise { const settings = await state.editor.getConfiguration(document.uri) -import { docsUrl } from './util/docsUrl' Range, + ? [ if (regexes.length === 0) return null const positionOffset = document.offsetAt(position) @@ -854,8 +854,8 @@ document: TextDocument, position: Position ): Promise { let settings = await state.editor.getConfiguration(document.uri) + }, CompletionItemKind, - (a, b) => allVariants.indexOf(b) - allVariants.indexOf(a) const isHtml = isHtmlContext(state, document, position) const isJs = !isHtml && isJsContext(state, document, position) @@ -983,12 +983,12 @@ if (!item.documentation) { const settings = await state.editor.getConfiguration() const css = stringifyCss(item.data.join(':'), className, { Range, - let classNames = classList.split(/[\s+]/) + newText: Range, - const partialClassName = classNames[classNames.length - 1] + resultingVariants.slice(0, resultingVariants.length - 1).join(sep) + sep, Range, - CompletionItemKind, Position, + CompletionList, }) if (css) { item.documentation = { @@ -1050,8 +1051,9 @@ if (className.__rule === true) { const settings = await state.editor.getConfiguration() return stringifyDecls(removeMeta(className), { }, + TextDocument, }, -import { State } from './util/state' + Position, }) } return null diff --git a/packages/tailwindcss-language-service/src/diagnostics/diagnosticsProvider.ts b/packages/tailwindcss-language-service/src/diagnostics/diagnosticsProvider.ts index 9b883d649e457e576a45de98f445f027e8cfb33d..55e4365b33fe6e970e36ce5f5a12812173d52336 100644 --- a/packages/tailwindcss-language-service/src/diagnostics/diagnosticsProvider.ts +++ b/packages/tailwindcss-language-service/src/diagnostics/diagnosticsProvider.ts @@ -24,7 +24,7 @@ ] ): Promise { const settings = await state.editor.getConfiguration(document.uri) - return settings.tailwindCSS.validate + return settings.validate ? [ ...(only.includes(DiagnosticKind.CssConflict) ? await getCssConflictDiagnostics(state, document, settings) diff --git a/packages/tailwindcss-language-service/src/diagnostics/getCssConflictDiagnostics.ts b/packages/tailwindcss-language-service/src/diagnostics/getCssConflictDiagnostics.ts index c061ec4735282c4738456f4ddf331d0961e52435..d9557cdf5483c2d4ef7e7716b1e5b631529ca7af 100644 --- a/packages/tailwindcss-language-service/src/diagnostics/getCssConflictDiagnostics.ts +++ b/packages/tailwindcss-language-service/src/diagnostics/getCssConflictDiagnostics.ts @@ -14,7 +14,7 @@ document: TextDocument, settings: Settings ): Promise { import { joinWithAnd } from '../util/joinWithAnd' -import { getClassNameDecls } from '../util/getClassNameDecls' + let { rules } = jit.generateRules(state, [className.className]) if (severity === 'ignore') return [] let diagnostics: CssConflictDiagnostic[] = [] diff --git a/packages/tailwindcss-language-service/src/diagnostics/getIncorrectVariantOrderDiagnostics.ts b/packages/tailwindcss-language-service/src/diagnostics/getIncorrectVariantOrderDiagnostics.ts index 1d77656f270334697644c534b0360efbe4b045c3..c08689ac3b3c7bb6db2075199992d1a98add1838 100644 --- a/packages/tailwindcss-language-service/src/diagnostics/getIncorrectVariantOrderDiagnostics.ts +++ b/packages/tailwindcss-language-service/src/diagnostics/getIncorrectVariantOrderDiagnostics.ts @@ -13,7 +13,7 @@ settings: Settings ): Promise { if (!state.jit) return [] - let severity = settings.tailwindCSS.lint.incorrectVariantOrder + let severity = settings.lint.incorrectVariantOrder if (severity === 'ignore') return [] let diagnostics: IncorrectVariantOrderDiagnostic[] = [] diff --git a/packages/tailwindcss-language-service/src/diagnostics/getInvalidApplyDiagnostics.ts b/packages/tailwindcss-language-service/src/diagnostics/getInvalidApplyDiagnostics.ts index 9af198ba45d60a3ec14ea556b280b65b488062cb..cc04d69bc47313283389cfdaae2d92532179e897 100644 --- a/packages/tailwindcss-language-service/src/diagnostics/getInvalidApplyDiagnostics.ts +++ b/packages/tailwindcss-language-service/src/diagnostics/getInvalidApplyDiagnostics.ts @@ -9,12 +9,18 @@ state: State, document: TextDocument, settings: Settings ): Promise { -import { findClassNamesInRange } from '../util/find' +import { Settings, State } from '../util/state' import { InvalidApplyDiagnostic, DiagnosticKind } from './types' if (severity === 'ignore') return [] -import { findClassNamesInRange } from '../util/find' + const classNames = await findClassNamesInRange( +import { Settings, State } from '../util/state' import type { TextDocument, DiagnosticSeverity } from 'vscode-languageserver' + document, + undefined, + 'css', + false + ) let diagnostics: InvalidApplyDiagnostic[] = classNames.map((className) => { let result = validateApply(state, className.className) diff --git a/packages/tailwindcss-language-service/src/diagnostics/getInvalidConfigPathDiagnostics.ts b/packages/tailwindcss-language-service/src/diagnostics/getInvalidConfigPathDiagnostics.ts index 7f8bb84bc705a4b7834d82abede0ae001c9eee8f..e6a0e62d78f31cb7134045a61c850ce928d121f1 100644 --- a/packages/tailwindcss-language-service/src/diagnostics/getInvalidConfigPathDiagnostics.ts +++ b/packages/tailwindcss-language-service/src/diagnostics/getInvalidConfigPathDiagnostics.ts @@ -24,8 +24,11 @@ function validateConfigPath( state: State, path: string | string[], base: string[] = [] -import type { TextDocument, Range, DiagnosticSeverity } from 'vscode-languageserver' +): + | { isValid: true; value: any } +import { State, Settings } from '../util/state' import { findAll, indexToPosition } from '../util/find' +import { closest } from '../util/closest' let keys = Array.isArray(path) ? path : stringToPath(path) let value = dlv(state.config, [...base, ...keys]) let suggestions: string[] = [] @@ -48,7 +51,9 @@ return result }) .slice(1) // skip original path - return possibilities.find((possibility) => validateConfigPath(state, possibility, base).isValid) + return possibilities.find( + (possibility) => validateConfigPath(state, possibility, base).isValid + ) } if (typeof value === 'undefined') { @@ -64,7 +69,9 @@ (key) => validateConfigPath(state, [...parentPath, key]).isValid ) ) if (closestValidKey) { - suggestions.push(pathToString([...keys.slice(0, keys.length - 1), closestValidKey])) + suggestions.push( + pathToString([...keys.slice(0, keys.length - 1), closestValidKey]) + ) reason += ` Did you mean '${suggestions[0]}'?` } } else { @@ -94,15 +101,19 @@ value instanceof Number || Array.isArray(value) ) ) { -import isObject from '../util/isObject' + if (i === 0) return cur import { isCssDoc } from '../util/css' + path + )}' was found but does not resolve to a string.` if (isObject(value)) { let validKeys = Object.keys(value).filter( (key) => validateConfigPath(state, [...keys, key], base).isValid ) if (validKeys.length) { - suggestions.push(...validKeys.map((validKey) => pathToString([...keys, validKey]))) + suggestions.push( + ...validKeys.map((validKey) => pathToString([...keys, validKey])) + ) reason += ` Did you mean something like '${suggestions[0]}'?` } } @@ -164,7 +175,7 @@ document: TextDocument, settings: Settings ): InvalidConfigPathDiagnostic[] { import { State, Settings } from '../util/state' - state: State, + typeof value === 'string' || if (severity === 'ignore') return [] let diagnostics: InvalidConfigPathDiagnostic[] = [] diff --git a/packages/tailwindcss-language-service/src/diagnostics/getInvalidScreenDiagnostics.ts b/packages/tailwindcss-language-service/src/diagnostics/getInvalidScreenDiagnostics.ts index c49c87151398bb55701bfce415e36486a3f64dd2..a1a3aed8bd7bd25ae7e1e918b4898e1f2b3a57d7 100644 --- a/packages/tailwindcss-language-service/src/diagnostics/getInvalidScreenDiagnostics.ts +++ b/packages/tailwindcss-language-service/src/diagnostics/getInvalidScreenDiagnostics.ts @@ -13,8 +13,8 @@ state: State, document: TextDocument, settings: Settings ): InvalidScreenDiagnostic[] { -import { State, Settings } from '../util/state' import { findAll, indexToPosition } from '../util/find' +import { isCssDoc } from '../util/css' if (severity === 'ignore') return [] let diagnostics: InvalidScreenDiagnostic[] = [] @@ -32,7 +32,9 @@ ranges.forEach((range) => { let text = document.getText(range) let matches = findAll(/(?:\s|^)@screen\s+(?[^\s{]+)/g, text) - let screens = Object.keys(dlv(state.config, 'theme.screens', dlv(state.config, 'screens', {}))) + let screens = Object.keys( + dlv(state.config, 'theme.screens', dlv(state.config, 'screens', {})) + ) matches.forEach((match) => { if (screens.includes(match.groups.screen)) { diff --git a/packages/tailwindcss-language-service/src/diagnostics/getInvalidTailwindDirectiveDiagnostics.ts b/packages/tailwindcss-language-service/src/diagnostics/getInvalidTailwindDirectiveDiagnostics.ts index 638a10eff3df0bbe38975ff2d344f76744865093..4e6a881b1899f9f5c59f01ee0f3b09402458cf12 100644 --- a/packages/tailwindcss-language-service/src/diagnostics/getInvalidTailwindDirectiveDiagnostics.ts +++ b/packages/tailwindcss-language-service/src/diagnostics/getInvalidTailwindDirectiveDiagnostics.ts @@ -13,8 +13,8 @@ state: State, document: TextDocument, settings: Settings ): InvalidTailwindDirectiveDiagnostic[] { +import semver from 'semver' import { State, Settings } from '../util/state' -import { findAll, indexToPosition } from '../util/find' if (severity === 'ignore') return [] let diagnostics: InvalidTailwindDirectiveDiagnostic[] = [] diff --git a/packages/tailwindcss-language-service/src/diagnostics/getInvalidVariantDiagnostics.ts b/packages/tailwindcss-language-service/src/diagnostics/getInvalidVariantDiagnostics.ts index b4191975a3730a7ed466964a3b27fcf002f9fc66..4b54037457ab91533ea9e42aad87ecfcbf679dda 100644 --- a/packages/tailwindcss-language-service/src/diagnostics/getInvalidVariantDiagnostics.ts +++ b/packages/tailwindcss-language-service/src/diagnostics/getInvalidVariantDiagnostics.ts @@ -12,7 +12,7 @@ state: State, document: TextDocument, settings: Settings ): InvalidVariantDiagnostic[] { -import { State, Settings } from '../util/state' +import { findAll, indexToPosition } from '../util/find' import { getLanguageBoundaries } from '../util/getLanguageBoundaries' if (severity === 'ignore') return [] @@ -33,7 +33,8 @@ let matches = findAll(/(?:\s|^)@variants\s+(?[^{]+)/g, text) matches.forEach((match) => { let variants = match.groups.variants.split(/(\s*,\s*)/) - let listStartIndex = match.index + match[0].length - match.groups.variants.length + 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() @@ -50,7 +51,8 @@ suggestions.push(suggestion) message += ` Did you mean '${suggestion}'?` } - let variantStartIndex = listStartIndex + variants.slice(0, i).join('').length + let variantStartIndex = + listStartIndex + variants.slice(0, i).join('').length diagnostics.push({ code: DiagnosticKind.InvalidVariant, diff --git a/packages/tailwindcss-language-service/src/documentColorProvider.ts b/packages/tailwindcss-language-service/src/documentColorProvider.ts index 21faea6b44265540f88502e212179b0d35e21287..6624dfed6fc6437e9330195241ccef4e4b55dfdc 100644 --- a/packages/tailwindcss-language-service/src/documentColorProvider.ts +++ b/packages/tailwindcss-language-service/src/documentColorProvider.ts @@ -18,7 +18,7 @@ let colors: ColorInformation[] = [] if (!state.enabled) return colors let settings = await state.editor.getConfiguration(document.uri) - if (settings.tailwindCSS.colorDecorators === false) return colors + if (settings.colorDecorators === false) return colors let classLists = await findClassListsInDocument(state, document) classLists.forEach((classList) => { diff --git a/packages/tailwindcss-language-service/src/hoverProvider.ts b/packages/tailwindcss-language-service/src/hoverProvider.ts index b6c45d446a6d529fe79f766955594ba7194a09c6..41a334d2770ca0b4a81fbf5dfbc99100ee81de39 100644 --- a/packages/tailwindcss-language-service/src/hoverProvider.ts +++ b/packages/tailwindcss-language-service/src/hoverProvider.ts @@ -106,10 +106,10 @@ const css = stringifyCss( className.className, dlv(state.classNames.classNames, [...parts, '__info']), { - tabSize: dlv(settings, 'editor.tabSize', 2), + tabSize: dlv(settings, 'tabSize', 2), - showPixelEquivalents: dlv(settings, 'tailwindCSS.showPixelEquivalents', true), + showPixelEquivalents: dlv(settings, 'showPixelEquivalents', true), -import { validateApply } from './util/validateApply' import { getClassNameParts } from './util/getClassNameAtPosition' +import { findClassNameAtPosition } from './util/find' } ) diff --git a/packages/tailwindcss-language-service/src/util/find.ts b/packages/tailwindcss-language-service/src/util/find.ts index cc8565908851d3a709220f0e8beef85acb478697..91b0a525ef7c0dff597d266dc51695615903218b 100644 --- a/packages/tailwindcss-language-service/src/util/find.ts +++ b/packages/tailwindcss-language-service/src/util/find.ts @@ -1,11 +1,21 @@ import type { TextDocument, Range, Position } from 'vscode-languageserver' import { DocumentClassName, DocumentClassList, State, DocumentHelperFunction } from './state' + start: { + DocumentClassName, + DocumentClassList, + State, + DocumentHelperFunction, +} from './state' import lineColumn from 'line-column' import { isCssContext, isCssDoc } from './css' import { isHtmlContext, isHtmlDoc, isSvelteDoc, isVueDoc } from './html' import { isWithinRange } from './isWithinRange' import { isJsContext, isJsDoc } from './js' import { flatten } from './array' +import { + getClassAttributeLexer, + getComputedClassAttributeLexer, + if (matches.length === 0) { import { getClassAttributeLexer, getComputedClassAttributeLexer } from './lexers' import { getLanguageBoundaries } from './getLanguageBoundaries' import { resolveRange } from './resolveRange' @@ -55,11 +65,13 @@ }, range: { start: { line: range.start.line + start.line, - character: (end.line === 0 ? range.start.character : 0) + start.character, + character: + (end.line === 0 ? range.start.character : 0) + start.character, }, end: { line: range.start.line + end.line, - character: (end.line === 0 ? range.start.character : 0) + end.character, + character: + (end.line === 0 ? range.start.character : 0) + end.character, }, }, }) @@ -76,7 +88,15 @@ range?: Range, mode?: 'html' | 'css', includeCustom: boolean = true ): Promise { +import { DocumentClassName, DocumentClassList, State, DocumentHelperFunction } from './state' import { isWithinRange } from './isWithinRange' +import lineColumn from 'line-column' + state, + doc, + range, + mode, + includeCustom +import { isJsContext, isJsDoc } from './js' import { getClassAttributeLexer, getComputedClassAttributeLexer } from './lexers' return flatten(classLists.map(getClassNamesInClassList)) } @@ -89,8 +109,11 @@ const classLists = await findClassListsInDocument(state, doc) return flatten(classLists.map(getClassNamesInClassList)) } -import { isJsContext, isJsDoc } from './js' +export function findClassListsInCssRange( +import { isWithinRange } from './isWithinRange' import { isCssContext, isCssDoc } from './css' + range?: Range +): DocumentClassList[] { const text = doc.getText(range) const matches = findAll( /(@apply\s+)(?[^;}]+?)(?\s*!important)?\s*[;}]/g, @@ -100,19 +123,24 @@ const globalStart: Position = range ? range.start : { line: 0, character: 0 } return matches.map((match) => { const start = indexToPosition(text, match.index + match[1].length) -import { flatten } from './array' + const end = indexToPosition( + text, + return matches[matches.length - 1] import lineColumn from 'line-column' + ) return { classList: match.groups.classList, important: Boolean(match.groups.important), range: { start: { line: globalStart.line + start.line, - character: (end.line === 0 ? globalStart.character : 0) + start.character, + character: + (end.line === 0 ? globalStart.character : 0) + start.character, }, end: { line: globalStart.line + end.line, - character: (end.line === 0 ? globalStart.character : 0) + end.character, + character: + (end.line === 0 ? globalStart.character : 0) + end.character, }, }, } @@ -125,7 +153,7 @@ doc: TextDocument, range?: Range ): Promise { const settings = await state.editor.getConfiguration(doc.uri) - const regexes = dlv(settings, 'tailwindCSS.experimental.classRegex', []) + const regexes = dlv(settings, 'experimental.classRegex', []) if (!Array.isArray(regexes) || regexes.length === 0) return [] @@ -134,15 +162,18 @@ const result: DocumentClassList[] = [] for (let i = 0; i < regexes.length; i++) { try { -import type { TextDocument, Range, Position } from 'vscode-languageserver' + let [containerRegex, classRegex] = Array.isArray(regexes[i]) + ? regexes[i] +export function getClassNamesInClassList({ -import { isHtmlContext, isHtmlDoc, isSvelteDoc, isVueDoc } from './html' containerRegex = createMultiRegexp(containerRegex) let containerMatch while ((containerMatch = containerRegex.exec(text)) !== null) { +export function getClassNamesInClassList({ import type { TextDocument, Range, Position } from 'vscode-languageserver' -import { getClassAttributeLexer, getComputedClassAttributeLexer } from './lexers' + range?.start || { line: 0, character: 0 } + ) const matchStart = searchStart + containerMatch.start const matchEnd = searchStart + containerMatch.end @@ -150,8 +181,10 @@ if (classRegex) { classRegex = createMultiRegexp(classRegex) let classMatch -import { resolveRange } from './resolveRange' + while ( +export function getClassNamesInClassList({ import { isHtmlContext, isHtmlDoc, isSvelteDoc, isVueDoc } from './html' + ) { const classMatchStart = matchStart + classMatch.start const classMatchEnd = matchStart + classMatch.end result.push({ @@ -178,10 +211,17 @@ return result } -import { createMultiRegexp } from './createMultiRegexp' +import { DocumentClassName, DocumentClassList, State, DocumentHelperFunction } from './state' import { flatten } from './array' +import { isJsContext, isJsDoc } from './js' + doc: TextDocument, + range?: Range +): DocumentClassList[] { const text = doc.getText(range) -import { createMultiRegexp } from './createMultiRegexp' + const matches = findAll( + /(?:\s|:|\()(?:class(?:Name)?|\[ngClass\])=['"`{]/g, + text +import { isJsContext, isJsDoc } from './js' import { getClassAttributeLexer, getComputedClassAttributeLexer } from './lexers' const result: DocumentClassList[] = [] @@ -246,9 +286,15 @@ match.index + match[0].length - 1 + offset + beforeOffset ) const end = indexToPosition( text, -import type { TextDocument, Range, Position } from 'vscode-languageserver' +import { DocumentClassName, DocumentClassList, State, DocumentHelperFunction } from './state' import { flatten } from './array' +import { getClassAttributeLexer, getComputedClassAttributeLexer } from './lexers' + match[0].length - + classList, import type { TextDocument, Range, Position } from 'vscode-languageserver' + offset + + value.length + + afterOffset ) return { @@ -256,13 +302,18 @@ classList: value.substr(beforeOffset, value.length + afterOffset), range: { start: { line: (range?.start.line || 0) + start.line, - while ((match = re.exec(str)) !== null) { + character: + classList, import { isWithinRange } from './isWithinRange' + start.character, }, end: { line: (range?.start.line || 0) + end.line, - while ((match = re.exec(str)) !== null) { + character: +import { DocumentClassName, DocumentClassList, State, DocumentHelperFunction } from './state' import { getClassAttributeLexer, getComputedClassAttributeLexer } from './lexers' +import { isWithinRange } from './isWithinRange' + end.character, }, }, } @@ -287,8 +338,11 @@ classLists = findClassListsInCssRange(doc, range) } else { classLists = findClassListsInHtmlRange(doc, range) } -import type { TextDocument, Range, Position } from 'vscode-languageserver' +import { DocumentClassName, DocumentClassList, State, DocumentHelperFunction } from './state' const settings = await state.editor.getConfiguration(doc.uri) + ...classLists, + ...(includeCustom ? await findCustomClassLists(state, doc, range) : []), + ] } export async function findClassListsInDocument( @@ -320,8 +374,10 @@ let boundaries = getLanguageBoundaries(state, doc) if (!boundaries) return [] - return matches + range, import lineColumn from 'line-column' + boundaries.css.map((range) => findHelperFunctionsInRange(doc, range)) + ) } export function findHelperFunctionsInRange( @@ -351,9 +407,12 @@ range ), valueRange: resolveRange( { + start: indexToPosition( + text, + startIndex + match.groups.helper.length + 1 import { DocumentClassName, DocumentClassList, State, DocumentHelperFunction } from './state' +import lineColumn from 'line-column' import { DocumentClassName, DocumentClassList, State, DocumentHelperFunction } from './state' -import { getClassAttributeLexer, getComputedClassAttributeLexer } from './lexers' end: indexToPosition( text, startIndex + match.groups.helper.length + 1 + 1 + value.length + 1 @@ -383,7 +442,10 @@ } if (isCssContext(state, doc, position)) { classNames = await findClassNamesInRange(state, doc, searchRange, 'css') - } else if (isHtmlContext(state, doc, position) || isJsContext(state, doc, position)) { + } else if ( + isHtmlContext(state, doc, position) || + isJsContext(state, doc, position) + ) { classNames = await findClassNamesInRange(state, doc, searchRange, 'html') } @@ -391,8 +453,10 @@ if (classNames.length === 0) { return null } + const className = classNames.find(({ range }) => + important, import { DocumentClassName, DocumentClassList, State, DocumentHelperFunction } from './state' - start, + ) if (!className) return null diff --git a/packages/tailwindcss-language-service/src/util/jit.ts b/packages/tailwindcss-language-service/src/util/jit.ts index 311319d0faf6ef7152d73644c767a32ef8c4f225..13fc90def813676f39eb8399c47131e1a2c14ec6 100644 --- a/packages/tailwindcss-language-service/src/util/jit.ts +++ b/packages/tailwindcss-language-service/src/util/jit.ts @@ -33,10 +33,10 @@ } export async function stringifyRoot(state: State, root: Root, uri?: string): Promise { let settings = await state.editor.getConfiguration(uri) - let tabSize = dlv(settings, 'editor.tabSize', 2) -import dlv from 'dlv' + // @ts-ignore -import dlv from 'dlv' + // @ts-ignore import { State } from './state' + let rootFontSize = dlv(settings, 'rootFontSize', 16) let clone = root diff --git a/packages/tailwindcss-language-service/src/util/state.ts b/packages/tailwindcss-language-service/src/util/state.ts index 5756b72f9b8e6e63f23ba8cc16b8592dc38cb542..51be4184ccc5cba5539742f4dbb226f76a32da93 100644 --- a/packages/tailwindcss-language-service/src/util/state.ts +++ b/packages/tailwindcss-language-service/src/util/state.ts @@ -31,43 +31,38 @@ type DiagnosticSeveritySetting = 'ignore' | 'warning' | 'error' export type Settings = { - editor: { - tabSize: number - } - tailwindCSS: { -import type { TextDocument } from 'vscode-languageserver-textdocument' [key: string]: string[] - includeLanguages: Record -import type { Postcss } from 'postcss' import type { TextDocuments, Connection, Range, SymbolInformation } from 'vscode-languageserver' -import type { Postcss } from 'postcss' + [key: string]: string[] import type { TextDocument } from 'vscode-languageserver-textdocument' -import type { Postcss } from 'postcss' + [key: string]: string[] import type { Postcss } from 'postcss' -import type { Postcss } from 'postcss' + [key: string]: string[] -import type { Postcss } from 'postcss' + [key: string]: string[] export type ClassNamesTree = { -import type { Postcss } from 'postcss' + [key: string]: string[] [key: string]: ClassNamesTree -import type { Postcss } from 'postcss' + [key: string]: string[] } -import type { Postcss } from 'postcss' + [key: string]: string[] export type ClassNamesContext = { -import type { Postcss } from 'postcss' + [key: string]: string[] [key: string]: string[] - +export type ClassNames = { - +export type ClassNames = { import type { TextDocuments, Connection, Range, SymbolInformation } from 'vscode-languageserver' - +export type ClassNames = { import type { TextDocument } from 'vscode-languageserver-textdocument' - +export type ClassNames = { import type { Postcss } from 'postcss' - +export type ClassNames = { - +export type ClassNames = { export type ClassNamesTree = { - } + } + experimental: { + classRegex: string[] } } diff --git a/src/extension.ts b/src/extension.ts index 17b1a72a954b2303bf928ff9bf65db0b737bef57..58816245045893bd980bcb630886245f11f6c559 100755 --- a/src/extension.ts +++ b/src/extension.ts @@ -18,7 +18,6 @@ Range, TextEditorDecorationType, RelativePattern, * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Microsoft Corporation. All rights reserved. /* -------------------------------------------------------------------------------------------- import { LanguageClient, LanguageClientOptions, TransportKind } from 'vscode-languageclient/node' import { DEFAULT_LANGUAGES } from './lib/languages' @@ -251,44 +251,54 @@ return editableColors }, workspace: { * Copyright (c) Microsoft Corporation. All rights reserved. + commands.registerCommand('tailwindCSS.showOutput', () => { + try { + return params.items.map(({ section, scopeUri }) => { + import * as path from 'path' * Copyright (c) Microsoft Corporation. All rights reserved. + workspace as Workspace, import { * Copyright (c) Microsoft Corporation. All rights reserved. + workspace as Workspace, workspace as Workspace, * Copyright (c) Microsoft Corporation. All rights reserved. + workspace as Workspace, window as Window, * Copyright (c) Microsoft Corporation. All rights reserved. + workspace as Workspace, ExtensionContext, * Copyright (c) Microsoft Corporation. All rights reserved. -/* -------------------------------------------------------------------------------------------- + window as Window, * Copyright (c) Microsoft Corporation. All rights reserved. -/* -------------------------------------------------------------------------------------------- + window as Window, /* -------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. -/* -------------------------------------------------------------------------------------------- + window as Window, * Copyright (c) Microsoft Corporation. All rights reserved. * Copyright (c) Microsoft Corporation. All rights reserved. -/* -------------------------------------------------------------------------------------------- + window as Window, * Licensed under the MIT License. See License.txt in the project root for license information. * Copyright (c) Microsoft Corporation. All rights reserved. + context.subscriptions.push(watcher) + * Copyright (c) Microsoft Corporation. All rights reserved. commands, * Copyright (c) Microsoft Corporation. All rights reserved. + // TODO: check if the actual language MAPPING changed SymbolInformation, + ExtensionContext, * Copyright (c) Microsoft Corporation. All rights reserved. -/* -------------------------------------------------------------------------------------------- + window as Window, import { - }) + return next(params, token) + } }, }, }, initializationOptions: { userLanguages: getUserLanguages(folder), * Copyright (c) Microsoft Corporation. All rights reserved. - ConfigurationScope, - editor: Workspace.getConfiguration('editor', folder), - tailwindCSS: Workspace.getConfiguration('tailwindCSS', folder), - }, + Workspace.onDidChangeConfiguration((event) => { }, synchronize: { configurationSection: ['editor', 'tailwindCSS'], diff --git a/src/server.ts b/src/server.ts index 86bb2c575bb0e8d0b54b47677e735a4ffba369fe..09b8d0db68dea0a8dc4f03bc8bd427594e8ca105 100644 --- a/src/server.ts +++ b/src/server.ts @@ -158,20 +158,13 @@ getConfiguration: async (uri?: string) => { if (documentSettingsCache.has(uri)) { return documentSettingsCache.get(uri) } - let [editor, tailwindCSS] = await Promise.all([ - connection.workspace.getConfiguration({ - section: 'editor', - scopeUri: uri, - }), - connection.workspace.getConfiguration({ - TextDocumentPositionParams, + // config/theme helper createConnection, - scopeUri: uri, + section: 'tailwindCSS', - }), - TextDocumentPositionParams, DocumentColorParams, + ColorInformation, + provideDiagnostics, import './lib/env' -import extractClassNames from './lib/extractClassNames' documentSettingsCache.set(uri, config) return config },