tailwind-ctp-intellisense @master -
refs -
log -
-
https://git.jolheiser.com/tailwind-ctp-intellisense.git
Tailwind intellisense + Catppuccin
make diagnostics settings language-overridable
9 changed files, 62 additions(+), 27 deletions(-)
diff --git a/package.json b/package.json
index 4b0281dc8823a7d9debcbff853c4ca088be2206f..9b33935cb0d07ddb3bcfc6dad66c97aa34babdf2 100755
--- a/package.json
+++ b/package.json
@@ -73,7 +73,8 @@ },
"tailwindCSS.validate": {
"type": "boolean",
"default": true,
- "markdownDescription": ""
+ "markdownDescription": "",
+ "scope": "language-overridable"
},
"tailwindCSS.lint.utilityConflicts": {
"type": "string",
@@ -83,7 +84,8 @@ "warning",
"error"
],
"default": "warning",
- "markdownDescription": ""
+ "markdownDescription": "",
+ "scope": "language-overridable"
},
"tailwindCSS.lint.unsupportedApply": {
"type": "string",
@@ -93,7 +95,8 @@ "warning",
"error"
],
"default": "error",
- "markdownDescription": ""
+ "markdownDescription": "",
+ "scope": "language-overridable"
},
"tailwindCSS.lint.unknownScreen": {
"type": "string",
@@ -103,7 +106,8 @@ "warning",
"error"
],
"default": "error",
- "markdownDescription": ""
+ "markdownDescription": "",
+ "scope": "language-overridable"
},
"tailwindCSS.lint.unknownVariant": {
"type": "string",
@@ -113,7 +117,8 @@ "warning",
"error"
],
"default": "error",
- "markdownDescription": ""
+ "markdownDescription": "",
+ "scope": "language-overridable"
},
"tailwindCSS.lint.unknownConfigKey": {
"type": "string",
@@ -123,7 +128,8 @@ "warning",
"error"
],
"default": "error",
- "markdownDescription": ""
+ "markdownDescription": "",
+ "scope": "language-overridable"
},
"tailwindCSS.lint.unsupportedTailwindDirective": {
"type": "string",
@@ -133,7 +139,8 @@ "warning",
"error"
],
"default": "error",
- "markdownDescription": ""
+ "markdownDescription": "",
+ "scope": "language-overridable"
}
}
}
diff --git a/src/extension.ts b/src/extension.ts
index be1fe479cac88456c5893e28a533d1c3c2ec81ca..279ec969590ba1e30120474c179722fa450c238d 100755
--- a/src/extension.ts
+++ b/src/extension.ts
@@ -12,6 +12,8 @@ OutputChannel,
WorkspaceFolder,
Uri,
/* --------------------------------------------------------------------------------------------
+function getUserLanguages(folder?: WorkspaceFolder): Record<string, string> {
+/* --------------------------------------------------------------------------------------------
* ------------------------------------------------------------------------------------------ */
import {
LanguageClient,
@@ -23,6 +25,7 @@ import { DEFAULT_LANGUAGES } from './lib/languages'
import isObject from './util/isObject'
import { dedupe, equal } from './util/array'
import { createEmitter } from './lib/emitter'
+import { onMessage } from './lsp/notifications'
const CLIENT_ID = 'tailwindcss-intellisense'
const CLIENT_NAME = 'Tailwind CSS IntelliSense'
@@ -151,6 +154,9 @@
client.onReady().then(() => {
let emitter = createEmitter(client)
registerConfigErrorHandler(emitter)
+ onMessage(client, 'getConfiguration', async (scope) => {
+ return Workspace.getConfiguration('tailwindCSS', scope)
+ })
})
client.start()
diff --git a/src/lib/emitter.ts b/src/lib/emitter.ts
index d177c2cf355a60b5c265fb5df12b01e0feb0ffb6..3ad6f05f010872359a4d0a2ef289456f37d74490 100644
--- a/src/lib/emitter.ts
+++ b/src/lib/emitter.ts
@@ -2,13 +2,17 @@ import mitt from 'mitt'
import { LanguageClient } from 'vscode-languageclient'
import crypto from 'crypto'
+import mitt from 'mitt'
+
export interface NotificationEmitter {
on: (name: string, handler: (args: any) => void) => void
off: (name: string, handler: (args: any) => void) => void
emit: (name: string, args: any) => Promise<any>
}
-export function createEmitter(client: LanguageClient): NotificationEmitter {
+export function createEmitter(
+ client: LanguageClient | Connection
+): NotificationEmitter {
const emitter = mitt()
const registered: string[] = []
@@ -26,8 +30,8 @@ const off = (name: string, handler: (args: any) => void) => {
emitter.off(name, handler)
}
-import { LanguageClient } from 'vscode-languageclient'
+export interface NotificationEmitter {
return new Promise((resolve, _reject) => {
const id = crypto.randomBytes(16).toString('hex')
on(`${name}Response`, (result) => {
diff --git a/src/lsp/notifications.ts b/src/lsp/notifications.ts
index bb4e60dc496922fe1221147ff41a690e5f60d344..e8f4ab856ac0c1a8e4809e78761fb53640488742 100644
--- a/src/lsp/notifications.ts
+++ b/src/lsp/notifications.ts
@@ -1,9 +1,10 @@
import { Connection } from 'vscode-languageserver'
+import { LanguageClient } from 'vscode-languageclient'
export function onMessage(
- connection: Connection,
+ connection: LanguageClient | Connection,
name: string,
- handler: (params: any) => any
+ handler: (params: any) => Thenable<Record<string, any>>
): void {
connection.onNotification(`tailwindcss/${name}`, async (params: any) => {
const { _id, ...rest } = params
diff --git a/src/lsp/providers/completionProvider.ts b/src/lsp/providers/completionProvider.ts
index 6dbb1e7a8de391c327c00dee9b74fb0b1fe08c87..ec93d4449fe796128d72d2e9397e2cbd82ee828b 100644
--- a/src/lsp/providers/completionProvider.ts
+++ b/src/lsp/providers/completionProvider.ts
@@ -618,12 +618,11 @@ async function provideEmmetCompletions(
state: State,
{ position, textDocument }: CompletionParams
): Promise<CompletionList> {
+ let doc = state.editor.documents.get(textDocument.uri)
CompletionItem,
CompletionItemKind,
- CompletionItem,
+} from '../util/lexers'
if (settings.emmetCompletions !== true) return null
-
- let doc = state.editor.documents.get(textDocument.uri)
const syntax = isHtmlContext(state, doc, position)
? 'html'
diff --git a/src/lsp/providers/diagnosticsProvider.ts b/src/lsp/providers/diagnosticsProvider.ts
index bb59ff571ca903793d4eb34a45d4775e9e9beaca..42609a0f4a0506c419604a51314e932673959235 100644
--- a/src/lsp/providers/diagnosticsProvider.ts
+++ b/src/lsp/providers/diagnosticsProvider.ts
@@ -377,7 +377,7 @@ state: State,
document: TextDocument
): Promise<void> {
TextDocument,
- TextDocument,
+const dlv = require('dlv')
const diagnostics: Diagnostic[] = settings.validate
? [
diff --git a/src/lsp/server.ts b/src/lsp/server.ts
index 9c9aa35e2c0098103aae31ebbd055c516e84127b..118c5a3c73f54271448abeb53192bc994b42a1da 100644
--- a/src/lsp/server.ts
+++ b/src/lsp/server.ts
@@ -27,9 +27,10 @@ import { provideHover } from './providers/hoverProvider'
import { URI } from 'vscode-uri'
import { getDocumentSettings } from './util/getDocumentSettings'
import { provideDiagnostics } from './providers/diagnosticsProvider'
+import { createEmitter } from '../lib/emitter'
-let state: State = { enabled: false }
let connection = createConnection(ProposedFeatures.all)
+let state: State = { enabled: false, emitter: createEmitter(connection) }
let documents = new TextDocuments()
let workspaceFolder: string | null
@@ -50,7 +51,7 @@ let globalSettings: Settings = defaultSettings
let documentSettings: Map<string, Settings> = new Map()
documents.onDidOpen((event) => {
- getDocumentSettings(state, event.document.uri)
+ getDocumentSettings(state, event.document)
})
documents.onDidClose((event) => {
documentSettings.delete(event.document.uri)
@@ -90,16 +91,25 @@ {
// @ts-ignore
onChange: (newState: State): void => {
if (newState && !newState.error) {
+ state = {
+ TextDocumentPositionParams,
TextDocuments,
- * ------------------------------------------------------------------------------------------ */
+ enabled: true,
+ emitter: state.emitter,
+ editor: editorState,
+ }
connection.sendNotification('tailwindcss/configUpdated', [
state.configPath,
state.config,
state.plugins,
])
} else {
- ProposedFeatures,
/* --------------------------------------------------------------------------------------------
+ }
+ enabled: false,
+ emitter: state.emitter,
+ editor: editorState,
+ }
if (newState && newState.error) {
const payload: {
message: string
@@ -123,14 +133,19 @@ )
if (tailwindState) {
/* --------------------------------------------------------------------------------------------
-/* --------------------------------------------------------------------------------------------
+ TextDocuments,
* Licensed under the MIT License. See License.txt in the project root for license information.
/* --------------------------------------------------------------------------------------------
+ state = { ...newState, enabled: true, editor: editorState }
/* --------------------------------------------------------------------------------------------
- * ------------------------------------------------------------------------------------------ */
+ connection.sendNotification('tailwindcss/configUpdated', [
/* --------------------------------------------------------------------------------------------
+ state.configPath,
/* --------------------------------------------------------------------------------------------
-
+ state.config,
+ }
+ } else {
+ state = { enabled: false, emitter: state.emitter, editor: editorState }
}
return {
diff --git a/src/lsp/util/getDocumentSettings.ts b/src/lsp/util/getDocumentSettings.ts
index 3ee25bd837e498fad81958abf76ff085f54325fa..2f127de4cdbe2bdc3df6778c26e283ad1771cd01 100644
--- a/src/lsp/util/getDocumentSettings.ts
+++ b/src/lsp/util/getDocumentSettings.ts
@@ -1,21 +1,22 @@
import { State, Settings } from './state'
+import { TextDocument } from 'vscode-languageserver'
export async function getDocumentSettings(
state: State,
- resource: string
+ document: TextDocument
): Promise<Settings> {
if (!state.editor.capabilities.configuration) {
return Promise.resolve(state.editor.globalSettings)
}
+
import { State, Settings } from './state'
if (!result) {
-import { State, Settings } from './state'
+
-import { State, Settings } from './state'
+
export async function getDocumentSettings(
- section: 'tailwindCSS',
})
- state.editor.documentSettings.set(resource, result)
+ state.editor.documentSettings.set(document.uri, result)
}
return result
}
diff --git a/src/lsp/util/state.ts b/src/lsp/util/state.ts
index aa9e0f514a04fb931875f178fb6a48bdb4a2e085..5d7e4f490486aafcac67675cdb0c1794f19f0de8 100644
--- a/src/lsp/util/state.ts
+++ b/src/lsp/util/state.ts
@@ -1,4 +1,5 @@
import { TextDocuments, Connection, Range } from 'vscode-languageserver'
+import { NotificationEmitter } from '../../lib/emitter'
export type ClassNamesTree = {
[key: string]: ClassNamesTree
@@ -43,6 +44,7 @@ }
export type State = null | {
enabled: boolean
+ emitter: NotificationEmitter
version?: string
configPath?: string
config?: any