xref: /aosp_15_r20/external/pigweed/pw_ide/ts/pigweed-vscode/src/settingsWatcher.ts (revision 61c4878ac05f98d0ceed94b57d316916de578985)
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