From d09a4b11f1da3d5b8bab1482767a65c5a2fc8538 Mon Sep 17 00:00:00 2001 From: Brad Cornes Date: Wed, 6 Jul 2022 16:40:29 +0100 Subject: [PATCH] Deduplicate classlist candidates (#572) --- .../src/util/find.ts | 37 +++++++++++++------ .../src/util/rangesEqual.ts | 2 +- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/packages/tailwindcss-language-service/src/util/find.ts b/packages/tailwindcss-language-service/src/util/find.ts index 299f777..b0a4196 100644 --- a/packages/tailwindcss-language-service/src/util/find.ts +++ b/packages/tailwindcss-language-service/src/util/find.ts @@ -11,6 +11,7 @@ import { getLanguageBoundaries } from './getLanguageBoundaries' import { resolveRange } from './resolveRange' import dlv from 'dlv' import { createMultiRegexp } from './createMultiRegexp' +import { rangesEqual } from './rangesEqual' export function findAll(re: RegExp, str: string): RegExpMatchArray[] { let match: RegExpMatchArray @@ -277,6 +278,13 @@ export async function findClassListsInHtmlRange( return result } +function dedupeClassLists(classLists: DocumentClassList[]): DocumentClassList[] { + return classLists.filter( + (classList, classListIndex) => + classListIndex === classLists.findIndex((c) => rangesEqual(c.range, classList.range)) + ) +} + export async function findClassListsInRange( state: State, doc: TextDocument, @@ -290,7 +298,10 @@ export async function findClassListsInRange( } else { classLists = await findClassListsInHtmlRange(state, doc, range) } - return [...classLists, ...(includeCustom ? await findCustomClassLists(state, doc, range) : [])] + return dedupeClassLists([ + ...classLists, + ...(includeCustom ? await findCustomClassLists(state, doc, range) : []), + ]) } export async function findClassListsInDocument( @@ -304,17 +315,19 @@ export async function findClassListsInDocument( let boundaries = getLanguageBoundaries(state, doc) if (!boundaries) return [] - return flatten([ - ...(await Promise.all( - boundaries - .filter((b) => b.type === 'html' || b.type === 'jsx') - .map(({ range }) => findClassListsInHtmlRange(state, doc, range)) - )), - ...boundaries - .filter((b) => b.type === 'css') - .map(({ range }) => findClassListsInCssRange(doc, range)), - await findCustomClassLists(state, doc), - ]) + return dedupeClassLists( + flatten([ + ...(await Promise.all( + boundaries + .filter((b) => b.type === 'html' || b.type === 'jsx') + .map(({ range }) => findClassListsInHtmlRange(state, doc, range)) + )), + ...boundaries + .filter((b) => b.type === 'css') + .map(({ range }) => findClassListsInCssRange(doc, range)), + await findCustomClassLists(state, doc), + ]) + ) } export function findHelperFunctionsInDocument( diff --git a/packages/tailwindcss-language-service/src/util/rangesEqual.ts b/packages/tailwindcss-language-service/src/util/rangesEqual.ts index 220cebd..0d96655 100644 --- a/packages/tailwindcss-language-service/src/util/rangesEqual.ts +++ b/packages/tailwindcss-language-service/src/util/rangesEqual.ts @@ -1,4 +1,4 @@ -import { Range } from 'vscode-languageserver' +import type { Range } from 'vscode-languageserver' export function rangesEqual(a: Range, b: Range): boolean { return (