static async init()

in src/presetsController.ts [40:128]


    static async init(cmakeTools: CMakeTools, kitsController: KitsController): Promise<PresetsController> {
        const presetsController = new PresetsController(cmakeTools, kitsController);

        preset.setCompilers(kitsController.availableKits);

        const expandSourceDir = async (dir: string) => {
            const workspaceFolder = cmakeTools.folder.uri.fsPath;
            const expansionOpts: ExpansionOptions = {
                vars: {
                    workspaceFolder,
                    workspaceFolderBasename: path.basename(workspaceFolder),
                    workspaceHash: util.makeHashString(workspaceFolder),
                    workspaceRoot: workspaceFolder,
                    workspaceRootFolderName: path.dirname(workspaceFolder),
                    userHome: paths.userHome,
                    // Following fields are not supported for sourceDir expansion
                    generator: '${generator}',
                    sourceDir: '${sourceDir}',
                    sourceParentDir: '${sourceParentDir}',
                    sourceDirName: '${sourceDirName}',
                    presetName: '${presetName}'
                }
            };
            return util.normalizeAndVerifySourceDir(await expandString(dir, expansionOpts));
        };

        presetsController._sourceDir = await expandSourceDir(cmakeTools.workspaceContext.config.sourceDirectory);

        const watchPresetsChange = async () => {
            // We explicitly read presets file here, instead of on the initialization of the file watcher. Otherwise
            // there might be timing issues, since listeners are invoked async.
            await presetsController.reapplyPresets();

            if (presetsController._presetsWatcher) {
                presetsController._presetsWatcher.close().then(() => {}, () => {});
            }
            if (presetsController._userPresetsWatcher) {
                presetsController._userPresetsWatcher.close().then(() => {}, () => {});
            }

            presetsController._presetsWatcher = chokidar.watch(presetsController.presetsPath, { ignoreInitial: true })
                .on('add', async () => {
                    await presetsController.reapplyPresets();
                })
                .on('change', async () => {
                    await presetsController.reapplyPresets();
                })
                .on('unlink', async () => {
                    await presetsController.reapplyPresets();
                });
            presetsController._userPresetsWatcher = chokidar.watch(presetsController.userPresetsPath, { ignoreInitial: true })
                .on('add', async () => {
                    await presetsController.reapplyPresets();
                })
                .on('change', async () => {
                    await presetsController.reapplyPresets();
                })
                .on('unlink', async () => {
                    await presetsController.reapplyPresets();
                });
        };

        await watchPresetsChange();

        cmakeTools.workspaceContext.config.onChange('allowCommentsInPresetsFile', async () => {
            await presetsController.reapplyPresets();
            vscode.workspace.textDocuments.forEach(doc => {
                const fileName = path.basename(doc.uri.fsPath);
                if (fileName === 'CMakePresets.json' || fileName === 'CMakeUserPresets.json') {
                    if (cmakeTools.workspaceContext.config.allowCommentsInPresetsFile) {
                        void vscode.languages.setTextDocumentLanguage(doc, 'jsonc');
                    } else {
                        void vscode.languages.setTextDocumentLanguage(doc, 'json');
                    }
                }
            });
        });

        presetsController._sourceDirChangedSub = cmakeTools.workspaceContext.config.onChange('sourceDirectory', async value => {
            const oldSourceDir = presetsController._sourceDir;
            presetsController._sourceDir = await expandSourceDir(value);

            if (presetsController._sourceDir !== oldSourceDir) {
                await watchPresetsChange();
            }
        });

        return presetsController;
    }