-
Notifications
You must be signed in to change notification settings - Fork 68
/
Copy pathextension.ts
169 lines (150 loc) · 6.68 KB
/
extension.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
//===----------------------------------------------------------------------===//
//
// This source file is part of the VSCode Swift open source project
//
// Copyright (c) 2021-2022 the VSCode Swift project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of VSCode Swift project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//
import * as vscode from "vscode";
import * as commands from "./commands";
import * as debug from "./debugger/launch";
import { PackageDependenciesProvider } from "./ui/PackageDependencyProvider";
import { SwiftTaskProvider } from "./SwiftTaskProvider";
import { FolderEvent, WorkspaceContext } from "./WorkspaceContext";
import { FolderContext } from "./FolderContext";
import { TestExplorer } from "./TestExplorer/TestExplorer";
import { LanguageStatusItems } from "./ui/LanguageStatusItems";
import { getErrorDescription } from "./utilities/utilities";
import { SwiftPluginTaskProvider } from "./SwiftPluginTaskProvider";
import configuration from "./configuration";
import { Version } from "./utilities/version";
/**
* External API as exposed by the extension. Can be queried by other extensions
* or by the integration test runner for VSCode extensions.
*/
export interface Api {
workspaceContext: WorkspaceContext;
}
/**
* Activate the extension. This is the main entry point.
*/
export async function activate(context: vscode.ExtensionContext): Promise<Api> {
try {
console.debug("Activating Swift for Visual Studio Code...");
const workspaceContext = await WorkspaceContext.create();
context.subscriptions.push(workspaceContext);
// setup swift version of LLDB. Don't await on this as it can run in the background
workspaceContext.setupLLDB();
// listen for workspace folder changes and active text editor changes
workspaceContext.setupEventListeners();
// Register task provider.
const taskProvider = vscode.tasks.registerTaskProvider(
"swift",
new SwiftTaskProvider(workspaceContext)
);
// Register swift plugin task provider.
const pluginTaskProvider = vscode.tasks.registerTaskProvider(
"swift-plugin",
new SwiftPluginTaskProvider(workspaceContext)
);
commands.register(workspaceContext);
const languageStatusItem = new LanguageStatusItems(workspaceContext);
// observer for logging workspace folder addition/removal
const logObserver = workspaceContext.observeFolders((folderContext, event) => {
workspaceContext.outputChannel.log(
`${event}: ${folderContext?.folder.fsPath}`,
folderContext?.name
);
});
// dependency view
const dependenciesProvider = new PackageDependenciesProvider(workspaceContext);
const dependenciesView = vscode.window.createTreeView("packageDependencies", {
treeDataProvider: dependenciesProvider,
showCollapseAll: true,
});
dependenciesProvider.observeFolders(dependenciesView);
// observer that will resolve package and build launch configurations
const resolvePackageObserver = workspaceContext.observeFolders(
async (folder, event, workspace) => {
if (!folder) {
return;
}
switch (event) {
case FolderEvent.add:
// Create launch.json files based on package description.
debug.makeDebugConfigurations(folder);
if (
folder.swiftPackage.foundPackage &&
!configuration.folder(folder.workspaceFolder).disableAutoResolve
) {
await commands.resolveFolderDependencies(folder, true);
if (workspace.swiftVersion >= new Version(5, 6, 0)) {
await workspace.statusItem.showStatusWhileRunning(
`Loading Swift Plugins (${FolderContext.uriName(
folder.workspaceFolder.uri
)})`,
async () => {
await folder.loadSwiftPlugins();
}
);
}
}
break;
case FolderEvent.packageUpdated:
// Create launch.json files based on package description.
debug.makeDebugConfigurations(folder);
if (
folder.swiftPackage.foundPackage &&
!configuration.folder(folder.workspaceFolder).disableAutoResolve
) {
await commands.resolveFolderDependencies(folder, true);
}
break;
case FolderEvent.resolvedUpdated:
if (
folder.swiftPackage.foundPackage &&
!configuration.folder(folder.workspaceFolder).disableAutoResolve
) {
await commands.resolveFolderDependencies(folder, true);
}
}
}
);
const testExplorerObserver = TestExplorer.observeFolders(workspaceContext);
// setup workspace context with initial workspace folders
workspaceContext.addWorkspaceFolders();
// Register any disposables for cleanup when the extension deactivates.
context.subscriptions.push(
resolvePackageObserver,
testExplorerObserver,
dependenciesView,
dependenciesProvider,
logObserver,
languageStatusItem,
pluginTaskProvider,
taskProvider
);
return { workspaceContext };
} catch (error) {
const errorMessage = getErrorDescription(error);
// show this error message as the VSCode error message only shows when running
// the extension through the debugger
vscode.window.showErrorMessage(`Activating Swift extension failed: ${errorMessage}`);
throw Error(errorMessage);
}
}
/**
* Deactivate the extension.
*
* Any disposables registered in `context.subscriptions` will be automatically
* disposed of, so there's nothing left to do here.
*/
export function deactivate() {
return;
}