Revert "Improve conflict diagnostics (#503)" (#525)

This reverts commit ddfaea21cc.
master
Brad Cornes 2022-04-13 22:24:02 +01:00 committed by GitHub
parent 055b8909af
commit 183cc2f863
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 51 additions and 105 deletions

View File

@ -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) {

View File

@ -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])

View File

@ -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)

View File

@ -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,53 +218,56 @@ export async function findClassListsInHtmlRange(
} }
} else { } else {
if (currentClassList) { if (currentClassList) {
if (depth === 0) { classLists.push({
rootClassList.push({ value: currentClassList.value,
value: currentClassList.value, offset: currentClassList.offset,
offset: currentClassList.offset, })
})
} else {
classLists.push({
value: currentClassList.value,
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) { classLists.push({
rootClassList.push({ value: currentClassList.value,
value: currentClassList.value, offset: currentClassList.offset,
offset: currentClassList.offset, })
})
} else {
classLists.push({
value: currentClassList.value,
offset: currentClassList.offset,
})
}
} }
classLists.push(rootClassList)
result.push( result.push(
...classLists ...classLists
.map((classList) => { .map(({ value, offset }) => {
if (Array.isArray(classList)) { if (value.trim() === '') {
return classList return null
.map((classList) => resolveClassList(classList, text, match, range)) }
.filter((x) => x !== null)
} else { const before = value.match(/^\s*/)
return resolveClassList(classList, text, match, range) const beforeOffset = before === null ? 0 : before[0].length
const after = value.match(/\s*$/)
const afterOffset = after === null ? 0 : -after[0].length
const start = indexToPosition(
text,
match.index + match[0].length - 1 + offset + beforeOffset
)
const end = indexToPosition(
text,
match.index + match[0].length - 1 + offset + value.length + afterOffset
)
return {
classList: value.substr(beforeOffset, value.length + afterOffset),
range: {
start: {
line: (range?.start.line || 0) + start.line,
character: (end.line === 0 ? range?.start.character || 0 : 0) + start.character,
},
end: {
line: (range?.start.line || 0) + end.line,
character: (end.line === 0 ? range?.start.character || 0 : 0) + end.character,
},
},
} }
}) })
.filter((x) => x !== null) .filter((x) => x !== null)
@ -292,51 +277,14 @@ export async function findClassListsInHtmlRange(
return result return result
} }
function resolveClassList(
classList: { value: string; offset: number },
text: string,
match: RegExpMatchArray,
range?: Range
): DocumentClassList {
let { value, offset } = classList
if (value.trim() === '') {
return null
}
const before = value.match(/^\s*/)
const beforeOffset = before === null ? 0 : before[0].length
const after = value.match(/\s*$/)
const afterOffset = after === null ? 0 : -after[0].length
const start = indexToPosition(text, match.index + match[0].length - 1 + offset + beforeOffset)
const end = indexToPosition(
text,
match.index + match[0].length - 1 + offset + value.length + afterOffset
)
return {
classList: value.substr(beforeOffset, value.length + afterOffset),
range: {
start: {
line: (range?.start.line || 0) + start.line,
character: (end.line === 0 ? range?.start.character || 0 : 0) + start.character,
},
end: {
line: (range?.start.line || 0) + end.line,
character: (end.line === 0 ? range?.start.character || 0 : 0) + end.character,
},
},
}
}
export async function findClassListsInRange( export async function findClassListsInRange(
state: State, state: State,
doc: TextDocument, doc: TextDocument,
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)
} }