Skip to content

Commit 94f6d5b

Browse files
committed
feat: handle workspace.onDidChangeWorkspaceForders
close #1574
1 parent e2090ee commit 94f6d5b

File tree

2 files changed

+38
-19
lines changed

2 files changed

+38
-19
lines changed

Diff for: packages/vue-language-server/src/common.ts

+20-2
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export function createLanguageServer(
3535
) {
3636

3737
let clientCapabilities: vscode.ClientCapabilities;
38+
let projects: ReturnType<typeof createProjects>;
3839

3940
connection.onInitialize(async params => {
4041

@@ -81,10 +82,9 @@ export function createLanguageServer(
8182
if (options.languageFeatures) {
8283

8384
const tsLocalized = runtimeEnv.loadTypescriptLocalized(options);
84-
const projects = createProjects(
85+
projects = createProjects(
8586
runtimeEnv,
8687
languageConfigs,
87-
folders,
8888
ts,
8989
tsLocalized,
9090
options,
@@ -95,6 +95,10 @@ export function createLanguageServer(
9595
params.capabilities,
9696
);
9797

98+
for (const root of folders) {
99+
projects.addRoot(root);
100+
}
101+
98102
(await import('./features/customFeatures')).register(connection, projects);
99103
(await import('./features/languageFeatures')).register(connection, projects, options.languageFeatures, params);
100104
(await import('./registers/registerlanguageFeatures')).register(options.languageFeatures!, vue.getSemanticTokenLegend(), result.capabilities, languageConfigs);
@@ -103,9 +107,23 @@ export function createLanguageServer(
103107
return result;
104108
});
105109
connection.onInitialized(() => {
110+
106111
if (clientCapabilities.workspace?.didChangeConfiguration?.dynamicRegistration) { // TODO
107112
connection.client.register(vscode.DidChangeConfigurationNotification.type);
108113
}
114+
115+
connection.workspace.onDidChangeWorkspaceFolders(e => {
116+
117+
const added = e.added.map(folder => URI.parse(folder.uri)).filter(uri => uri.scheme === 'file').map(uri => uri.fsPath);
118+
const removed = e.removed.map(folder => URI.parse(folder.uri)).filter(uri => uri.scheme === 'file').map(uri => uri.fsPath);
119+
120+
for (const folder of added) {
121+
projects.addRoot(folder);
122+
}
123+
for (const folder of removed) {
124+
projects.removeRoot(folder);
125+
}
126+
});
109127
});
110128
connection.listen();
111129

Diff for: packages/vue-language-server/src/projects.ts

+18-17
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ const rootTsConfigNames = ['tsconfig.json', 'jsconfig.json'];
1414
export function createProjects(
1515
runtimeEnv: RuntimeEnvironment,
1616
languageConfigs: LanguageConfigs,
17-
rootPaths: string[],
1817
ts: typeof import('typescript/lib/tsserverlibrary'),
1918
tsLocalized: ts.MapLike<string> | undefined,
2019
options: shared.ServerInitializationOptions,
@@ -34,22 +33,6 @@ export function createProjects(
3433

3534
const workspaces = new Map<string, ReturnType<typeof createWorkspace>>();
3635

37-
for (const rootPath of rootPaths) {
38-
workspaces.set(rootPath, createWorkspace(
39-
runtimeEnv,
40-
languageConfigs,
41-
rootPath,
42-
ts,
43-
tsLocalized,
44-
options,
45-
documents,
46-
connection,
47-
lsConfigs,
48-
getInferredCompilerOptions,
49-
capabilities,
50-
));
51-
}
52-
5336
documents.onDidOpen(params => {
5437
lastOpenDoc = {
5538
uri: params.textDocument.uri,
@@ -69,6 +52,24 @@ export function createProjects(
6952
workspaces,
7053
getProject,
7154
reloadProject,
55+
addRoot: (rootPath: string) => {
56+
workspaces.set(rootPath, createWorkspace(
57+
runtimeEnv,
58+
languageConfigs,
59+
rootPath,
60+
ts,
61+
tsLocalized,
62+
options,
63+
documents,
64+
connection,
65+
lsConfigs,
66+
getInferredCompilerOptions,
67+
capabilities,
68+
));
69+
},
70+
removeRoot: (rootPath: string) => {
71+
workspaces.delete(rootPath);
72+
},
7273
};
7374

7475
async function onDidChangeContent(uri: string) {

0 commit comments

Comments
 (0)