monaco-editor-core
Version:
A browser based code editor
90 lines (89 loc) • 3.5 kB
JavaScript
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { equals } from '../../../base/common/arrays.js';
import { RunOnceScheduler } from '../../../base/common/async.js';
import { Emitter } from '../../../base/common/event.js';
import { Disposable } from '../../../base/common/lifecycle.js';
import { LineRange } from '../core/lineRange.js';
/**
* @internal
*/
export class AttachedViews {
constructor() {
this._onDidChangeVisibleRanges = new Emitter();
this.onDidChangeVisibleRanges = this._onDidChangeVisibleRanges.event;
this._views = new Set();
}
attachView() {
const view = new AttachedViewImpl((state) => {
this._onDidChangeVisibleRanges.fire({ view, state });
});
this._views.add(view);
return view;
}
detachView(view) {
this._views.delete(view);
this._onDidChangeVisibleRanges.fire({ view, state: undefined });
}
}
class AttachedViewImpl {
constructor(handleStateChange) {
this.handleStateChange = handleStateChange;
}
setVisibleLines(visibleLines, stabilized) {
const visibleLineRanges = visibleLines.map((line) => new LineRange(line.startLineNumber, line.endLineNumber + 1));
this.handleStateChange({ visibleLineRanges, stabilized });
}
}
export class AttachedViewHandler extends Disposable {
get lineRanges() { return this._lineRanges; }
constructor(_refreshTokens) {
super();
this._refreshTokens = _refreshTokens;
this.runner = this._register(new RunOnceScheduler(() => this.update(), 50));
this._computedLineRanges = [];
this._lineRanges = [];
}
update() {
if (equals(this._computedLineRanges, this._lineRanges, (a, b) => a.equals(b))) {
return;
}
this._computedLineRanges = this._lineRanges;
this._refreshTokens();
}
handleStateChange(state) {
this._lineRanges = state.visibleLineRanges;
if (state.stabilized) {
this.runner.cancel();
this.update();
}
else {
this.runner.schedule();
}
}
}
export class AbstractTokens extends Disposable {
get backgroundTokenizationState() {
return this._backgroundTokenizationState;
}
constructor(_languageIdCodec, _textModel, getLanguageId) {
super();
this._languageIdCodec = _languageIdCodec;
this._textModel = _textModel;
this.getLanguageId = getLanguageId;
this._backgroundTokenizationState = 1 /* BackgroundTokenizationState.InProgress */;
this._onDidChangeBackgroundTokenizationState = this._register(new Emitter());
/** @internal, should not be exposed by the text model! */
this.onDidChangeBackgroundTokenizationState = this._onDidChangeBackgroundTokenizationState.event;
this._onDidChangeTokens = this._register(new Emitter());
/** @internal, should not be exposed by the text model! */
this.onDidChangeTokens = this._onDidChangeTokens.event;
}
tokenizeIfCheap(lineNumber) {
if (this.isCheapToTokenize(lineNumber)) {
this.forceTokenization(lineNumber);
}
}
}