constructor()

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);
        });
    }