| // Copyright 2022 The ChromiumOS Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // This is the only file that can call vscode.workspace.getConfiguration(). |
| /* eslint-disable no-restricted-syntax */ |
| |
| import * as vscode from 'vscode'; |
| |
| // Old prefix before ChromiumIDE rebranding. We should keep it for migration. |
| const OLD_CROS_IDE_PREFIX = 'cros-ide'; |
| |
| // Prefixes to be added to all config sections. |
| // The Go extension, which the user can have, requires a different prefix. |
| const CHROMIUMIDE_PREFIX = 'chromiumide'; |
| const GO_PREFIX = 'go'; |
| |
| // Wraps vscode API for safer configuration access. |
| // It ensures that a config entry is always accessed with consistent options, |
| // such as value type and default value. |
| class ConfigValue<T> { |
| constructor( |
| private readonly section: string, |
| private readonly prefix = CHROMIUMIDE_PREFIX, |
| private readonly configurationTarget = vscode.ConfigurationTarget.Global |
| ) {} |
| |
| get(): T { |
| const value = vscode.workspace |
| .getConfiguration(this.prefix) |
| .get<T>(this.section); |
| |
| if (value === undefined) { |
| throw new Error( |
| `BUG: ${this.prefix}.${this.section} is not defined in package.json` |
| ); |
| } |
| return value; |
| } |
| |
| inspectOldConfig(prefix = OLD_CROS_IDE_PREFIX): |
| | { |
| globalValue?: T; |
| workspaceValue?: T; |
| workspaceFolderValue?: T; |
| } |
| | undefined { |
| return vscode.workspace.getConfiguration(prefix).inspect(this.section); |
| } |
| |
| /** |
| * Returns true if the setting has the same value as the default in package.json. |
| */ |
| hasDefaultValue(): boolean { |
| const value = this.get(); |
| |
| const values = vscode.workspace |
| .getConfiguration(this.prefix) |
| .inspect<T>(this.section); |
| if (values === undefined) { |
| throw new Error( |
| `Internal error: ${this.prefix}.${this.section} not found (via inspect).` |
| ); |
| } |
| |
| return value === values.defaultValue; |
| } |
| |
| async update( |
| value: T | undefined, |
| target = this.configurationTarget |
| ): Promise<void> { |
| await vscode.workspace |
| .getConfiguration(this.prefix) |
| .update(this.section, value, target); |
| } |
| |
| async updateOldConfig( |
| value: T | undefined, |
| target = this.configurationTarget, |
| prefix = OLD_CROS_IDE_PREFIX |
| ): Promise<void> { |
| await vscode.workspace |
| .getConfiguration(prefix) |
| .update(this.section, value, target); |
| } |
| |
| /** |
| * Registers a listener that is called whenever the config was affected and may have been changed. |
| */ |
| readonly onDidChange: vscode.Event<T> = ( |
| listener, |
| thisArgs?, |
| disposables? |
| ) => { |
| if (thisArgs) { |
| listener = listener.bind(thisArgs); |
| } |
| const disposable = vscode.workspace.onDidChangeConfiguration(e => { |
| const section = this.prefix + '.' + this.section; |
| if (!e.affectsConfiguration(section)) return; |
| listener(this.get()); |
| }); |
| if (disposables) disposables.push(disposable); |
| return disposable; |
| }; |
| } |
| |
| export type {ConfigValue}; |
| |
| export const board = new ConfigValue<string>('board'); |
| |
| export const leagcyBoardsAndPackages = { |
| showWelcomeMessage: new ConfigValue<boolean>( |
| 'legacyBoardsAndPackages.showWelcomeMessage' |
| ), |
| }; |
| |
| export const boardsAndPackages = { |
| /** User's favorite categories. */ |
| favoriteCategories: new ConfigValue<string[]>( |
| 'boardsAndPackages.favoriteCategories' |
| ), |
| /** Qualified package names representing user's favorite packages. */ |
| favoritePackages: new ConfigValue<string[]>( |
| 'boardsAndPackages.favoritePackages' |
| ), |
| }; |
| |
| export const boilerplate = { |
| enabled: new ConfigValue<boolean>('boilerplate.enabled'), |
| guessNamespace: new ConfigValue<boolean>('boilerplate.guessNamespace'), |
| }; |
| |
| export const codeSearch = { |
| // TODO: Consider aligning the setting name. |
| instance: new ConfigValue<'public' | 'internal' | 'gitiles'>('codeSearch'), |
| // TODO: Consider aligning the setting name. |
| openWithRevision: new ConfigValue<boolean>('codeSearchHash'), |
| }; |
| |
| export const crosFormat = { |
| enabled: new ConfigValue<boolean>('crosFormat.enabled'), |
| }; |
| |
| export const gerrit = { |
| enabled: new ConfigValue<boolean>('gerrit.enabled'), |
| }; |
| |
| export const hints = { |
| tooLargeWorkspace: new ConfigValue<boolean>('hints.tooLargeWorkspace'), |
| }; |
| |
| export const underDevelopment = { |
| buildAndDeploy: new ConfigValue<boolean>('underDevelopment.buildAndDeploy'), |
| chromiumBuild: new ConfigValue<boolean>('underDevelopment.chromiumBuild'), |
| platform2GtestDebugging: new ConfigValue<boolean>( |
| 'underDevelopment.platform2GtestDebugging' |
| ), |
| platformEc: new ConfigValue<boolean>('underDevelopment.platformEC'), |
| relatedFiles: new ConfigValue<boolean>('underDevelopment.relatedFiles'), |
| tastDebugging: new ConfigValue<boolean>('underDevelopment.tastDebugging'), |
| systemLogViewer: new ConfigValue<boolean>('underDevelopment.systemLogViewer'), |
| }; |
| |
| export const deviceManagement = { |
| devices: new ConfigValue<string[]>('deviceManagement.devices'), |
| }; |
| |
| export const metrics = { |
| collectMetrics: new ConfigValue<boolean>('metrics.collectMetrics'), |
| showMessage: new ConfigValue<boolean>('metrics.showMessage'), |
| }; |
| |
| export const ownersFiles = { |
| links: new ConfigValue<boolean>('ownersFiles.links'), |
| }; |
| |
| export const paths = { |
| depotTools: new ConfigValue<string>('paths.depotTools'), |
| }; |
| |
| export const platformEc = { |
| board: new ConfigValue<string>('platformEC.board'), |
| mode: new ConfigValue<'RO' | 'RW'>('platformEC.mode'), |
| build: new ConfigValue<'Makefile' | 'Zephyr'>('platformEC.build'), |
| }; |
| |
| // https://github.com/golang/vscode-go/blob/master/docs/settings.md#detailed-list |
| export const goExtension = { |
| gopath: new ConfigValue<string>( |
| 'gopath', |
| GO_PREFIX, |
| vscode.ConfigurationTarget.Workspace |
| ), |
| toolsGopath: new ConfigValue<string>('toolsGopath', GO_PREFIX), |
| alternateTools: new ConfigValue<{[prop: string]: string}>( |
| 'alternateTools', |
| GO_PREFIX |
| ), |
| }; |
| |
| const chromeGtest = { |
| enabled: new ConfigValue<boolean>('chrome.gtest.enabled'), |
| botMode: new ConfigValue<boolean>('chrome.gtest.botMode'), |
| }; |
| |
| export const chrome = { |
| ashBuildDir: new ConfigValue<string>('chrome.ashBuildDir'), |
| dutName: new ConfigValue<string>('chrome.dutName'), |
| outputDirectories: new ConfigValue<boolean>('chrome.outputDirectories'), |
| gtest: chromeGtest, |
| }; |
| |
| export const spellchecker = new ConfigValue<boolean>('spellchecker'); |
| |
| export const tast = { |
| enabled: new ConfigValue<boolean>('tast.enabled'), |
| extraArgs: new ConfigValue<string[]>('tast.extraArgs'), |
| showGoAlternateToolsChangedMessage: new ConfigValue<boolean>( |
| 'tast.showGoAlternateToolsChangedMessage' |
| ), |
| }; |
| |
| export const testCoverage = { |
| enabled: new ConfigValue<boolean>('testCoverage.enabled'), |
| }; |
| |
| export const TEST_ONLY = { |
| CHROMIUMIDE_PREFIX, |
| }; |