Skip to content
This repository was archived by the owner on Dec 25, 2023. It is now read-only.

Commit 3f2478d

Browse files
committed
Optimize handler
1 parent fa3669d commit 3f2478d

File tree

5 files changed

+57
-113
lines changed

5 files changed

+57
-113
lines changed

rollup.config.main.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import typescript from "rollup-plugin-typescript2";
21
import commonjs from "@rollup/plugin-commonjs";
32
import resolve from "@rollup/plugin-node-resolve";
3+
import typescript from "rollup-plugin-typescript2";
44

55
export default {
66
input: "src/main.ts",

src/main.test.ts

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,6 @@ jest.mock("./tsLibPath", () => ({
77
jest.mock("./isEnabledForJavascript", () => ({
88
isEnabledForJavascript: () => true,
99
}));
10-
jest.mock("./shouldOrganizeImportsOnSave", () => ({
11-
shouldOrganizeImportsOnSave: jest.fn(() => true),
12-
}));
1310
jest.mock("nova-extension-utils");
1411

1512
jest.useFakeTimers();
@@ -303,6 +300,9 @@ describe("test suite", () => {
303300

304301
await activate();
305302

303+
(nova as any).config = { onDidChange: jest.fn() };
304+
(nova as any).workspace.config = { onDidChange: jest.fn() };
305+
306306
expect(nova.workspace.onDidAddTextEditor).toBeCalledTimes(1);
307307
const setupWatcher = (nova.workspace.onDidAddTextEditor as jest.Mock).mock
308308
.calls[0][0];
@@ -311,30 +311,25 @@ describe("test suite", () => {
311311
onDidDestroy: jest.fn(),
312312
document: {
313313
syntax: "typescript",
314+
onDidChangeSyntax: jest.fn(),
314315
},
315316
};
316317
setupWatcher(mockEditor);
318+
expect(mockEditor.onWillSave).toBeCalledTimes(0);
319+
320+
require("nova-extension-utils").preferences.getOverridableBoolean.mockReturnValue(
321+
true
322+
);
323+
setupWatcher(mockEditor);
317324
expect(mockEditor.onWillSave).toBeCalledTimes(1);
325+
318326
const saveHandler = (mockEditor.onWillSave as jest.Mock).mock.calls[0][0];
319327
await saveHandler(mockEditor);
320328
expect(nova.commands.invoke).toHaveBeenNthCalledWith(
321329
1,
322330
"apexskier.typescript.commands.organizeImports",
323331
mockEditor
324332
);
325-
326-
(nova.commands.invoke as jest.Mock).mockReset();
327-
mockEditor.document.syntax = "__something_else__";
328-
await saveHandler(mockEditor);
329-
expect(nova.commands.invoke).not.toBeCalled();
330-
331-
(nova.commands.invoke as jest.Mock).mockReset();
332-
mockEditor.document.syntax = "typescript";
333-
require("./shouldOrganizeImportsOnSave").shouldOrganizeImportsOnSave.mockReturnValue(
334-
false
335-
);
336-
await saveHandler(mockEditor);
337-
expect(nova.commands.invoke).not.toBeCalled();
338333
});
339334
});
340335
});

src/main.ts

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { dependencyManagement } from "nova-extension-utils";
1+
import { dependencyManagement, preferences } from "nova-extension-utils";
22
import { registerFindReferences } from "./commands/findReferences";
33
import { registerFindSymbol } from "./commands/findSymbol";
44
import { registerOrganizeImports } from "./commands/organizeImports";
@@ -7,9 +7,11 @@ import { registerSignatureHelp } from "./commands/signatureHelp";
77
import { InformationView } from "./informationView";
88
import { isEnabledForJavascript } from "./isEnabledForJavascript";
99
import { wrapCommand } from "./novaUtils";
10-
import { shouldOrganizeImportsOnSave } from "./shouldOrganizeImportsOnSave";
1110
import { getTsLibPath } from "./tsLibPath";
1211

12+
const organizeImportsOnSaveKey =
13+
"apexskier.typescript.config.organizeImportsOnSave";
14+
1315
nova.commands.register(
1416
"apexskier.typescript.openWorkspaceConfig",
1517
wrapCommand(function openWorkspaceConfig(workspace: Workspace) {
@@ -189,21 +191,53 @@ async function asyncActivate() {
189191

190192
client.start();
191193

194+
// auto-organize imports on save
192195
compositeDisposable.add(
193196
nova.workspace.onDidAddTextEditor((editor) => {
194-
const listener = editor.onWillSave(async (editor) => {
197+
const editorDisposable = new CompositeDisposable();
198+
compositeDisposable.add(editorDisposable);
199+
compositeDisposable.add(
200+
editor.onDidDestroy(() => editorDisposable.dispose())
201+
);
202+
203+
// watch things that might change if this needs to happen or not
204+
editorDisposable.add(editor.document.onDidChangeSyntax(refreshListener));
205+
editorDisposable.add(
206+
nova.config.onDidChange(organizeImportsOnSaveKey, refreshListener)
207+
);
208+
editorDisposable.add(
209+
nova.workspace.config.onDidChange(
210+
organizeImportsOnSaveKey,
211+
refreshListener
212+
)
213+
);
214+
215+
let willSaveListener = setupListener();
216+
compositeDisposable.add({
217+
dispose() {
218+
willSaveListener?.dispose();
219+
},
220+
});
221+
222+
function refreshListener() {
223+
willSaveListener?.dispose();
224+
willSaveListener = setupListener();
225+
}
226+
227+
function setupListener() {
195228
if (
196-
editor.document.syntax &&
197-
syntaxes.includes(editor.document.syntax) &&
198-
shouldOrganizeImportsOnSave()
229+
(syntaxes as Array<string | null>).includes(editor.document.syntax) &&
230+
preferences.getOverridableBoolean(organizeImportsOnSaveKey)
199231
) {
200-
await nova.commands.invoke(
201-
"apexskier.typescript.commands.organizeImports",
202-
editor
232+
return editor.onWillSave(async (editor) =>
233+
nova.commands.invoke(
234+
"apexskier.typescript.commands.organizeImports",
235+
editor
236+
)
203237
);
204238
}
205-
});
206-
compositeDisposable.add(editor.onDidDestroy(() => listener.dispose()));
239+
return null;
240+
}
207241
})
208242
);
209243

src/shouldOrganizeImportsOnSave.test.ts

Lines changed: 0 additions & 71 deletions
This file was deleted.

src/shouldOrganizeImportsOnSave.ts

Lines changed: 0 additions & 14 deletions
This file was deleted.

0 commit comments

Comments
 (0)