1// Copyright 2023 The Pigweed Authors 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); you may not 4// use this file except in compliance with the License. You may obtain a copy of 5// the License at 6// 7// https://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12// License for the specific language governing permissions and limitations under 13// the License. 14 15import * as vscode from 'vscode'; 16import { RelativePattern } from 'vscode'; 17 18import { Disposable } from './disposables'; 19import { ClangdActiveFilesCache } from './clangd'; 20import { getSettingsData, syncSettingsSharedToProject } from './configParsing'; 21import logger from './logging'; 22import { settings } from './settings'; 23 24export class SettingsFileWatcher extends Disposable { 25 constructor() { 26 super(); 27 28 const workspaceFolders = vscode.workspace.workspaceFolders; 29 if (!workspaceFolders) return; 30 31 const workspaceFolder = workspaceFolders[0]; 32 33 logger.info('Initializing settings file watcher'); 34 35 const watcher = vscode.workspace.createFileSystemWatcher( 36 new RelativePattern(workspaceFolder, '.vscode/settings.shared.json'), 37 ); 38 39 watcher.onDidChange(async () => { 40 logger.info('[onDidChange] triggered from settings file watcher'); 41 syncSettingsSharedToProject(await getSettingsData()); 42 }); 43 44 watcher.onDidCreate(async () => { 45 logger.info('[onDidCreate] triggered from settings file watcher'); 46 syncSettingsSharedToProject(await getSettingsData()); 47 }); 48 49 watcher.onDidDelete(async () => { 50 logger.info('[onDidDelete] triggered from settings file watcher'); 51 syncSettingsSharedToProject(await getSettingsData()); 52 }); 53 54 this.disposables.push(watcher); 55 } 56} 57 58async function handleClangdFileEvent( 59 settingsFileWriter: (target: string) => Promise<void>, 60) { 61 const target = settings.codeAnalysisTarget(); 62 63 if (target) { 64 await settingsFileWriter(target); 65 } 66} 67 68export class ClangdFileWatcher extends Disposable { 69 constructor(clangdActiveFilesCache: ClangdActiveFilesCache) { 70 super(); 71 72 const workspaceFolders = vscode.workspace.workspaceFolders; 73 if (!workspaceFolders) return; 74 75 const workspaceFolder = workspaceFolders[0]; 76 77 logger.info('Initializing clangd file watcher'); 78 79 const watcher = vscode.workspace.createFileSystemWatcher( 80 new RelativePattern(workspaceFolder, '.clangd.shared'), 81 ); 82 83 watcher.onDidChange(async () => { 84 logger.info('[onDidChange] triggered from clangd file watcher'); 85 await handleClangdFileEvent(clangdActiveFilesCache.writeToSettings); 86 }); 87 88 watcher.onDidCreate(async () => { 89 logger.info('[onDidCreate] triggered from clangd file watcher'); 90 await handleClangdFileEvent(clangdActiveFilesCache.writeToSettings); 91 }); 92 93 watcher.onDidDelete(async () => { 94 logger.info('[onDidDelete] triggered from clangd file watcher'); 95 await handleClangdFileEvent(clangdActiveFilesCache.writeToSettings); 96 }); 97 98 this.disposables.push(watcher); 99 } 100} 101