Skip to content

Commit c2a6d7a

Browse files
committed
add IModelLanguageConfigurationChangedEvent and ViewLanguageConfigurationEvent
1 parent 58b39d7 commit c2a6d7a

11 files changed

Lines changed: 95 additions & 13 deletions

File tree

src/vs/editor/common/commonCodeEditor.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import { hash } from 'vs/base/common/hash';
2323
import { EditorModeContext } from 'vs/editor/common/modes/editorModeContext';
2424
import {
2525
IModelContentChangedEvent, IModelDecorationsChangedEvent,
26-
IModelLanguageChangedEvent, IModelOptionsChangedEvent, TextModelEventType
26+
IModelLanguageChangedEvent, IModelOptionsChangedEvent, TextModelEventType, IModelLanguageConfigurationChangedEvent
2727
} from 'vs/editor/common/model/textModelEvents';
2828
import * as editorOptions from 'vs/editor/common/config/editorOptions';
2929
import { ICursorPositionChangedEvent, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents';
@@ -44,6 +44,9 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo
4444
private readonly _onDidChangeModelLanguage: Emitter<IModelLanguageChangedEvent> = this._register(new Emitter<IModelLanguageChangedEvent>());
4545
public readonly onDidChangeModelLanguage: Event<IModelLanguageChangedEvent> = this._onDidChangeModelLanguage.event;
4646

47+
private readonly _onDidChangeModelLanguageConfiguration: Emitter<IModelLanguageConfigurationChangedEvent> = this._register(new Emitter<IModelLanguageConfigurationChangedEvent>());
48+
public readonly onDidChangeModelLanguageConfiguration: Event<IModelLanguageConfigurationChangedEvent> = this._onDidChangeModelLanguage.event;
49+
4750
private readonly _onDidChangeModelOptions: Emitter<IModelOptionsChangedEvent> = this._register(new Emitter<IModelOptionsChangedEvent>());
4851
public readonly onDidChangeModelOptions: Event<IModelOptionsChangedEvent> = this._onDidChangeModelOptions.event;
4952

@@ -901,6 +904,10 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo
901904
this._onDidChangeModelLanguage.fire(e);
902905
break;
903906

907+
case TextModelEventType.ModelLanguageConfigurationChanged:
908+
this._onDidChangeModelLanguageConfiguration.fire(e);
909+
break;
910+
904911
case TextModelEventType.ModelContentChanged:
905912
this._onDidChangeModelContent.fire(e);
906913
break;

src/vs/editor/common/controller/cursor.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import { Range } from 'vs/editor/common/core/range';
1313
import { Selection, SelectionDirection, ISelection } from 'vs/editor/common/core/selection';
1414
import * as editorCommon from 'vs/editor/common/editorCommon';
1515
import { CursorColumns, CursorConfiguration, EditOperationResult, CursorContext, CursorState, RevealTarget, IColumnSelectData, ICursors } from 'vs/editor/common/controller/cursorCommon';
16-
import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry';
1716
import { DeleteOperations } from 'vs/editor/common/controller/cursorDeleteOperations';
1817
import { TypeOperations } from 'vs/editor/common/controller/cursorTypeOperations';
1918
import { TextModelEventType, ModelRawContentChangedEvent, RawContentChangedType } from 'vs/editor/common/model/textModelEvents';
@@ -150,11 +149,10 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors {
150149
this.context = new CursorContext(this._configuration, this._model, this._viewModel);
151150
this._cursors.updateContext(this.context);
152151
};
153-
this._register(this._model.onDidChangeLanguage((e) => {
152+
this._register(model.onDidChangeLanguage((e) => {
154153
updateCursorContext();
155154
}));
156-
this._register(LanguageConfigurationRegistry.onDidChange(() => {
157-
// TODO@Alex: react only if certain supports changed? (and if my model's mode changed)
155+
this._register(model.onDidChangeLanguageConfiguration(() => {
158156
updateCursorContext();
159157
}));
160158
this._register(model.onDidChangeOptions(() => {

src/vs/editor/common/editorCommon.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { IndentRange } from 'vs/editor/common/model/indentRanges';
1919
import { ITextSource } from 'vs/editor/common/model/textSource';
2020
import {
2121
ModelRawContentChangedEvent, IModelContentChangedEvent, IModelDecorationsChangedEvent,
22-
IModelLanguageChangedEvent, IModelOptionsChangedEvent
22+
IModelLanguageChangedEvent, IModelOptionsChangedEvent, IModelLanguageConfigurationChangedEvent
2323
} from 'vs/editor/common/model/textModelEvents';
2424
import * as editorOptions from 'vs/editor/common/config/editorOptions';
2525
import { ICursorPositionChangedEvent, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents';
@@ -1150,6 +1150,11 @@ export interface IModel extends IReadOnlyModel, IEditableTextModel, ITextModelWi
11501150
* @event
11511151
*/
11521152
onDidChangeLanguage(listener: (e: IModelLanguageChangedEvent) => void): IDisposable;
1153+
/**
1154+
* An event emitted when the language configuration associated with the model has changed.
1155+
* @event
1156+
*/
1157+
onDidChangeLanguageConfiguration(listener: (e: IModelLanguageConfigurationChangedEvent) => void): IDisposable;
11531158
/**
11541159
* An event emitted right before disposing the model.
11551160
* @event
@@ -1749,6 +1754,11 @@ export interface ICommonCodeEditor extends IEditor {
17491754
* @event
17501755
*/
17511756
onDidChangeModelLanguage(listener: (e: IModelLanguageChangedEvent) => void): IDisposable;
1757+
/**
1758+
* An event emitted when the language configuration of the current model has changed.
1759+
* @event
1760+
*/
1761+
onDidChangeModelLanguageConfiguration(listener: (e: IModelLanguageConfigurationChangedEvent) => void): IDisposable;
17521762
/**
17531763
* An event emitted when the options of the current model has changed.
17541764
* @event

src/vs/editor/common/model/model.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ export class Model extends EditableTextModel implements IModel {
3434
public onDidChangeLanguage(listener: (e: textModelEvents.IModelLanguageChangedEvent) => void): IDisposable {
3535
return this._eventEmitter.addListener(textModelEvents.TextModelEventType.ModelLanguageChanged, listener);
3636
}
37-
37+
public onDidChangeLanguageConfiguration(listener: (e: textModelEvents.IModelLanguageConfigurationChangedEvent) => void): IDisposable {
38+
return this._eventEmitter.addListener(textModelEvents.TextModelEventType.ModelLanguageConfigurationChanged, listener);
39+
}
3840
public static createFromString(text: string, options: ITextModelCreationOptions = TextModel.DEFAULT_CREATION_OPTIONS, languageIdentifier: LanguageIdentifier = null, uri: URI = null): Model {
3941
return new Model(RawTextSource.fromString(text), options, languageIdentifier, uri);
4042
}

src/vs/editor/common/model/textModelEvents.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export const TextModelEventType = {
1818
ModelContentChanged: 'contentChanged',
1919
ModelRawContentChanged2: 'rawContentChanged2',
2020
ModelDecorationsChanged: 'decorationsChanged',
21+
ModelLanguageConfigurationChanged: 'modelLanguageConfigurationChanged'
2122
};
2223

2324
/**
@@ -34,6 +35,12 @@ export interface IModelLanguageChangedEvent {
3435
readonly newLanguage: string;
3536
}
3637

38+
/**
39+
* An event describing that the language configuration associated with a model has changed.
40+
*/
41+
export interface IModelLanguageConfigurationChangedEvent {
42+
}
43+
3744
export interface IModelContentChange {
3845
/**
3946
* The range that got replaced.

src/vs/editor/common/model/textModelWithTokens.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke
7171
private _lastState: IState;
7272

7373
private _indentRanges: IndentRange[];
74+
private _languageRegistryListener: IDisposable;
7475

7576
private _revalidateTokensTimeout: number;
7677

@@ -98,12 +99,20 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke
9899

99100
this._revalidateTokensTimeout = -1;
100101

102+
this._languageRegistryListener = LanguageConfigurationRegistry.onDidChange((e) => {
103+
if (e.languageIdentifier.id === this._languageIdentifier.id) {
104+
this._resetIndentRanges();
105+
this._emitModelLanguageConfigurationEvent({});
106+
}
107+
});
108+
101109
this._resetTokenizationState();
102110
this._resetIndentRanges();
103111
}
104112

105113
public dispose(): void {
106114
this._tokenizationListener.dispose();
115+
this._languageRegistryListener.dispose();
107116
this._clearTimers();
108117
this._lastState = null;
109118

@@ -239,6 +248,7 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke
239248
}]
240249
});
241250
this._emitModelModeChangedEvent(e);
251+
this._emitModelLanguageConfigurationEvent({});
242252
}
243253

244254
public getLanguageIdAtPosition(_lineNumber: number, _column: number): LanguageId {
@@ -404,6 +414,12 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke
404414
}
405415
}
406416

417+
private _emitModelLanguageConfigurationEvent(e: textModelEvents.IModelLanguageConfigurationChangedEvent): void {
418+
if (!this._isDisposing) {
419+
this._eventEmitter.emit(textModelEvents.TextModelEventType.ModelLanguageConfigurationChanged, e);
420+
}
421+
}
422+
407423
private _emitModelModeChangedEvent(e: textModelEvents.IModelLanguageChangedEvent): void {
408424
if (!this._isDisposing) {
409425
this._eventEmitter.emit(textModelEvents.TextModelEventType.ModelLanguageChanged, e);

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -143,12 +143,16 @@ export class RichEditSupport {
143143
}
144144
}
145145

146+
export class LanguageConfigurationChangeEvent {
147+
languageIdentifier: LanguageIdentifier;
148+
}
149+
146150
export class LanguageConfigurationRegistryImpl {
147151

148152
private _entries: RichEditSupport[];
149153

150-
private _onDidChange: Emitter<void> = new Emitter<void>();
151-
public onDidChange: Event<void> = this._onDidChange.event;
154+
private _onDidChange: Emitter<LanguageConfigurationChangeEvent> = new Emitter<LanguageConfigurationChangeEvent>();
155+
public onDidChange: Event<LanguageConfigurationChangeEvent> = this._onDidChange.event;
152156

153157
constructor() {
154158
this._entries = [];
@@ -158,12 +162,12 @@ export class LanguageConfigurationRegistryImpl {
158162
let previous = this._getRichEditSupport(languageIdentifier.id);
159163
let current = new RichEditSupport(languageIdentifier, previous, configuration);
160164
this._entries[languageIdentifier.id] = current;
161-
this._onDidChange.fire(void 0);
165+
this._onDidChange.fire({ languageIdentifier });
162166
return {
163167
dispose: () => {
164168
if (this._entries[languageIdentifier.id] === current) {
165169
this._entries[languageIdentifier.id] = previous;
166-
this._onDidChange.fire(void 0);
170+
this._onDidChange.fire({ languageIdentifier });
167171
}
168172
}
169173
};

src/vs/editor/common/view/viewEvents.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ export const enum ViewEventType {
2727
ViewTokensChanged = 12,
2828
ViewTokensColorsChanged = 13,
2929
ViewZonesChanged = 14,
30-
ViewThemeChanged = 15
30+
ViewThemeChanged = 15,
31+
ViewLanguageConfigurationChanged = 16
3132
}
3233

3334
export class ViewConfigurationChangedEvent {
@@ -282,6 +283,14 @@ export class ViewZonesChangedEvent {
282283
}
283284
}
284285

286+
export class ViewLanguageConfigurationEvent {
287+
288+
public readonly type = ViewEventType.ViewLanguageConfigurationChanged;
289+
290+
constructor() {
291+
}
292+
}
293+
285294
export type ViewEvent = (
286295
ViewConfigurationChangedEvent
287296
| ViewCursorStateChangedEvent
@@ -298,6 +307,7 @@ export type ViewEvent = (
298307
| ViewTokensColorsChangedEvent
299308
| ViewZonesChangedEvent
300309
| ViewThemeChangedEvent
310+
| ViewLanguageConfigurationEvent
301311
);
302312

303313
export interface IViewEventListener {

src/vs/editor/common/viewModel/viewEventHandler.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ export class ViewEventHandler extends Disposable {
4949
public onFocusChanged(e: viewEvents.ViewFocusChangedEvent): boolean {
5050
return false;
5151
}
52+
public onLanguageConfigurationChanged(e: viewEvents.ViewLanguageConfigurationEvent): boolean {
53+
return false;
54+
}
5255
public onLineMappingChanged(e: viewEvents.ViewLineMappingChangedEvent): boolean {
5356
return false;
5457
}
@@ -121,6 +124,12 @@ export class ViewEventHandler extends Disposable {
121124
}
122125
break;
123126

127+
case viewEvents.ViewEventType.ViewLanguageConfigurationChanged:
128+
if (this.onLanguageConfigurationChanged(e)) {
129+
shouldRender = true;
130+
}
131+
break;
132+
124133
case viewEvents.ViewEventType.ViewLineMappingChanged:
125134
if (this.onLineMappingChanged(e)) {
126135
shouldRender = true;
@@ -175,7 +184,6 @@ export class ViewEventHandler extends Disposable {
175184
}
176185
break;
177186

178-
179187
case viewEvents.ViewEventType.ViewThemeChanged:
180188
if (this.onThemeChanged(e)) {
181189
shouldRender = true;

src/vs/editor/common/viewModel/viewModelImpl.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,10 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel
261261
// That's ok, a model tokens changed event will follow shortly
262262
break;
263263
}
264+
case textModelEvents.TextModelEventType.ModelLanguageConfigurationChanged: {
265+
eventsCollector.emit(new viewEvents.ViewLanguageConfigurationEvent());
266+
break;
267+
}
264268
case textModelEvents.TextModelEventType.ModelContentChanged: {
265269
// Ignore
266270
break;

0 commit comments

Comments
 (0)