Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/common/services/textResourceConfigurationService.ts
3294 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { Emitter, Event } from '../../../base/common/event.js';
7
import { Disposable } from '../../../base/common/lifecycle.js';
8
import { URI } from '../../../base/common/uri.js';
9
import { IPosition, Position } from '../core/position.js';
10
import { ILanguageService } from '../languages/language.js';
11
import { IModelService } from './model.js';
12
import { ITextResourceConfigurationService, ITextResourceConfigurationChangeEvent } from './textResourceConfiguration.js';
13
import { IConfigurationService, ConfigurationTarget, IConfigurationValue, IConfigurationChangeEvent } from '../../../platform/configuration/common/configuration.js';
14
15
export class TextResourceConfigurationService extends Disposable implements ITextResourceConfigurationService {
16
17
public _serviceBrand: undefined;
18
19
private readonly _onDidChangeConfiguration: Emitter<ITextResourceConfigurationChangeEvent> = this._register(new Emitter<ITextResourceConfigurationChangeEvent>());
20
public readonly onDidChangeConfiguration: Event<ITextResourceConfigurationChangeEvent> = this._onDidChangeConfiguration.event;
21
22
constructor(
23
@IConfigurationService private readonly configurationService: IConfigurationService,
24
@IModelService private readonly modelService: IModelService,
25
@ILanguageService private readonly languageService: ILanguageService,
26
) {
27
super();
28
this._register(this.configurationService.onDidChangeConfiguration(e => this._onDidChangeConfiguration.fire(this.toResourceConfigurationChangeEvent(e))));
29
}
30
31
getValue<T>(resource: URI | undefined, section?: string): T;
32
getValue<T>(resource: URI | undefined, at?: IPosition, section?: string): T;
33
getValue<T>(resource: URI | undefined, arg2?: unknown, arg3?: unknown): T {
34
if (typeof arg3 === 'string') {
35
return this._getValue(resource, Position.isIPosition(arg2) ? arg2 : null, arg3);
36
}
37
return this._getValue(resource, null, typeof arg2 === 'string' ? arg2 : undefined);
38
}
39
40
updateValue(resource: URI | undefined, key: string, value: unknown, configurationTarget?: ConfigurationTarget): Promise<void> {
41
const language = resource ? this.getLanguage(resource, null) : null;
42
const configurationValue = this.configurationService.inspect(key, { resource, overrideIdentifier: language });
43
if (configurationTarget === undefined) {
44
configurationTarget = this.deriveConfigurationTarget(configurationValue, language);
45
}
46
const overrideIdentifier = language && configurationValue.overrideIdentifiers?.includes(language) ? language : undefined;
47
return this.configurationService.updateValue(key, value, { resource, overrideIdentifier }, configurationTarget);
48
}
49
50
private deriveConfigurationTarget(configurationValue: IConfigurationValue<unknown>, language: string | null): ConfigurationTarget {
51
if (language) {
52
if (configurationValue.memory?.override !== undefined) {
53
return ConfigurationTarget.MEMORY;
54
}
55
if (configurationValue.workspaceFolder?.override !== undefined) {
56
return ConfigurationTarget.WORKSPACE_FOLDER;
57
}
58
if (configurationValue.workspace?.override !== undefined) {
59
return ConfigurationTarget.WORKSPACE;
60
}
61
if (configurationValue.userRemote?.override !== undefined) {
62
return ConfigurationTarget.USER_REMOTE;
63
}
64
if (configurationValue.userLocal?.override !== undefined) {
65
return ConfigurationTarget.USER_LOCAL;
66
}
67
}
68
if (configurationValue.memory?.value !== undefined) {
69
return ConfigurationTarget.MEMORY;
70
}
71
if (configurationValue.workspaceFolder?.value !== undefined) {
72
return ConfigurationTarget.WORKSPACE_FOLDER;
73
}
74
if (configurationValue.workspace?.value !== undefined) {
75
return ConfigurationTarget.WORKSPACE;
76
}
77
if (configurationValue.userRemote?.value !== undefined) {
78
return ConfigurationTarget.USER_REMOTE;
79
}
80
return ConfigurationTarget.USER_LOCAL;
81
}
82
83
private _getValue<T>(resource: URI | undefined, position: IPosition | null, section: string | undefined): T {
84
const language = resource ? this.getLanguage(resource, position) : undefined;
85
if (typeof section === 'undefined') {
86
return this.configurationService.getValue<T>({ resource, overrideIdentifier: language });
87
}
88
return this.configurationService.getValue<T>(section, { resource, overrideIdentifier: language });
89
}
90
91
inspect<T>(resource: URI | undefined, position: IPosition | null, section: string): IConfigurationValue<Readonly<T>> {
92
const language = resource ? this.getLanguage(resource, position) : undefined;
93
return this.configurationService.inspect<T>(section, { resource, overrideIdentifier: language });
94
}
95
96
private getLanguage(resource: URI, position: IPosition | null): string | null {
97
const model = this.modelService.getModel(resource);
98
if (model) {
99
return position ? model.getLanguageIdAtPosition(position.lineNumber, position.column) : model.getLanguageId();
100
}
101
return this.languageService.guessLanguageIdByFilepathOrFirstLine(resource);
102
}
103
104
private toResourceConfigurationChangeEvent(configurationChangeEvent: IConfigurationChangeEvent): ITextResourceConfigurationChangeEvent {
105
return {
106
affectedKeys: configurationChangeEvent.affectedKeys,
107
affectsConfiguration: (resource: URI | undefined, configuration: string) => {
108
const overrideIdentifier = resource ? this.getLanguage(resource, null) : undefined;
109
if (configurationChangeEvent.affectsConfiguration(configuration, { resource, overrideIdentifier })) {
110
return true;
111
}
112
if (overrideIdentifier) {
113
//TODO@sandy081 workaround for https://github.com/microsoft/vscode/issues/240410
114
return configurationChangeEvent.affectedKeys.has(`[${overrideIdentifier}]`);
115
}
116
return false;
117
}
118
};
119
}
120
}
121
122