UNPKG

monaco-editor-core

Version:

A browser based code editor

90 lines (89 loc) 3.5 kB
/*--------------------------------------------------------------------------------------------- * 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); } } }