Skip to content

Commit 9bd8cd0

Browse files
committed
refactor: use language server for config
1 parent 707ea22 commit 9bd8cd0

File tree

6 files changed

+198
-252
lines changed

6 files changed

+198
-252
lines changed
Lines changed: 35 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as vscode from "vscode";
22
import addonManager from "../services/addonManager.service";
33
import { createChildLogger } from "../services/logging.service";
4-
import { setSetting } from "../services/settings.service";
4+
import { setConfig } from "../../languageserver";
55

66
type Message = {
77
data: {
@@ -15,49 +15,40 @@ export default async (context: vscode.ExtensionContext, message: Message) => {
1515
const addon = addonManager.addons.get(message.data.name);
1616
const workspaceFolders = vscode.workspace.workspaceFolders;
1717

18-
try {
19-
if (workspaceFolders.length === 1) {
20-
await addon.disable(workspaceFolders[0]);
21-
} else {
22-
const folderOptions = await (
23-
await addon.getEnabled()
24-
)
25-
.filter((entry) => entry.enabled === true)
26-
.map((entry) => {
27-
return {
28-
label: entry.folder.name,
29-
detail: entry.folder.uri.path,
30-
};
31-
});
32-
const targetFolders = await vscode.window.showQuickPick(
33-
folderOptions,
34-
{
35-
canPickMany: true,
36-
ignoreFocusOut: true,
37-
title: `Disable ${addon.name} in which folders?`,
38-
}
39-
);
40-
if (!targetFolders) {
41-
localLogger.warn("User did not pick workspace folder");
42-
await addon.setLock(false);
43-
return;
44-
}
45-
for (const target of targetFolders) {
46-
const folder = workspaceFolders.find(
47-
(folder) => folder.name === target.label
48-
);
49-
await addon.disable(folder);
50-
await setSetting(
51-
folder,
52-
"Lua.workspace.checkThirdParty",
53-
false
54-
);
55-
}
18+
let selectedFolders: vscode.WorkspaceFolder[];
19+
20+
if (workspaceFolders.length === 1) {
21+
selectedFolders = [workspaceFolders[0]];
22+
} else {
23+
const folderOptions = await addon.getQuickPickerOptions(true);
24+
const pickResult = await vscode.window.showQuickPick(folderOptions, {
25+
canPickMany: true,
26+
ignoreFocusOut: true,
27+
title: `Disable ${addon.name} in which folders?`,
28+
});
29+
if (!pickResult) {
30+
localLogger.warn("User did not pick workspace folder");
31+
await addon.setLock(false);
32+
return;
5633
}
57-
} catch (e) {
58-
localLogger.error(e);
59-
return;
60-
} finally {
61-
await addon.setLock(false);
34+
selectedFolders = pickResult.map((selection) => {
35+
return workspaceFolders.find(
36+
(folder) => folder.name === selection.label
37+
);
38+
});
6239
}
40+
41+
for (const folder of selectedFolders) {
42+
await addon.disable(folder);
43+
await setConfig([
44+
{
45+
action: "set",
46+
key: "Lua.workspace.checkThirdParty",
47+
value: false,
48+
uri: folder.uri,
49+
},
50+
]);
51+
}
52+
53+
return addon.setLock(false);
6354
};
Lines changed: 34 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as vscode from "vscode";
22
import addonManager from "../services/addonManager.service";
33
import { createChildLogger } from "../services/logging.service";
4-
import { setSetting } from "../services/settings.service";
4+
import { setConfig } from "../../languageserver";
55

66
type Message = {
77
data: {
@@ -14,52 +14,41 @@ const localLogger = createChildLogger("Enable Addon");
1414
export default async (context: vscode.ExtensionContext, message: Message) => {
1515
const addon = addonManager.addons.get(message.data.name);
1616
const workspaceFolders = vscode.workspace.workspaceFolders;
17+
let selectedFolders: vscode.WorkspaceFolder[];
1718

18-
try {
19-
if (workspaceFolders.length === 1) {
20-
await addon.enable(workspaceFolders[0]);
21-
await setSetting(workspaceFolders[0], "Lua.workspace.checkThirdParty", false);
22-
} else {
23-
const folderOptions = await (
24-
await addon.getEnabled()
25-
)
26-
.filter((entry) => entry.enabled === false)
27-
.map((entry) => {
28-
return {
29-
label: entry.folder.name,
30-
detail: entry.folder.uri.path,
31-
};
32-
});
19+
if (workspaceFolders.length === 1) {
20+
selectedFolders = [workspaceFolders[0]];
21+
} else {
22+
const folderOptions = await addon.getQuickPickerOptions(false);
3323

34-
const targetFolders = await vscode.window.showQuickPick(
35-
folderOptions,
36-
{
37-
canPickMany: true,
38-
ignoreFocusOut: true,
39-
title: `Enable ${addon.name} in which folders?`,
40-
}
41-
);
42-
if (!targetFolders) {
43-
localLogger.warn("User did not pick workspace folder");
44-
await addon.setLock(false);
45-
return;
46-
}
47-
for (const target of targetFolders) {
48-
const folder = workspaceFolders.find(
49-
(folder) => folder.name === target.label
50-
);
51-
await addon.enable(folder);
52-
await setSetting(
53-
folder,
54-
"Lua.workspace.checkThirdParty",
55-
false
56-
);
57-
}
24+
const pickResult = await vscode.window.showQuickPick(folderOptions, {
25+
canPickMany: true,
26+
ignoreFocusOut: true,
27+
title: `Enable ${addon.name} in which folders?`,
28+
});
29+
if (!pickResult) {
30+
localLogger.warn("User did not pick workspace folder");
31+
await addon.setLock(false);
32+
return;
5833
}
59-
} catch (e) {
60-
localLogger.error(e);
61-
return;
62-
} finally {
63-
await addon.setLock(false);
34+
selectedFolders = pickResult.map((selection) => {
35+
return workspaceFolders.find(
36+
(folder) => folder.name === selection.label
37+
);
38+
});
6439
}
40+
41+
for (const folder of selectedFolders) {
42+
await addon.enable(folder);
43+
await setConfig([
44+
{
45+
action: "set",
46+
key: "Lua.workspace.checkThirdParty",
47+
value: false,
48+
uri: folder.uri,
49+
},
50+
]);
51+
}
52+
53+
return addon.setLock(false);
6554
};

client/src/addon_manager/config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ export const REPOSITORY_DEFAULT_BRANCH = "main";
99
export const REPOSITORY_ISSUES_URL =
1010
"https://github.com/carsakiller/vscode-lua-webvue/issues/new?template=bug_report.yml";
1111
export const ADDONS_DIRECTORY = "addons";
12-
export const INFO_FILENAME = "info.json";
1312

1413
// settings.json file info
1514
export const LIBRARY_SETTING = "Lua.workspace.library";
1615

1716
// Addon files
1817
export const PLUGIN_FILENAME = "plugin.lua";
1918
export const CONFIG_FILENAME = "config.json";
19+
export const INFO_FILENAME = "info.json";

client/src/addon_manager/models/addon.ts

Lines changed: 45 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,13 @@ import { AddonConfig, AddonInfo } from "../types/addon";
55
import { WebVue } from "../panels/WebVue";
66
import {
77
applyAddonSettings,
8-
getSetting,
98
getLibraryPaths,
109
revokeAddonSettings,
11-
setSetting,
1210
} from "../services/settings.service";
1311
import { git } from "../services/git.service";
1412
import filesystem from "../services/filesystem.service";
1513
import { DiffResultTextFile } from "simple-git";
14+
import { getConfig, setConfig } from "../../languageserver";
1615

1716
const localLogger = createChildLogger("Addon");
1817

@@ -23,7 +22,7 @@ export class Addon {
2322
/** Whether or not this addon is currently processing an operation. */
2423
#processing?: boolean;
2524
/** The workspace folders that this addon is enabled in. */
26-
#enabled?: boolean[];
25+
#enabled: boolean[];
2726
/** Whether or not this addon has an update available from git. */
2827
#hasUpdate?: boolean;
2928
/** Whether or not this addon is installed */
@@ -53,7 +52,7 @@ export class Addon {
5352
}
5453

5554
/** Get the `config.json` for this addon. */
56-
public async getConfig() {
55+
public async getConfigurationFile() {
5756
const configURI = vscode.Uri.joinPath(
5857
this.uri,
5958
"module",
@@ -119,10 +118,10 @@ export class Addon {
119118
}
120119

121120
public async enable(folder: vscode.WorkspaceFolder) {
122-
const librarySetting = (await getSetting(
121+
const librarySetting = ((await getConfig(
123122
LIBRARY_SETTING,
124-
folder
125-
)) as string[];
123+
folder.uri
124+
)) ?? []) as string[];
126125

127126
const enabled = await this.checkIfEnabled(librarySetting);
128127
if (enabled) {
@@ -152,12 +151,18 @@ export class Addon {
152151
// Apply addon settings
153152
const libraryUri = vscode.Uri.joinPath(this.uri, "module", "library");
154153
const libraryPath = libraryUri.path.substring(1);
155-
librarySetting.push(libraryPath);
156154

157-
const configValues = await this.getConfig();
155+
const configValues = await this.getConfigurationFile();
158156

159157
try {
160-
await setSetting(folder, LIBRARY_SETTING, librarySetting);
158+
await setConfig([
159+
{
160+
action: "add",
161+
key: LIBRARY_SETTING,
162+
value: libraryPath,
163+
uri: folder.uri,
164+
},
165+
]);
161166
if (configValues.settings)
162167
await applyAddonSettings(folder, configValues.settings);
163168
} catch (e) {
@@ -170,10 +175,10 @@ export class Addon {
170175
}
171176

172177
public async disable(folder: vscode.WorkspaceFolder, silent = false) {
173-
const librarySetting = (await getSetting(
178+
const librarySetting = ((await getConfig(
174179
LIBRARY_SETTING,
175-
folder
176-
)) as string[];
180+
folder.uri
181+
)) ?? []) as string[];
177182

178183
const regex = new RegExp(
179184
`/sumneko.lua/addonManager/addons/${this.name}`,
@@ -188,12 +193,19 @@ export class Addon {
188193
}
189194

190195
// Remove setting for Language Server
191-
librarySetting.splice(index);
192-
const configValues = await this.getConfig();
196+
librarySetting.splice(index, 1);
197+
const configValues = await this.getConfigurationFile();
193198

194199
// Revoke settings
195200
try {
196-
await setSetting(folder, LIBRARY_SETTING, librarySetting);
201+
await setConfig([
202+
{
203+
action: "set",
204+
key: LIBRARY_SETTING,
205+
value: librarySetting,
206+
uri: folder.uri,
207+
},
208+
]);
197209
if (configValues.settings)
198210
await revokeAddonSettings(folder, configValues.settings);
199211
} catch (e) {
@@ -255,6 +267,23 @@ export class Addon {
255267
return this.#hasUpdate;
256268
}
257269

270+
/** Get a list of options for a quick picker that lists the workspace
271+
* folders that the addon is enabled/disabled in.
272+
* @param enabledState The state the addon must be in in a folder to be included.
273+
* `true` will only return the folders that the addon is **enabled** in.
274+
* `false` will only return the folders that the addon is **disabled** in
275+
*/
276+
public async getQuickPickerOptions(enabledState: boolean) {
277+
return (await this.getEnabled())
278+
.filter((entry) => entry.enabled === enabledState)
279+
.map((entry) => {
280+
return {
281+
label: entry.folder.name,
282+
detail: entry.folder.uri.path,
283+
};
284+
});
285+
}
286+
258287
public async setLock(state: boolean) {
259288
this.#processing = state;
260289
return this.sendToWebVue();

0 commit comments

Comments
 (0)