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
|
// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only
import * as vscode from 'vscode';
import {
CoreAPI,
getCoreApi,
createLogger,
initLogger,
telemetry,
QtWorkspaceConfigMessage
} from 'qt-lib';
import { registerColorProvider } from '@/color-provider';
import { registerRestartQmllsCommand } from '@cmd/restart-qmlls';
import { registerDownloadQmllsCommand } from '@cmd/download-qmlls';
import { registerCheckQmllsUpdateCommand } from '@cmd/check-qmlls-update';
import { Qmlls } from '@/qmlls';
import { EXTENSION_ID } from '@/constants';
import { QMLProjectManager, createQMLProject } from '@/project';
export let projectManager: QMLProjectManager;
export let coreAPI: CoreAPI | undefined;
const logger = createLogger('extension');
export async function activate(context: vscode.ExtensionContext) {
initLogger(EXTENSION_ID);
telemetry.activate(context);
projectManager = new QMLProjectManager(context);
coreAPI = await getCoreApi();
if (!coreAPI) {
const err = 'Failed to get CoreAPI';
logger.error(err);
throw new Error(err);
}
if (vscode.workspace.workspaceFolders !== undefined) {
for (const folder of vscode.workspace.workspaceFolders) {
const project = await createQMLProject(folder, context);
projectManager.addProject(project);
}
}
coreAPI.onValueChanged((message) => {
logger.debug(
'Received config change:',
message.config as unknown as string
);
processMessage(message);
});
context.subscriptions.push(
registerRestartQmllsCommand(),
registerCheckQmllsUpdateCommand(),
registerDownloadQmllsCommand(),
registerColorProvider()
);
telemetry.sendEvent(`activated`);
void Qmlls.checkAssetAndDecide();
}
export function deactivate() {
logger.info(`Deactivating ${EXTENSION_ID}`);
telemetry.dispose();
projectManager.dispose();
}
function processMessage(message: QtWorkspaceConfigMessage) {
try {
// check if workspace folder is a string. If it is, it means the global
// workspace
if (typeof message.workspaceFolder === 'string') {
return;
}
const project = projectManager.getProject(message.workspaceFolder);
if (!project) {
logger.error('Project not found');
return;
}
let updateQmlls = false;
for (const key of message.config.keys()) {
if (key === 'selectedKitPath') {
const selectedKitPath = message.get<string>('selectedKitPath');
if (selectedKitPath !== project.kitPath) {
updateQmlls = true;
project.kitPath = selectedKitPath;
}
continue;
}
if (key === 'selectedQtPaths') {
const selectedQtPaths = message.get<string>('selectedQtPaths');
if (selectedQtPaths !== project.qtpathsExe) {
updateQmlls = true;
project.qtpathsExe = selectedQtPaths;
}
continue;
}
if (key === 'buildDir') {
const buildDir = message.get<string>('buildDir');
if (buildDir !== project.buildDir) {
updateQmlls = true;
project.buildDir = buildDir;
}
}
}
if (updateQmlls) {
project.updateQmlls();
}
} catch (e) {
const err = e as Error;
logger.error(err.message);
void vscode.window.showErrorMessage(`Error: "${err.message}"`);
}
}
|