parent
055b8909af
commit
183cc2f863
|
@ -20,9 +20,7 @@ export async function getCssConflictDiagnostics(
|
||||||
const classLists = await findClassListsInDocument(state, document)
|
const classLists = await findClassListsInDocument(state, document)
|
||||||
|
|
||||||
classLists.forEach((classList) => {
|
classLists.forEach((classList) => {
|
||||||
const classNames = Array.isArray(classList)
|
const classNames = getClassNamesInClassList(classList)
|
||||||
? classList.flatMap(getClassNamesInClassList)
|
|
||||||
: getClassNamesInClassList(classList)
|
|
||||||
|
|
||||||
classNames.forEach((className, index) => {
|
classNames.forEach((className, index) => {
|
||||||
if (state.jit) {
|
if (state.jit) {
|
||||||
|
|
|
@ -22,7 +22,7 @@ export async function getRecommendedVariantOrderDiagnostics(
|
||||||
let diagnostics: RecommendedVariantOrderDiagnostic[] = []
|
let diagnostics: RecommendedVariantOrderDiagnostic[] = []
|
||||||
const classLists = await findClassListsInDocument(state, document)
|
const classLists = await findClassListsInDocument(state, document)
|
||||||
|
|
||||||
classLists.flat().forEach((classList) => {
|
classLists.forEach((classList) => {
|
||||||
const classNames = getClassNamesInClassList(classList)
|
const classNames = getClassNamesInClassList(classList)
|
||||||
classNames.forEach((className) => {
|
classNames.forEach((className) => {
|
||||||
let { rules } = jit.generateRules(state, [className.className])
|
let { rules } = jit.generateRules(state, [className.className])
|
||||||
|
|
|
@ -20,7 +20,7 @@ export async function getDocumentColors(
|
||||||
if (settings.tailwindCSS.colorDecorators === false) return colors
|
if (settings.tailwindCSS.colorDecorators === false) return colors
|
||||||
|
|
||||||
let classLists = await findClassListsInDocument(state, document)
|
let classLists = await findClassListsInDocument(state, document)
|
||||||
classLists.flat().forEach((classList) => {
|
classLists.forEach((classList) => {
|
||||||
let classNames = getClassNamesInClassList(classList)
|
let classNames = getClassNamesInClassList(classList)
|
||||||
classNames.forEach((className) => {
|
classNames.forEach((className) => {
|
||||||
let color = getColor(state, className.className)
|
let color = getColor(state, className.className)
|
||||||
|
|
|
@ -77,15 +77,7 @@ export async function findClassNamesInRange(
|
||||||
includeCustom: boolean = true
|
includeCustom: boolean = true
|
||||||
): Promise<DocumentClassName[]> {
|
): Promise<DocumentClassName[]> {
|
||||||
const classLists = await findClassListsInRange(state, doc, range, mode, includeCustom)
|
const classLists = await findClassListsInRange(state, doc, range, mode, includeCustom)
|
||||||
return flatten(
|
return flatten(classLists.map(getClassNamesInClassList))
|
||||||
classLists.flatMap((classList) => {
|
|
||||||
if (Array.isArray(classList)) {
|
|
||||||
return classList.map(getClassNamesInClassList)
|
|
||||||
} else {
|
|
||||||
return [getClassNamesInClassList(classList)]
|
|
||||||
}
|
|
||||||
})
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function findClassNamesInDocument(
|
export async function findClassNamesInDocument(
|
||||||
|
@ -93,15 +85,7 @@ export async function findClassNamesInDocument(
|
||||||
doc: TextDocument
|
doc: TextDocument
|
||||||
): Promise<DocumentClassName[]> {
|
): Promise<DocumentClassName[]> {
|
||||||
const classLists = await findClassListsInDocument(state, doc)
|
const classLists = await findClassListsInDocument(state, doc)
|
||||||
return flatten(
|
return flatten(classLists.map(getClassNamesInClassList))
|
||||||
classLists.flatMap((classList) => {
|
|
||||||
if (Array.isArray(classList)) {
|
|
||||||
return classList.map(getClassNamesInClassList)
|
|
||||||
} else {
|
|
||||||
return [getClassNamesInClassList(classList)]
|
|
||||||
}
|
|
||||||
})
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function findClassListsInCssRange(doc: TextDocument, range?: Range): DocumentClassList[] {
|
export function findClassListsInCssRange(doc: TextDocument, range?: Range): DocumentClassList[] {
|
||||||
|
@ -198,7 +182,7 @@ export async function findClassListsInHtmlRange(
|
||||||
state: State,
|
state: State,
|
||||||
doc: TextDocument,
|
doc: TextDocument,
|
||||||
range?: Range
|
range?: Range
|
||||||
): Promise<Array<DocumentClassList | DocumentClassList[]>> {
|
): Promise<DocumentClassList[]> {
|
||||||
const text = doc.getText(range)
|
const text = doc.getText(range)
|
||||||
|
|
||||||
const matches = matchClassAttributes(
|
const matches = matchClassAttributes(
|
||||||
|
@ -206,7 +190,7 @@ export async function findClassListsInHtmlRange(
|
||||||
(await state.editor.getConfiguration(doc.uri)).tailwindCSS.classAttributes
|
(await state.editor.getConfiguration(doc.uri)).tailwindCSS.classAttributes
|
||||||
)
|
)
|
||||||
|
|
||||||
const result: Array<DocumentClassList | DocumentClassList[]> = []
|
const result: DocumentClassList[] = []
|
||||||
|
|
||||||
matches.forEach((match) => {
|
matches.forEach((match) => {
|
||||||
const subtext = text.substr(match.index + match[0].length - 1)
|
const subtext = text.substr(match.index + match[0].length - 1)
|
||||||
|
@ -217,11 +201,9 @@ export async function findClassListsInHtmlRange(
|
||||||
: getClassAttributeLexer()
|
: getClassAttributeLexer()
|
||||||
lexer.reset(subtext)
|
lexer.reset(subtext)
|
||||||
|
|
||||||
let classLists: Array<{ value: string; offset: number } | { value: string; offset: number }[]> =
|
let classLists: { value: string; offset: number }[] = []
|
||||||
[]
|
let token: moo.Token
|
||||||
let rootClassList: { value: string; offset: number }[] = []
|
|
||||||
let currentClassList: { value: string; offset: number }
|
let currentClassList: { value: string; offset: number }
|
||||||
let depth = 0
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
for (let token of lexer) {
|
for (let token of lexer) {
|
||||||
|
@ -236,69 +218,26 @@ export async function findClassListsInHtmlRange(
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (currentClassList) {
|
if (currentClassList) {
|
||||||
if (depth === 0) {
|
|
||||||
rootClassList.push({
|
|
||||||
value: currentClassList.value,
|
|
||||||
offset: currentClassList.offset,
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
classLists.push({
|
classLists.push({
|
||||||
value: currentClassList.value,
|
value: currentClassList.value,
|
||||||
offset: currentClassList.offset,
|
offset: currentClassList.offset,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
|
||||||
currentClassList = undefined
|
currentClassList = undefined
|
||||||
}
|
}
|
||||||
if (token.type === 'lbrace') {
|
|
||||||
depth += 1
|
|
||||||
} else if (token.type === 'rbrace') {
|
|
||||||
depth -= 1
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (_) {}
|
} catch (_) {}
|
||||||
|
|
||||||
if (currentClassList) {
|
if (currentClassList) {
|
||||||
if (depth === 0) {
|
|
||||||
rootClassList.push({
|
|
||||||
value: currentClassList.value,
|
|
||||||
offset: currentClassList.offset,
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
classLists.push({
|
classLists.push({
|
||||||
value: currentClassList.value,
|
value: currentClassList.value,
|
||||||
offset: currentClassList.offset,
|
offset: currentClassList.offset,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
classLists.push(rootClassList)
|
|
||||||
|
|
||||||
result.push(
|
result.push(
|
||||||
...classLists
|
...classLists
|
||||||
.map((classList) => {
|
.map(({ value, offset }) => {
|
||||||
if (Array.isArray(classList)) {
|
|
||||||
return classList
|
|
||||||
.map((classList) => resolveClassList(classList, text, match, range))
|
|
||||||
.filter((x) => x !== null)
|
|
||||||
} else {
|
|
||||||
return resolveClassList(classList, text, match, range)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.filter((x) => x !== null)
|
|
||||||
)
|
|
||||||
})
|
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
function resolveClassList(
|
|
||||||
classList: { value: string; offset: number },
|
|
||||||
text: string,
|
|
||||||
match: RegExpMatchArray,
|
|
||||||
range?: Range
|
|
||||||
): DocumentClassList {
|
|
||||||
let { value, offset } = classList
|
|
||||||
if (value.trim() === '') {
|
if (value.trim() === '') {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
@ -308,7 +247,10 @@ function resolveClassList(
|
||||||
const after = value.match(/\s*$/)
|
const after = value.match(/\s*$/)
|
||||||
const afterOffset = after === null ? 0 : -after[0].length
|
const afterOffset = after === null ? 0 : -after[0].length
|
||||||
|
|
||||||
const start = indexToPosition(text, match.index + match[0].length - 1 + offset + beforeOffset)
|
const start = indexToPosition(
|
||||||
|
text,
|
||||||
|
match.index + match[0].length - 1 + offset + beforeOffset
|
||||||
|
)
|
||||||
const end = indexToPosition(
|
const end = indexToPosition(
|
||||||
text,
|
text,
|
||||||
match.index + match[0].length - 1 + offset + value.length + afterOffset
|
match.index + match[0].length - 1 + offset + value.length + afterOffset
|
||||||
|
@ -327,6 +269,12 @@ function resolveClassList(
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
})
|
||||||
|
.filter((x) => x !== null)
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function findClassListsInRange(
|
export async function findClassListsInRange(
|
||||||
|
@ -335,8 +283,8 @@ export async function findClassListsInRange(
|
||||||
range?: Range,
|
range?: Range,
|
||||||
mode?: 'html' | 'css',
|
mode?: 'html' | 'css',
|
||||||
includeCustom: boolean = true
|
includeCustom: boolean = true
|
||||||
): Promise<Array<DocumentClassList | DocumentClassList[]>> {
|
): Promise<DocumentClassList[]> {
|
||||||
let classLists: Array<DocumentClassList | DocumentClassList[]>
|
let classLists: DocumentClassList[]
|
||||||
if (mode === 'css') {
|
if (mode === 'css') {
|
||||||
classLists = findClassListsInCssRange(doc, range)
|
classLists = findClassListsInCssRange(doc, range)
|
||||||
} else {
|
} else {
|
||||||
|
@ -348,7 +296,7 @@ export async function findClassListsInRange(
|
||||||
export async function findClassListsInDocument(
|
export async function findClassListsInDocument(
|
||||||
state: State,
|
state: State,
|
||||||
doc: TextDocument
|
doc: TextDocument
|
||||||
): Promise<Array<DocumentClassList | DocumentClassList[]>> {
|
): Promise<DocumentClassList[]> {
|
||||||
if (isCssDoc(state, doc)) {
|
if (isCssDoc(state, doc)) {
|
||||||
return findClassListsInCssRange(doc)
|
return findClassListsInCssRange(doc)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue