Skip to content

Commit 4cee488

Browse files
committed
fix @​variants completions/diagnostics in JIT mode (fixes #324)
1 parent 533c2a0 commit 4cee488

File tree

6 files changed

+23
-12
lines changed

6 files changed

+23
-12
lines changed

packages/tailwindcss-language-service/src/codeActions/provideInvalidApplyCodeActions.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -176,16 +176,13 @@ function classNameToAst(
176176
let context = meta.context
177177
let pseudo = meta.pseudo
178178
const globalContexts = state.classNames.context
179-
let screens = dlv(state.config, 'theme.screens', dlv(state.config, 'screens', {}))
180-
if (!isObject(screens)) screens = {}
181-
screens = Object.keys(screens)
182179
const path = []
183180

184181
for (let i = 0; i < classNameParts.length - 1; i++) {
185182
let part = classNameParts[i]
186183
let common = globalContexts[part]
187184
if (!common) return null
188-
if (screens.includes(part)) {
185+
if (state.screens.includes(part)) {
189186
path.push(`@screen ${part}`)
190187
context = context.filter((con) => !common.includes(con))
191188
}

packages/tailwindcss-language-service/src/completionProvider.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -633,11 +633,17 @@ function provideVariantsDirectiveCompletions(
633633

634634
if (/\s+/.test(parts[parts.length - 1])) return null
635635

636+
let possibleVariants = Object.keys(state.variants)
636637
const existingVariants = parts.slice(0, parts.length - 1)
637638

639+
if (state.jit) {
640+
possibleVariants.unshift('responsive')
641+
possibleVariants = possibleVariants.filter((v) => !state.screens.includes(v))
642+
}
643+
638644
return {
639645
isIncomplete: false,
640-
items: Object.keys(state.variants)
646+
items: possibleVariants
641647
.filter((v) => existingVariants.indexOf(v) === -1)
642648
.map((variant, index) => ({
643649
// TODO: detail

packages/tailwindcss-language-service/src/diagnostics/getInvalidScreenDiagnostics.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,14 @@ export function getInvalidScreenDiagnostics(
3131
let text = document.getText(range)
3232
let matches = findAll(/(?:\s|^)@screen\s+(?<screen>[^\s{]+)/g, text)
3333

34-
let screens = Object.keys(dlv(state.config, 'theme.screens', dlv(state.config, 'screens', {})))
35-
3634
matches.forEach((match) => {
37-
if (screens.includes(match.groups.screen)) {
35+
if (state.screens.includes(match.groups.screen)) {
3836
return null
3937
}
4038

4139
let message = `The screen '${match.groups.screen}' does not exist in your theme config.`
4240
let suggestions: string[] = []
43-
let suggestion = closest(match.groups.screen, screens)
41+
let suggestion = closest(match.groups.screen, state.screens)
4442

4543
if (suggestion) {
4644
suggestions.push(suggestion)

packages/tailwindcss-language-service/src/diagnostics/getInvalidVariantDiagnostics.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { getLanguageBoundaries } from '../util/getLanguageBoundaries'
66
import { findAll, indexToPosition } from '../util/find'
77
import { closest } from '../util/closest'
88
import { absoluteRange } from '../util/absoluteRange'
9+
import dlv from 'dlv'
910

1011
export function getInvalidVariantDiagnostics(
1112
state: State,
@@ -26,6 +27,12 @@ export function getInvalidVariantDiagnostics(
2627
ranges.push(...boundaries.css)
2728
}
2829

30+
let possibleVariants = Object.keys(state.variants)
31+
if (state.jit) {
32+
possibleVariants.unshift('responsive')
33+
possibleVariants = possibleVariants.filter((v) => !state.screens.includes(v))
34+
}
35+
2936
ranges.forEach((range) => {
3037
let text = document.getText(range)
3138
let matches = findAll(/(?:\s|^)@variants\s+(?<variants>[^{]+)/g, text)
@@ -36,13 +43,13 @@ export function getInvalidVariantDiagnostics(
3643

3744
for (let i = 0; i < variants.length; i += 2) {
3845
let variant = variants[i].trim()
39-
if (Object.keys(state.variants).includes(variant)) {
46+
if (possibleVariants.includes(variant)) {
4047
continue
4148
}
4249

4350
let message = `The variant '${variant}' does not exist.`
4451
let suggestions: string[] = []
45-
let suggestion = closest(variant, Object.keys(state.variants))
52+
let suggestion = closest(variant, possibleVariants)
4653

4754
if (suggestion) {
4855
suggestions.push(suggestion)

packages/tailwindcss-language-service/src/util/state.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ export interface State {
7070
separator?: string
7171
dependencies?: string[]
7272
plugins?: any
73+
screens?: string[]
7374
variants?: Record<string, string | null>
7475
modules?: {
7576
tailwindcss?: { version: string; module: any }

src/server.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -712,9 +712,11 @@ async function createProjectService(
712712
state.separator = typeof userSeperator === 'string' ? userSeperator : ':'
713713
state.plugins = await getPlugins(config)
714714
state.classNames = (await extractClassNames(postcssResult.root)) as ClassNames
715-
716715
state.variants = getVariants(state)
717716

717+
let screens = dlv(state.config, 'theme.screens', dlv(state.config, 'screens', {}))
718+
state.screens = isObject(screens) ? Object.keys(screens) : []
719+
718720
state.enabled = true
719721

720722
updateAllDiagnostics(state)

0 commit comments

Comments
 (0)