Skip to content

Commit 77126c4

Browse files
move context keys into WorkspaceContext so that they can be accessed outside of the extension
1 parent 5b1d934 commit 77126c4

File tree

10 files changed

+49
-67
lines changed

10 files changed

+49
-67
lines changed

src/SwiftSnippets.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414

1515
import * as vscode from "vscode";
1616
import * as path from "path";
17-
import contextKeys from "./contextKeys";
1817
import { createSwiftTask } from "./tasks/SwiftTaskProvider";
1918
import { WorkspaceContext } from "./WorkspaceContext";
2019
import { createSnippetConfiguration, debugLaunchConfig } from "./debugger/launch";
@@ -30,16 +29,16 @@ export function setSnippetContextKey(ctx: WorkspaceContext) {
3029
!ctx.currentDocument ||
3130
ctx.currentFolder.swiftVersion.isLessThan({ major: 5, minor: 7, patch: 0 })
3231
) {
33-
contextKeys.fileIsSnippet = false;
32+
ctx.contextKeys.fileIsSnippet = false;
3433
return;
3534
}
3635

3736
const filename = ctx.currentDocument.fsPath;
3837
const snippetsFolder = path.join(ctx.currentFolder.folder.fsPath, "Snippets");
3938
if (filename.startsWith(snippetsFolder)) {
40-
contextKeys.fileIsSnippet = true;
39+
ctx.contextKeys.fileIsSnippet = true;
4140
} else {
42-
contextKeys.fileIsSnippet = false;
41+
ctx.contextKeys.fileIsSnippet = false;
4342
}
4443
return;
4544
}

src/WorkspaceContext.ts

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { LanguageClientToolchainCoordinator } from "./sourcekit-lsp/LanguageClie
2222
import { TaskManager } from "./tasks/TaskManager";
2323
import { makeDebugConfigurations } from "./debugger/launch";
2424
import configuration from "./configuration";
25-
import contextKeys from "./contextKeys";
25+
import { ContextKeys } from "./contextKeys";
2626
import { setSnippetContextKey } from "./SwiftSnippets";
2727
import { CommentCompletionProviders } from "./editor/CommentCompletion";
2828
import { SwiftBuildStatus } from "./ui/SwiftBuildStatus";
@@ -77,6 +77,7 @@ export class WorkspaceContext implements vscode.Disposable {
7777

7878
constructor(
7979
extensionContext: vscode.ExtensionContext,
80+
public contextKeys: ContextKeys,
8081
public logger: SwiftLogger,
8182
public globalToolchain: SwiftToolchain
8283
) {
@@ -233,9 +234,9 @@ export class WorkspaceContext implements vscode.Disposable {
233234
*/
234235
updateContextKeys(folderContext: FolderContext | null) {
235236
if (!folderContext) {
236-
contextKeys.hasPackage = false;
237-
contextKeys.hasExecutableProduct = false;
238-
contextKeys.packageHasDependencies = false;
237+
this.contextKeys.hasPackage = false;
238+
this.contextKeys.hasExecutableProduct = false;
239+
this.contextKeys.packageHasDependencies = false;
239240
return;
240241
}
241242

@@ -244,9 +245,9 @@ export class WorkspaceContext implements vscode.Disposable {
244245
folderContext.swiftPackage.executableProducts,
245246
folderContext.swiftPackage.dependencies,
246247
]).then(([foundPackage, executableProducts, dependencies]) => {
247-
contextKeys.hasPackage = foundPackage;
248-
contextKeys.hasExecutableProduct = executableProducts.length > 0;
249-
contextKeys.packageHasDependencies = dependencies.length > 0;
248+
this.contextKeys.hasPackage = foundPackage;
249+
this.contextKeys.hasExecutableProduct = executableProducts.length > 0;
250+
this.contextKeys.packageHasDependencies = dependencies.length > 0;
250251
});
251252
}
252253

@@ -258,23 +259,23 @@ export class WorkspaceContext implements vscode.Disposable {
258259
const target = await this.currentFolder?.swiftPackage.getTarget(
259260
this.currentDocument?.fsPath
260261
);
261-
contextKeys.currentTargetType = target?.type;
262+
this.contextKeys.currentTargetType = target?.type;
262263
} else {
263-
contextKeys.currentTargetType = undefined;
264+
this.contextKeys.currentTargetType = undefined;
264265
}
265266

266267
if (this.currentFolder) {
267268
const languageClient = this.languageClientManager.get(this.currentFolder);
268269
await languageClient.useLanguageClient(async client => {
269270
const experimentalCaps = client.initializeResult?.capabilities.experimental;
270271
if (!experimentalCaps) {
271-
contextKeys.supportsReindexing = false;
272-
contextKeys.supportsDocumentationLivePreview = false;
272+
this.contextKeys.supportsReindexing = false;
273+
this.contextKeys.supportsDocumentationLivePreview = false;
273274
return;
274275
}
275-
contextKeys.supportsReindexing =
276+
this.contextKeys.supportsReindexing =
276277
experimentalCaps[ReIndexProjectRequest.method] !== undefined;
277-
contextKeys.supportsDocumentationLivePreview =
278+
this.contextKeys.supportsDocumentationLivePreview =
278279
experimentalCaps[DocCDocumentationRequest.method] !== undefined;
279280
});
280281
}
@@ -293,7 +294,7 @@ export class WorkspaceContext implements vscode.Disposable {
293294
break;
294295
}
295296
}
296-
contextKeys.packageHasPlugins = hasPlugins;
297+
this.contextKeys.packageHasPlugins = hasPlugins;
297298
}
298299

