Skip to content

Commit 8c9663f

Browse files
committed
Remove the static LanguageConfigurationRegistry
1 parent 8515371 commit 8c9663f

File tree

12 files changed

+131
-136
lines changed

12 files changed

+131
-136
lines changed

src/vs/editor/common/languages/autoIndent.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,21 @@ import { IndentAction } from 'vs/editor/common/languages/languageConfiguration';
1010
import { createScopedLineTokens } from 'vs/editor/common/languages/supports';
1111
import { IndentConsts, IndentRulesSupport } from 'vs/editor/common/languages/supports/indentRules';
1212
import { EditorAutoIndentStrategy } from 'vs/editor/common/config/editorOptions';
13-
import { getScopedLineTokens, IIndentConverter, ILanguageConfigurationService, IVirtualModel } from 'vs/editor/common/languages/languageConfigurationRegistry';
13+
import { getScopedLineTokens, ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry';
14+
import { LineTokens } from 'vs/editor/common/tokens/lineTokens';
15+
16+
export interface IVirtualModel {
17+
getLineTokens(lineNumber: number): LineTokens;
18+
getLanguageId(): string;
19+
getLanguageIdAtPosition(lineNumber: number, column: number): string;
20+
getLineContent(lineNumber: number): string;
21+
}
22+
23+
export interface IIndentConverter {
24+
shiftIndent(indentation: string): string;
25+
unshiftIndent(indentation: string): string;
26+
normalizeIndentation?(indentation: string): string;
27+
}
1428

1529
/**
1630
* Get nearest preceding line which doesn't match unIndentPattern or contains all whitespace.

src/vs/editor/common/languages/languageConfigurationRegistry.ts

Lines changed: 67 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import { Emitter, Event } from 'vs/base/common/event';
77
import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle';
88
import * as strings from 'vs/base/common/strings';
9-
import { LineTokens } from 'vs/editor/common/tokens/lineTokens';
109
import { ITextModel } from 'vs/editor/common/model';
1110
import { DEFAULT_WORD_REGEXP, ensureValidWordDefinition } from 'vs/editor/common/core/wordHelper';
1211
import { EnterAction, FoldingRules, IAutoClosingPair, IndentationRule, LanguageConfiguration, AutoClosingPairs, CharacterPair, ExplicitLanguageConfiguration } from 'vs/editor/common/languages/languageConfiguration';
@@ -21,6 +20,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'
2120
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
2221
import { ILanguageService } from 'vs/editor/common/languages/language';
2322
import { registerSingleton } from 'vs/platform/instantiation/common/extensions';
23+
import { PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry';
2424

2525
/**
2626
* Interface used to support insertion of mode specific comments.
@@ -31,19 +31,6 @@ export interface ICommentsConfiguration {
3131
blockCommentEndToken?: string;
3232
}
3333

34-
export interface IVirtualModel {
35-
getLineTokens(lineNumber: number): LineTokens;
36-
getLanguageId(): string;
37-
getLanguageIdAtPosition(lineNumber: number, column: number): string;
38-
getLineContent(lineNumber: number): string;
39-
}
40-
41-
export interface IIndentConverter {
42-
shiftIndent(indentation: string): string;
43-
unshiftIndent(indentation: string): string;
44-
normalizeIndentation?(indentation: string): string;
45-
}
46-
4734
export interface ILanguageConfigurationService {
4835
readonly _serviceBrand: undefined;
4936

@@ -71,6 +58,8 @@ export const ILanguageConfigurationService = createDecorator<ILanguageConfigurat
7158
export class LanguageConfigurationService extends Disposable implements ILanguageConfigurationService {
7259
_serviceBrand: undefined;
7360

61+
private readonly _registry = this._register(new LanguageConfigurationRegistry());
62+
7463
private readonly onDidChangeEmitter = this._register(new Emitter<LanguageConfigurationServiceChangeEvent>());
7564
public readonly onDidChange = this.onDidChangeEmitter.event;
7665

@@ -107,20 +96,20 @@ export class LanguageConfigurationService extends Disposable implements ILanguag
10796
}
10897
}));
10998

110-
this._register(LanguageConfigurationRegistry.onDidChange((e) => {
99+
this._register(this._registry.onDidChange((e) => {
111100
this.configurations.delete(e.languageId);
112101
this.onDidChangeEmitter.fire(new LanguageConfigurationServiceChangeEvent(e.languageId));
113102
}));
114103
}
115104

116105
public register(languageId: string, configuration: LanguageConfiguration, priority?: number): IDisposable {
117-
return LanguageConfigurationRegistry.register(languageId, configuration, priority);
106+
return this._registry.register(languageId, configuration, priority);
118107
}
119108

120109
public getLanguageConfiguration(languageId: string): ResolvedLanguageConfiguration {
121110
let result = this.configurations.get(languageId);
122111
if (!result) {
123-
result = computeConfig(languageId, this.configurationService, this.languageService);
112+
result = computeConfig(languageId, this._registry, this.configurationService, this.languageService);
124113
this.configurations.set(languageId, result);
125114
}
126115
return result;
@@ -129,10 +118,11 @@ export class LanguageConfigurationService extends Disposable implements ILanguag
129118

130119
function computeConfig(
131120
languageId: string,
121+
registry: LanguageConfigurationRegistry,
132122
configurationService: IConfigurationService,
133123
languageService: ILanguageService,
134124
): ResolvedLanguageConfiguration {
135-
let languageConfig = LanguageConfigurationRegistry.getLanguageConfiguration(languageId);
125+
let languageConfig = registry.getLanguageConfiguration(languageId);
136126

137127
if (!languageConfig) {
138128
if (!languageService.isRegisteredLanguageId(languageId)) {
@@ -179,41 +169,6 @@ function validateBracketPairs(data: unknown): CharacterPair[] | undefined {
179169
}).filter((p): p is CharacterPair => !!p);
180170
}
181171

182-
export class LanguageConfigurationChangeEvent {
183-
constructor(public readonly languageId: string) { }
184-
}
185-
186-
export class LanguageConfigurationRegistryImpl {
187-
private readonly _entries = new Map<string, ComposedLanguageConfiguration>();
188-
189-
private readonly _onDidChange = new Emitter<LanguageConfigurationChangeEvent>();
190-
public readonly onDidChange: Event<LanguageConfigurationChangeEvent> = this._onDidChange.event;
191-
192-
/**
193-
* @param priority Use a higher number for higher priority
194-
*/
195-
public register(languageId: string, configuration: LanguageConfiguration, priority: number = 0): IDisposable {
196-
let entries = this._entries.get(languageId);
197-
if (!entries) {
198-
entries = new ComposedLanguageConfiguration(languageId);
199-
this._entries.set(languageId, entries);
200-
}
201-
202-
const disposable = entries.register(configuration, priority);
203-
this._onDidChange.fire(new LanguageConfigurationChangeEvent(languageId));
204-
205-
return toDisposable(() => {
206-
disposable.dispose();
207-
this._onDidChange.fire(new LanguageConfigurationChangeEvent(languageId));
208-
});
209-
}
210-
211-
public getLanguageConfiguration(languageId: string): ResolvedLanguageConfiguration | null {
212-
const entries = this._entries.get(languageId);
213-
return entries?.getResolvedConfiguration() || null;
214-
}
215-
}
216-
217172
export function getIndentationAtPosition(model: ITextModel, lineNumber: number, column: number): string {
218173
const lineText = model.getLineContent(lineNumber);
219174
let indentation = strings.getLeadingWhitespace(lineText);
@@ -230,11 +185,6 @@ export function getScopedLineTokens(model: ITextModel, lineNumber: number, colum
230185
return createScopedLineTokens(lineTokens, column);
231186
}
232187

233-
/**
234-
* @deprecated Use ILanguageConfigurationService instead.
235-
*/
236-
export const LanguageConfigurationRegistry = new LanguageConfigurationRegistryImpl();
237-
238188
class ComposedLanguageConfiguration {
239189
private readonly _entries: LanguageConfigurationContribution[];
240190
private _order: number;
@@ -340,6 +290,65 @@ class LanguageConfigurationContribution {
340290
}
341291
}
342292

293+
export class LanguageConfigurationChangeEvent {
294+
constructor(public readonly languageId: string) { }
295+
}
296+
297+
export class LanguageConfigurationRegistry extends Disposable {
298+
private readonly _entries = new Map<string, ComposedLanguageConfiguration>();
299+
300+
private readonly _onDidChange = this._register(new Emitter<LanguageConfigurationChangeEvent>());
301+
public readonly onDidChange: Event<LanguageConfigurationChangeEvent> = this._onDidChange.event;
302+
303+
constructor() {
304+
super();
305+
this._register(this.register(PLAINTEXT_LANGUAGE_ID, {
306+
brackets: [
307+
['(', ')'],
308+
['[', ']'],
309+
['{', '}'],
310+
],
311+
surroundingPairs: [
312+
{ open: '{', close: '}' },
313+
{ open: '[', close: ']' },
314+
{ open: '(', close: ')' },
315+
{ open: '<', close: '>' },
316+
{ open: '\"', close: '\"' },
317+
{ open: '\'', close: '\'' },
318+
{ open: '`', close: '`' },
319+
],
320+
colorizedBracketPairs: [],
321+
folding: {
322+
offSide: true
323+
}
324+
}, 0));
325+
}
326+
327+
/**
328+
* @param priority Use a higher number for higher priority
329+
*/
330+
public register(languageId: string, configuration: LanguageConfiguration, priority: number = 0): IDisposable {
331+
let entries = this._entries.get(languageId);
332+
if (!entries) {
333+
entries = new ComposedLanguageConfiguration(languageId);
334+
this._entries.set(languageId, entries);
335+
}
336+
337+
const disposable = entries.register(configuration, priority);
338+
this._onDidChange.fire(new LanguageConfigurationChangeEvent(languageId));
339+
340+
return toDisposable(() => {
341+
disposable.dispose();
342+
this._onDidChange.fire(new LanguageConfigurationChangeEvent(languageId));
343+
});
344+
}
345+
346+
public getLanguageConfiguration(languageId: string): ResolvedLanguageConfiguration | null {
347+
const entries = this._entries.get(languageId);
348+
return entries?.getResolvedConfiguration() || null;
349+
}
350+
}
351+
343352
/**
344353
* Immutable.
345354
*/

src/vs/editor/common/languages/modesRegistry.ts

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
import * as nls from 'vs/nls';
77
import { Emitter, Event } from 'vs/base/common/event';
8-
import { LanguageConfigurationRegistry } from 'vs/editor/common/languages/languageConfigurationRegistry';
98
import { ILanguageExtensionPoint } from 'vs/editor/common/languages/language';
109
import { Registry } from 'vs/platform/registry/common/platform';
1110
import { IDisposable } from 'vs/base/common/lifecycle';
@@ -61,27 +60,6 @@ ModesRegistry.registerLanguage({
6160
mimetypes: [Mimes.text]
6261
});
6362

64-
LanguageConfigurationRegistry.register(PLAINTEXT_LANGUAGE_ID, {
65-
brackets: [
66-
['(', ')'],
67-
['[', ']'],
68-
['{', '}'],
69-
],
70-
surroundingPairs: [
71-
{ open: '{', close: '}' },
72-
{ open: '[', close: ']' },
73-
{ open: '(', close: ')' },
74-
{ open: '<', close: '>' },
75-
{ open: '\"', close: '\"' },
76-
{ open: '\'', close: '\'' },
77-
{ open: '`', close: '`' },
78-
],
79-
colorizedBracketPairs: [],
80-
folding: {
81-
offSide: true
82-
}
83-
}, 0);
84-
8563
Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration)
8664
.registerDefaultConfigurations([{
8765
overrides: {

src/vs/editor/common/services/languagesRegistry.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,10 @@ import { ModesRegistry, PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages
1414
import { ILanguageExtensionPoint, ILanguageNameIdPair, ILanguageIcon } from 'vs/editor/common/languages/language';
1515
import { Extensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry';
1616
import { Registry } from 'vs/platform/registry/common/platform';
17-
import { LanguageConfigurationRegistry } from 'vs/editor/common/languages/languageConfigurationRegistry';
1817

1918
const hasOwnProperty = Object.prototype.hasOwnProperty;
2019
const NULL_LANGUAGE_ID = 'vs.editor.nullLanguage';
2120

22-
LanguageConfigurationRegistry.register(NULL_LANGUAGE_ID, {});
23-
2421
export interface IResolvedLanguage {
2522
identifier: string;
2623
name: string | null;

src/vs/editor/contrib/linesOperations/browser/moveLinesCommand.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ import { Selection } from 'vs/editor/common/core/selection';
1111
import { ICommand, ICursorStateComputerData, IEditOperationBuilder } from 'vs/editor/common/editorCommon';
1212
import { ITextModel } from 'vs/editor/common/model';
1313
import { CompleteEnterAction, IndentAction } from 'vs/editor/common/languages/languageConfiguration';
14-
import { IIndentConverter, ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry';
14+
import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry';
1515
import { IndentConsts } from 'vs/editor/common/languages/supports/indentRules';
1616
import * as indentUtils from 'vs/editor/contrib/indentation/browser/indentUtils';
17-
import { getGoodIndentForLine, getIndentMetadata } from 'vs/editor/common/languages/autoIndent';
17+
import { getGoodIndentForLine, getIndentMetadata, IIndentConverter } from 'vs/editor/common/languages/autoIndent';
1818
import { getEnterAction } from 'vs/editor/common/languages/enterAction';
1919

2020
export class MoveLinesCommand implements ICommand {

src/vs/editor/contrib/wordOperations/test/browser/wordOperations.test.ts

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,11 @@ import { ILanguageConfigurationService } from 'vs/editor/common/languages/langua
1313
import { ViewModel } from 'vs/editor/common/viewModel/viewModelImpl';
1414
import { deserializePipePositions, serializePipePositions, testRepeatedActionAndExtractPositions } from 'vs/editor/contrib/wordOperations/test/browser/wordTestUtils';
1515
import { CursorWordAccessibilityLeft, CursorWordAccessibilityLeftSelect, CursorWordAccessibilityRight, CursorWordAccessibilityRightSelect, CursorWordEndLeft, CursorWordEndLeftSelect, CursorWordEndRight, CursorWordEndRightSelect, CursorWordLeft, CursorWordLeftSelect, CursorWordRight, CursorWordRightSelect, CursorWordStartLeft, CursorWordStartLeftSelect, CursorWordStartRight, CursorWordStartRightSelect, DeleteInsideWord, DeleteWordEndLeft, DeleteWordEndRight, DeleteWordLeft, DeleteWordRight, DeleteWordStartLeft, DeleteWordStartRight } from 'vs/editor/contrib/wordOperations/browser/wordOperations';
16-
import { StaticServiceAccessor } from 'vs/editor/contrib/wordPartOperations/test/browser/utils';
1716
import { createCodeEditorServices, instantiateTestCodeEditor, withTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor';
1817
import { instantiateTextModel } from 'vs/editor/test/common/testTextModel';
19-
import { TestLanguageConfigurationService } from 'vs/editor/test/common/modes/testLanguageConfigurationService';
2018
import { DisposableStore } from 'vs/base/common/lifecycle';
2119
import { ModesRegistry } from 'vs/editor/common/languages/modesRegistry';
20+
import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock';
2221

2322
suite('WordOperations', () => {
2423

@@ -46,13 +45,24 @@ suite('WordOperations', () => {
4645
const _deleteWordEndRight = new DeleteWordEndRight();
4746
const _deleteInsideWord = new DeleteInsideWord();
4847

49-
const serviceAccessor = new StaticServiceAccessor().withService(
50-
ILanguageConfigurationService,
51-
new TestLanguageConfigurationService()
52-
);
48+
let disposables: DisposableStore;
49+
let instantiationService: TestInstantiationService;
50+
let languageConfigurationService: ILanguageConfigurationService;
51+
52+
setup(() => {
53+
disposables = new DisposableStore();
54+
instantiationService = createCodeEditorServices(disposables);
55+
languageConfigurationService = instantiationService.get(ILanguageConfigurationService);
56+
});
57+
58+
teardown(() => {
59+
disposables.dispose();
60+
});
5361

5462
function runEditorCommand(editor: ICodeEditor, command: EditorCommand): void {
55-
command.runEditorCommand(serviceAccessor, editor, null);
63+
instantiationService.invokeFunction((accessor) => {
64+
command.runEditorCommand(accessor, editor, null);
65+
});
5666
}
5767
function cursorWordLeft(editor: ICodeEditor, inSelectionMode: boolean = false): void {
5868
runEditorCommand(editor, inSelectionMode ? _cursorWordLeftSelect : _cursorWordLeft);
@@ -739,9 +749,6 @@ suite('WordOperations', () => {
739749

740750
test('deleteWordLeft - issue #91855: Matching (quote, bracket, paren) doesn\'t get deleted when hitting Ctrl+Backspace', () => {
741751
const languageId = 'myTestMode';
742-
const disposables = new DisposableStore();
743-
const instantiationService = createCodeEditorServices(disposables);
744-
const languageConfigurationService = instantiationService.get(ILanguageConfigurationService);
745752

746753
disposables.add(ModesRegistry.registerLanguage({ id: languageId }));
747754
disposables.add(languageConfigurationService.register(languageId, {
@@ -756,8 +763,6 @@ suite('WordOperations', () => {
756763
editor.setPosition(new Position(1, 4));
757764
deleteWordLeft(editor);
758765
assert.strictEqual(model.getLineContent(1), 'a ');
759-
760-
disposables.dispose();
761766
});
762767

763768
test('deleteInsideWord - empty line', () => {

src/vs/editor/standalone/browser/standaloneLanguages.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { Range } from 'vs/editor/common/core/range';
1111
import * as model from 'vs/editor/common/model';
1212
import * as languages from 'vs/editor/common/languages';
1313
import { LanguageConfiguration } from 'vs/editor/common/languages/languageConfiguration';
14-
import { LanguageConfigurationRegistry } from 'vs/editor/common/languages/languageConfigurationRegistry';
14+
import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry';
1515
import { ModesRegistry } from 'vs/editor/common/languages/modesRegistry';
1616
import { ILanguageExtensionPoint, ILanguageService } from 'vs/editor/common/languages/language';
1717
import * as standaloneEnums from 'vs/editor/common/standalone/standaloneEnums';
@@ -70,7 +70,8 @@ export function setLanguageConfiguration(languageId: string, configuration: Lang
7070
if (!languageService.isRegisteredLanguageId(languageId)) {
7171
throw new Error(`Cannot set configuration for unknown language ${languageId}`);
7272
}
73-
return LanguageConfigurationRegistry.register(languageId, configuration, 100);
73+
const languageConfigurationService = StandaloneServices.get(ILanguageConfigurationService);
74+
return languageConfigurationService.register(languageId, configuration, 100);
7475
}
7576

7677
/**

src/vs/editor/test/common/model/bracketPairColorizer/brackets.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ suite('Bracket Pair Colorizer - Brackets', () => {
3434
]
3535
}));
3636

37-
const brackets = new LanguageAgnosticBracketTokens(denseKeyProvider, l => languageConfigService.getLanguageConfiguration(l, undefined));
37+
const brackets = new LanguageAgnosticBracketTokens(denseKeyProvider, l => languageConfigService.getLanguageConfiguration(l));
3838
const bracketsExpected = [
3939
{ text: '{', length: 1, kind: 'OpeningBracket', bracketId: getKey('{'), bracketIds: getImmutableSet(['{']) },
4040
{ text: '[', length: 1, kind: 'OpeningBracket', bracketId: getKey('['), bracketIds: getImmutableSet(['[']) },

src/vs/editor/test/common/model/bracketPairColorizer/tokenizer.test.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import { ILanguageConfigurationService } from 'vs/editor/common/languages/langua
1515
import { ModesRegistry } from 'vs/editor/common/languages/modesRegistry';
1616
import { ILanguageService } from 'vs/editor/common/languages/language';
1717
import { createModelServices, instantiateTextModel } from 'vs/editor/test/common/testTextModel';
18-
import { TestLanguageConfigurationService } from 'vs/editor/test/common/modes/testLanguageConfigurationService';
1918

2019
suite('Bracket Pair Colorizer - Tokenizer', () => {
2120
test('Basic', () => {
@@ -44,8 +43,7 @@ suite('Bracket Pair Colorizer - Tokenizer', () => {
4443
const model = disposableStore.add(instantiateTextModel(instantiationService, document.getText(), mode1));
4544
model.forceTokenization(model.getLineCount());
4645

47-
const languageConfigService = new TestLanguageConfigurationService();
48-
const brackets = new LanguageAgnosticBracketTokens(denseKeyProvider, l => languageConfigService.getLanguageConfiguration(l, undefined));
46+
const brackets = new LanguageAgnosticBracketTokens(denseKeyProvider, l => languageConfigurationService.getLanguageConfiguration(l));
4947

5048
const tokens = readAllTokens(new TextBufferTokenizer(model, brackets));
5149

0 commit comments

Comments
 (0)