Skip to content

Commit 3cf5cb4

Browse files
vojvodicsMarcus Tillmanns
authored andcommitted
Spawn multiple language servers to make extension work in Multi Root workspace
1 parent 8f07f79 commit 3cf5cb4

File tree

3 files changed

+32
-5
lines changed

3 files changed

+32
-5
lines changed

client/client.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,22 @@ import {
99
import { resolve } from 'path';
1010
import { existsSync } from 'fs';
1111

12-
export function initializeLanguageClient(vlsModulePath: string, globalSnippetDir: string): LanguageClient {
12+
export function initializeLanguageClient(
13+
vlsModulePath: string,
14+
globalSnippetDir: string,
15+
workspaceFolder?: vscode.WorkspaceFolder
16+
): LanguageClient {
1317
const debugOptions = { execArgv: ['--nolazy', '--inspect=6005'] };
1418

15-
const documentSelector = ['vue'];
19+
const documentSelector = workspaceFolder
20+
? [
21+
{
22+
language: 'vue',
23+
scheme: 'file',
24+
pattern: `${workspaceFolder.uri.fsPath}/**/*`
25+
}
26+
]
27+
: ['vue'];
1628
const config = vscode.workspace.getConfiguration();
1729

1830
let serverPath;
@@ -56,7 +68,8 @@ export function initializeLanguageClient(vlsModulePath: string, globalSnippetDir
5668
config,
5769
globalSnippetDir
5870
},
59-
revealOutputChannelOn: RevealOutputChannelOn.Never
71+
revealOutputChannelOn: RevealOutputChannelOn.Never,
72+
workspaceFolder
6073
};
6174

6275
return new LanguageClient('vetur', 'Vue Language Server', serverOptions, clientOptions);

client/vueMain.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as vscode from 'vscode';
2-
import { LanguageClient, WorkspaceEdit } from 'vscode-languageclient';
2+
import { LanguageClient, WorkspaceEdit, WorkspaceFolder } from 'vscode-languageclient';
33
import { generateGrammarCommandHandler } from './commands/generateGrammarCommand';
44
import { registerLanguageConfigurations } from './languages';
55
import { initializeLanguageClient } from './client';
@@ -12,6 +12,11 @@ import {
1212
import { getGlobalSnippetDir } from './userSnippetDir';
1313
import { generateOpenUserScaffoldSnippetFolderCommand } from './commands/openUserScaffoldSnippetFolderCommand';
1414

15+
/**
16+
* Map of workspace folder URI -> LanguageClient
17+
*/
18+
const clients = new Map<string, LanguageClient>();
19+
1520
export async function activate(context: vscode.ExtensionContext) {
1621
const isInsiders = vscode.env.appName.includes('Insiders');
1722
const globalSnippetDir = getGlobalSnippetDir(isInsiders);
@@ -28,6 +33,15 @@ export async function activate(context: vscode.ExtensionContext) {
2833
vscode.commands.registerCommand('vetur.generateGrammar', generateGrammarCommandHandler(context.extensionPath))
2934
);
3035

36+
registerLanguageConfigurations();
37+
38+
/**
39+
* Vue Language Server path
40+
* To be able to work with multiple workspaces, we initialize one language service per workspace folder
41+
*/
42+
43+
const serverModule = context.asAbsolutePath(join('server', 'dist', 'vueServerMain.js'));
44+
3145
/**
3246
* Open custom snippet folder
3347
*/

server/src/vueServerMain.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ connection.onInitialize(
1111
async (params: InitializeParams): Promise<InitializeResult> => {
1212
await vls.init(params);
1313

14-
console.log('Vetur initialized');
14+
console.log(`Vetur initialized for workspace folder: ${params.rootPath}`);
1515

1616
return {
1717
capabilities: vls.capabilities

0 commit comments

Comments
 (0)