boot language clients lazily
parent
99297add4e
commit
ce761ba6bc
|
@ -16,6 +16,7 @@ import {
|
||||||
Position,
|
Position,
|
||||||
Range,
|
Range,
|
||||||
TextEditorDecorationType,
|
TextEditorDecorationType,
|
||||||
|
RelativePattern,
|
||||||
} from 'vscode'
|
} from 'vscode'
|
||||||
import { LanguageClient, LanguageClientOptions, TransportKind } from 'vscode-languageclient/node'
|
import { LanguageClient, LanguageClientOptions, TransportKind } from 'vscode-languageclient/node'
|
||||||
import { DEFAULT_LANGUAGES } from './lib/languages'
|
import { DEFAULT_LANGUAGES } from './lib/languages'
|
||||||
|
@ -28,8 +29,11 @@ const colorNames = Object.keys(namedColors)
|
||||||
const CLIENT_ID = 'tailwindcss-intellisense'
|
const CLIENT_ID = 'tailwindcss-intellisense'
|
||||||
const CLIENT_NAME = 'Tailwind CSS IntelliSense'
|
const CLIENT_NAME = 'Tailwind CSS IntelliSense'
|
||||||
|
|
||||||
|
const CONFIG_FILE_GLOB = 'tailwind.config.{js,cjs}'
|
||||||
|
|
||||||
let clients: Map<string, LanguageClient> = new Map()
|
let clients: Map<string, LanguageClient> = new Map()
|
||||||
let languages: Map<string, string[]> = new Map()
|
let languages: Map<string, string[]> = new Map()
|
||||||
|
let searchedFolders: Set<string> = new Set()
|
||||||
|
|
||||||
let _sortedWorkspaceFolders: string[] | undefined
|
let _sortedWorkspaceFolders: string[] | undefined
|
||||||
function sortedWorkspaceFolders(): string[] {
|
function sortedWorkspaceFolders(): string[] {
|
||||||
|
@ -83,6 +87,19 @@ export function activate(context: ExtensionContext) {
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
|
|
||||||
|
let watcher = Workspace.createFileSystemWatcher(`**/${CONFIG_FILE_GLOB}`, false, true, true)
|
||||||
|
|
||||||
|
watcher.onDidCreate((uri) => {
|
||||||
|
let folder = Workspace.getWorkspaceFolder(uri)
|
||||||
|
if (!folder) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
folder = getOuterMostWorkspaceFolder(folder)
|
||||||
|
bootWorkspaceClient(folder)
|
||||||
|
})
|
||||||
|
|
||||||
|
context.subscriptions.push(watcher)
|
||||||
|
|
||||||
// TODO: check if the actual language MAPPING changed
|
// TODO: check if the actual language MAPPING changed
|
||||||
// not just the language IDs
|
// not just the language IDs
|
||||||
// e.g. "plaintext" already exists but you change it from "html" to "css"
|
// e.g. "plaintext" already exists but you change it from "html" to "css"
|
||||||
|
@ -117,6 +134,13 @@ export function activate(context: ExtensionContext) {
|
||||||
// placeholder so we don't boot another server before this one is ready
|
// placeholder so we don't boot another server before this one is ready
|
||||||
clients.set(folder.uri.toString(), null)
|
clients.set(folder.uri.toString(), null)
|
||||||
|
|
||||||
|
if (!languages.has(folder.uri.toString())) {
|
||||||
|
languages.set(
|
||||||
|
folder.uri.toString(),
|
||||||
|
dedupe([...DEFAULT_LANGUAGES, ...Object.keys(getUserLanguages(folder))])
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
let debugOptions = {
|
let debugOptions = {
|
||||||
execArgv: ['--nolazy', `--inspect=${6011 + clients.size}`],
|
execArgv: ['--nolazy', `--inspect=${6011 + clients.size}`],
|
||||||
}
|
}
|
||||||
|
@ -255,6 +279,7 @@ export function activate(context: ExtensionContext) {
|
||||||
configurationSection: ['editor', 'tailwindCSS'],
|
configurationSection: ['editor', 'tailwindCSS'],
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
let client = new LanguageClient(CLIENT_ID, CLIENT_NAME, serverOptions, clientOptions)
|
let client = new LanguageClient(CLIENT_ID, CLIENT_NAME, serverOptions, clientOptions)
|
||||||
|
|
||||||
client.onReady().then(() => {
|
client.onReady().then(() => {
|
||||||
|
@ -284,7 +309,7 @@ export function activate(context: ExtensionContext) {
|
||||||
clients.set(folder.uri.toString(), client)
|
clients.set(folder.uri.toString(), client)
|
||||||
}
|
}
|
||||||
|
|
||||||
function didOpenTextDocument(document: TextDocument): void {
|
async function didOpenTextDocument(document: TextDocument): Promise<void> {
|
||||||
// We are only interested in language mode text
|
// We are only interested in language mode text
|
||||||
if (document.uri.scheme !== 'file') {
|
if (document.uri.scheme !== 'file') {
|
||||||
return
|
return
|
||||||
|
@ -300,11 +325,18 @@ export function activate(context: ExtensionContext) {
|
||||||
// If we have nested workspace folders we only start a server on the outer most workspace folder.
|
// If we have nested workspace folders we only start a server on the outer most workspace folder.
|
||||||
folder = getOuterMostWorkspaceFolder(folder)
|
folder = getOuterMostWorkspaceFolder(folder)
|
||||||
|
|
||||||
if (!languages.has(folder.uri.toString())) {
|
if (searchedFolders.has(folder.uri.toString())) return
|
||||||
languages.set(
|
|
||||||
folder.uri.toString(),
|
searchedFolders.add(folder.uri.toString())
|
||||||
dedupe([...DEFAULT_LANGUAGES, ...Object.keys(getUserLanguages())])
|
|
||||||
|
let [configFile] = await Workspace.findFiles(
|
||||||
|
new RelativePattern(folder, `**/${CONFIG_FILE_GLOB}`),
|
||||||
|
'**/node_modules/**',
|
||||||
|
1
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if (!configFile) {
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
bootWorkspaceClient(folder)
|
bootWorkspaceClient(folder)
|
||||||
|
@ -316,6 +348,7 @@ export function activate(context: ExtensionContext) {
|
||||||
for (let folder of event.removed) {
|
for (let folder of event.removed) {
|
||||||
let client = clients.get(folder.uri.toString())
|
let client = clients.get(folder.uri.toString())
|
||||||
if (client) {
|
if (client) {
|
||||||
|
searchedFolders.delete(folder.uri.toString())
|
||||||
clients.delete(folder.uri.toString())
|
clients.delete(folder.uri.toString())
|
||||||
client.stop()
|
client.stop()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue