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