in src/extension.ts [85:173]
constructor(public readonly extensionContext: vscode.ExtensionContext) {
telemetry.activate(extensionContext);
this.showCMakeLists = new Promise<boolean>(resolve => {
const experimentationService: Promise<IExperimentationService | undefined> | undefined = telemetry.getExperimentationService();
if (experimentationService) {
void experimentationService
.then(expSrv => expSrv!.getTreatmentVariableAsync<boolean>("vscode", "partialActivation_showCMakeLists"))
.then(showCMakeLists => {
if (showCMakeLists !== undefined) {
resolve(showCMakeLists);
} else {
resolve(false);
}
});
} else {
resolve(false);
}
});
this._folders.onAfterAddFolder(async cmtFolder => {
console.assert(this._folders.size === vscode.workspace.workspaceFolders?.length);
if (this._folders.size === 1) {
// First folder added
await this._setActiveFolder(vscode.workspace.workspaceFolders![0]);
} else if (this._folders.isMultiRoot) {
// Call initActiveFolder instead of just setupSubscriptions, since the active editor/file may not
// be in currently opened workspaces, and may be in the newly opened workspace.
await this._initActiveFolder();
await util.setContextValue(MULTI_ROOT_MODE_KEY, true);
// sub go text edit change event in multiroot mode
if (this._workspaceConfig.autoSelectActiveFolder) {
this._onDidChangeActiveTextEditorSub.dispose();
this._onDidChangeActiveTextEditorSub = vscode.window.onDidChangeActiveTextEditor(e => this._onDidChangeActiveTextEditor(e), this);
}
}
const new_cmt = cmtFolder.cmakeTools;
this._projectOutlineProvider.addFolder(cmtFolder.folder);
if (this._codeModelUpdateSubs.get(new_cmt.folder.uri.fsPath)) {
// We already have this folder, do nothing
} else {
const subs: vscode.Disposable[] = [];
subs.push(new_cmt.onCodeModelChanged(FireLate, () => this._updateCodeModel(cmtFolder)));
subs.push(new_cmt.onTargetNameChanged(FireLate, () => this._updateCodeModel(cmtFolder)));
subs.push(new_cmt.onLaunchTargetNameChanged(FireLate, () => this._updateCodeModel(cmtFolder)));
subs.push(new_cmt.onActiveBuildPresetChanged(FireLate, () => this._updateCodeModel(cmtFolder)));
this._codeModelUpdateSubs.set(new_cmt.folder.uri.fsPath, subs);
}
rollbar.takePromise('Post-folder-open', { folder: cmtFolder.folder }, this._postWorkspaceOpen(cmtFolder));
});
this._folders.onAfterRemoveFolder(async folder => {
console.assert((vscode.workspace.workspaceFolders === undefined && this._folders.size === 0) ||
(vscode.workspace.workspaceFolders !== undefined && vscode.workspace.workspaceFolders.length === this._folders.size));
this._codeModelUpdateSubs.delete(folder.uri.fsPath);
if (!vscode.workspace.workspaceFolders?.length) {
await this._setActiveFolder(undefined);
} else {
if (this._folders.activeFolder?.folder.uri.fsPath === folder.uri.fsPath) {
await this._setActiveFolder(vscode.workspace.workspaceFolders[0]);
} else {
this._setupSubscriptions();
}
await util.setContextValue(MULTI_ROOT_MODE_KEY, this._folders.isMultiRoot);
// Update the full/partial view of the workspace by verifying if after the folder removal
// it still has at least one CMake project.
await enableFullFeatureSet(await this.workspaceHasCMakeProject());
}
this._onDidChangeActiveTextEditorSub.dispose();
if (this._folders.isMultiRoot && this._workspaceConfig.autoSelectActiveFolder) {
this._onDidChangeActiveTextEditorSub = vscode.window.onDidChangeActiveTextEditor(e => this._onDidChangeActiveTextEditor(e), this);
} else {
this._onDidChangeActiveTextEditorSub = new DummyDisposable();
}
this._projectOutlineProvider.removeFolder(folder);
});
this._workspaceConfig.onChange('autoSelectActiveFolder', v => {
if (this._folders.isMultiRoot) {
telemetry.logEvent('configChanged.autoSelectActiveFolder', { autoSelectActiveFolder: `${v}` });
this._onDidChangeActiveTextEditorSub.dispose();
if (v) {
this._onDidChangeActiveTextEditorSub = vscode.window.onDidChangeActiveTextEditor(e => this._onDidChangeActiveTextEditor(e), this);
} else {
this._onDidChangeActiveTextEditorSub = new DummyDisposable();
}
}
this._statusBar.setAutoSelectActiveFolder(v);
});
}