299300
/** Setup the vscode event listeners to catch folder changes and active window changes */

src/commands/dependencies/updateDepViewList.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,11 @@
1212
//
1313
//===----------------------------------------------------------------------===//
1414

15-
import contextKeys from "../../contextKeys";
1615
import { FolderOperation, WorkspaceContext } from "../../WorkspaceContext";
1716

1817
export function updateDependenciesViewList(ctx: WorkspaceContext, flatList: boolean) {
1918
if (ctx.currentFolder) {
20-
contextKeys.flatDependenciesList = flatList;
19+
ctx.contextKeys.flatDependenciesList = flatList;
2120
void ctx.fireEvent(ctx.currentFolder, FolderOperation.packageViewUpdated);
2221
}
2322
}

src/contextKeys.ts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import { Version } from "./utilities/version";
2323
*/
2424

2525
/** Interface for getting and setting the VS Code Swift extension's context keys */
26-
interface ContextKeys {
26+
export interface ContextKeys {
2727
/**
2828
* Whether or not the swift extension is activated.
2929
*/
@@ -96,7 +96,7 @@ interface ContextKeys {
9696
}
9797

9898
/** Creates the getters and setters for the VS Code Swift extension's context keys. */
99-
function createContextKeys(): ContextKeys {
99+
export function createContextKeys(): ContextKeys {
100100
let isActivated: boolean = false;
101101
let hasPackage: boolean = false;
102102
let hasExecutableProduct: boolean = false;
@@ -292,10 +292,3 @@ function createContextKeys(): ContextKeys {
292292
},
293293
};
294294
}
295-
296-
/**
297-
* Type-safe wrapper around context keys used in `when` clauses.
298-
*/
299-
const contextKeys: ContextKeys = createContextKeys();
300-
301-
export default contextKeys;

src/documentation/DocumentationManager.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import * as vscode from "vscode";
1616
import { DocumentationPreviewEditor } from "./DocumentationPreviewEditor";
1717
import { WorkspaceContext } from "../WorkspaceContext";
1818
import { WebviewContent } from "./webview/WebviewMessage";
19-
import contextKeys from "../contextKeys";
2019

2120
export class DocumentationManager implements vscode.Disposable {
2221
private previewEditor?: DocumentationPreviewEditor;
@@ -25,26 +24,26 @@ export class DocumentationManager implements vscode.Disposable {
2524

2625
constructor(
2726
private readonly extension: vscode.ExtensionContext,
28-
private readonly context: WorkspaceContext
27+
private readonly workspaceContext: WorkspaceContext
2928
) {}
3029

3130
onPreviewDidUpdateContent = this.editorUpdatedContentEmitter.event;
3231
onPreviewDidRenderContent = this.editorRenderedEmitter.event;
3332

3433
async launchDocumentationPreview(): Promise<boolean> {
35-
if (!contextKeys.supportsDocumentationLivePreview) {
34+
if (!this.workspaceContext.contextKeys.supportsDocumentationLivePreview) {
3635
return false;
3736
}
3837

3938
if (!this.previewEditor) {
40-
const folderContext = this.context.currentFolder;
39+
const folderContext = this.workspaceContext.currentFolder;
4140
if (!folderContext) {
4241
return false;
4342
}
4443

4544
this.previewEditor = await DocumentationPreviewEditor.create(
4645
this.extension,
47-
this.context
46+
this.workspaceContext
4847
);
4948
const subscriptions: vscode.Disposable[] = [
5049
this.previewEditor.onDidUpdateContent(content => {

src/extension.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ import { SwiftEnvironmentVariablesManager, SwiftTerminalProfileProvider } from "
3434
import { resolveFolderDependencies } from "./commands/dependencies/resolve";
3535
import { SelectedXcodeWatcher } from "./toolchain/SelectedXcodeWatcher";
3636
import configuration, { handleConfigurationChangeEvent } from "./configuration";
37-
import contextKeys from "./contextKeys";
3837
import { registerSourceKitSchemaWatcher } from "./commands/generateSourcekitConfiguration";
3938
import { SwiftLogger } from "./logging/SwiftLogger";
4039
import { SwiftLoggerFactory } from "./logging/SwiftLoggerFactory";
40+
import { ContextKeys, createContextKeys } from "./contextKeys";
4141

4242
/**
4343
* External API as exposed by the extension. Can be queried by other extensions
@@ -65,7 +65,8 @@ export async function activate(context: vscode.ExtensionContext): Promise<Api> {
6565

6666
checkAndWarnAboutWindowsSymlinks(logger);
6767

68-
const toolchain = await createActiveToolchain(logger);
68+
const contextKeys = createContextKeys();
69+
const toolchain = await createActiveToolchain(contextKeys, logger);
6970

7071
// If we don't have a toolchain, show an error and stop initializing the extension.
7172
// This can happen if the user has not installed Swift or if the toolchain is not
@@ -82,7 +83,7 @@ export async function activate(context: vscode.ExtensionContext): Promise<Api> {
8283
};
8384
}
8485

85-
const workspaceContext = new WorkspaceContext(context, logger, toolchain);
86+
const workspaceContext = new WorkspaceContext(context, contextKeys, logger, toolchain);
8687
context.subscriptions.push(workspaceContext);
8788

8889
context.subscriptions.push(new SwiftEnvironmentVariablesManager(context));
@@ -239,7 +240,10 @@ function handleFolderEvent(logger: SwiftLogger): (event: FolderEvent) => Promise
239240
};
240241
}
241242

242-
async function createActiveToolchain(logger: SwiftLogger): Promise<SwiftToolchain | undefined> {
243+
async function createActiveToolchain(
244+
contextKeys: ContextKeys,
245+
logger: SwiftLogger
246+
): Promise<SwiftToolchain | undefined> {
243247
try {
244248
const toolchain = await SwiftToolchain.create(undefined, logger);
245249
toolchain.logDiagnostics(logger);
@@ -252,7 +256,10 @@ async function createActiveToolchain(logger: SwiftLogger): Promise<SwiftToolchai
252256
}
253257

254258
async function deactivate(context: vscode.ExtensionContext): Promise<void> {
255-
contextKeys.isActivated = false;
259+
const workspaceContext = (context.extension.exports as Api).workspaceContext;
260+
if (workspaceContext) {
261+
workspaceContext.contextKeys.isActivated = false;
262+
}
256263
context.subscriptions.forEach(subscription => subscription.dispose());
257264
context.subscriptions.length = 0;
258265
}

src/ui/ProjectPanelProvider.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import * as path from "path";
1818
import configuration from "../configuration";
1919
import { WorkspaceContext } from "../WorkspaceContext";
2020
import { FolderOperation } from "../WorkspaceContext";
21-
import contextKeys from "../contextKeys";
2221
import { Dependency, ResolvedDependency, Target } from "../SwiftPackage";
2322
import { FolderContext } from "../FolderContext";
2423
import { getPlatformConfig, resolveTaskCwd } from "../utilities/tasks";
@@ -485,9 +484,9 @@ export class ProjectPanelProvider implements vscode.TreeDataProvider<TreeNode> {
485484

486485
constructor(private workspaceContext: WorkspaceContext) {
487486
// default context key to false. These will be updated as folders are given focus
488-
contextKeys.hasPackage = false;
489-
contextKeys.hasExecutableProduct = false;
490-
contextKeys.packageHasDependencies = false;
487+
workspaceContext.contextKeys.hasPackage = false;
488+
workspaceContext.contextKeys.hasExecutableProduct = false;
489+
workspaceContext.contextKeys.packageHasDependencies = false;
491490

492491
this.observeTasks(workspaceContext);
493492
}
@@ -688,7 +687,7 @@ export class ProjectPanelProvider implements vscode.TreeDataProvider<TreeNode> {
688687
}
689688
const pkg = folderContext.swiftPackage;
690689
const rootDeps = await pkg.rootDependencies;
691-
if (contextKeys.flatDependenciesList) {
690+
if (this.workspaceContext.contextKeys.flatDependenciesList) {
692691
const existenceMap = new Map<string, boolean>();
693692
const gatherChildren = (dependencies: ResolvedDependency[]): ResolvedDependency[] => {
694693
const result: ResolvedDependency[] = [];

test/integration-tests/documentation/DocumentationLivePreview.test.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414

1515
import * as vscode from "vscode";
1616
import * as path from "path";
17-
import contextKeys from "../../../src/contextKeys";
1817
import { expect } from "chai";
1918
import { activateExtensionForSuite, folderInRootWorkspace } from "../utilities/testutilities";
2019
import { waitForNoRunningTasks } from "../../utilities/tasks";
@@ -46,7 +45,7 @@ suite("Documentation Live Preview", function () {
4645
});
4746

4847
setup(function () {
49-
if (!contextKeys.supportsDocumentationLivePreview) {
48+
if (!workspaceContext.contextKeys.supportsDocumentationLivePreview) {
5049
this.skip();
5150
}
5251
});

test/integration-tests/ui/ProjectPanelProvider.test.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import {
3030
folderInRootWorkspace,
3131
updateSettings,
3232
} from "../utilities/testutilities";
33-
import contextKeys from "../../../src/contextKeys";
3433
import { WorkspaceContext } from "../../../src/WorkspaceContext";
3534
import { Version } from "../../../src/utilities/version";
3635
import { wait } from "../../../src/utilities/utilities";
@@ -58,7 +57,7 @@ suite("ProjectPanelProvider Test Suite", function () {
5857
await executeTaskAndWaitForResult(buildAllTask);
5958
},
6059
async teardown() {
61-
contextKeys.flatDependenciesList = false;
60+
workspaceContext.contextKeys.flatDependenciesList = false;
6261
treeProvider.dispose();
6362
},
6463
testAssets: ["targets"],
@@ -301,7 +300,7 @@ suite("ProjectPanelProvider Test Suite", function () {
301300

302301
suite("Dependencies", () => {
303302
test("Includes remote dependency", async () => {
304-
contextKeys.flatDependenciesList = false;
303+
workspaceContext.contextKeys.flatDependenciesList = false;
305304
const items = await getHeaderChildren("Dependencies");
306305
const dep = items.find(n => n.name === "swift-markdown") as PackageNode;
307306
expect(dep, `${JSON.stringify(items, null, 2)}`).to.not.be.undefined;
@@ -324,7 +323,7 @@ suite("ProjectPanelProvider Test Suite", function () {
324323
});
325324

326325
test("Lists local dependency file structure", async () => {
327-
contextKeys.flatDependenciesList = false;
326+
workspaceContext.contextKeys.flatDependenciesList = false;
328327
const children = await getHeaderChildren("Dependencies");
329328
const dep = children.find(n => n.name === "defaultpackage") as PackageNode;
330329
expect(
@@ -358,7 +357,7 @@ suite("ProjectPanelProvider Test Suite", function () {
358357
});
359358

360359
test("Lists remote dependency file structure", async () => {
361-
contextKeys.flatDependenciesList = false;
360+
workspaceContext.contextKeys.flatDependenciesList = false;
362361
const children = await getHeaderChildren("Dependencies");
363362
const dep = children.find(n => n.name === "swift-markdown") as PackageNode;
364363
expect(dep, `${JSON.stringify(children, null, 2)}`).to.not.be.undefined;
@@ -384,7 +383,7 @@ suite("ProjectPanelProvider Test Suite", function () {
384383
});
385384

386385
test("Shows a flat dependency list", async () => {
387-
contextKeys.flatDependenciesList = true;
386+
workspaceContext.contextKeys.flatDependenciesList = true;
388387
const items = await getHeaderChildren("Dependencies");
389388
expect(items.length).to.equal(3);
390389
expect(items.find(n => n.name === "swift-markdown")).to.not.be.undefined;
@@ -393,7 +392,7 @@ suite("ProjectPanelProvider Test Suite", function () {
393392
});
394393

395394
test("Shows a nested dependency list", async () => {
396-
contextKeys.flatDependenciesList = false;
395+
workspaceContext.contextKeys.flatDependenciesList = false;
397396
const items = await getHeaderChildren("Dependencies");
398397
expect(items.length).to.equal(2);
399398
expect(items.find(n => n.name === "swift-markdown")).to.not.be.undefined;
@@ -419,7 +418,7 @@ suite("ProjectPanelProvider Test Suite", function () {
419418
});
420419

421420
test("Excludes files based on settings", async () => {
422-
contextKeys.flatDependenciesList = false;
421+
workspaceContext.contextKeys.flatDependenciesList = false;
423422
const children = await getHeaderChildren("Dependencies");
424423
const dep = children.find(n => n.name === "swift-markdown") as PackageNode;
425424
expect(dep, `${JSON.stringify(children, null, 2)}`).to.not.be.undefined;

test/unit-tests/MockUtils.test.ts

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import {
2727
waitForReturnedPromises,
2828
} from "../MockUtils";
2929
import { Version } from "../../src/utilities/version";
30-
import contextKeys from "../../src/contextKeys";
3130
import configuration from "../../src/configuration";
3231

3332
// eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -207,7 +206,6 @@ suite("MockUtils Test Suite", () => {
207206

208207
suite("mockGlobalModule()", () => {
209208
const mockedFS = mockGlobalModule(fs);
210-
const mockedContextKeys = mockGlobalModule(contextKeys);
211209
const mockedConfiguration = mockGlobalModule(configuration);
212210

213211
test("can mock the fs/promises module", async () => {
@@ -217,17 +215,6 @@ suite("MockUtils Test Suite", () => {
217215
expect(mockedFS.readFile).to.have.been.calledOnceWithExactly("some_file");
218216
});
219217

220-
test("can mock the contextKeys module", () => {
221-
// Initial value should match default value in context keys
222-
expect(contextKeys.isActivated).to.be.false;
223-
// Make sure that you can set the value of contextKeys using the mock
224-
mockedContextKeys.isActivated = true;
225-
expect(contextKeys.isActivated).to.be.true;
226-
// Make sure that setting isActivated via contextKeys is also possible
227-
contextKeys.isActivated = false;
228-
expect(contextKeys.isActivated).to.be.false;
229-
});
230-
231218
test("can mock the configuration module", () => {
232219
expect(configuration.sdk).to.equal("");
233220
// Make sure you can set a value using the mock

0 commit comments

Comments
 (0)