Path: blob/main/src/vs/editor/contrib/diffEditorBreadcrumbs/browser/contribution.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { reverseOrder, compareBy, numberComparator } from '../../../../base/common/arrays.js';6import { observableValue, observableSignalFromEvent, autorunWithStore, IReader } from '../../../../base/common/observable.js';7import { HideUnchangedRegionsFeature, IDiffEditorBreadcrumbsSource } from '../../../browser/widget/diffEditor/features/hideUnchangedRegionsFeature.js';8import { DisposableCancellationTokenSource } from '../../../browser/widget/diffEditor/utils.js';9import { LineRange } from '../../../common/core/ranges/lineRange.js';10import { ITextModel } from '../../../common/model.js';11import { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';12import { IOutlineModelService, OutlineModel } from '../../documentSymbols/browser/outlineModel.js';13import { Disposable } from '../../../../base/common/lifecycle.js';14import { Event } from '../../../../base/common/event.js';15import { SymbolKind } from '../../../common/languages.js';1617class DiffEditorBreadcrumbsSource extends Disposable implements IDiffEditorBreadcrumbsSource {18private readonly _currentModel = observableValue<OutlineModel | undefined>(this, undefined);1920constructor(21private readonly _textModel: ITextModel,22@ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService,23@IOutlineModelService private readonly _outlineModelService: IOutlineModelService,24) {25super();2627const documentSymbolProviderChanged = observableSignalFromEvent(28'documentSymbolProvider.onDidChange',29this._languageFeaturesService.documentSymbolProvider.onDidChange30);3132const textModelChanged = observableSignalFromEvent(33'_textModel.onDidChangeContent',34Event.debounce<any>(e => this._textModel.onDidChangeContent(e), () => undefined, 100)35);3637this._register(autorunWithStore(async (reader, store) => {38documentSymbolProviderChanged.read(reader);39textModelChanged.read(reader);4041const src = store.add(new DisposableCancellationTokenSource());42const model = await this._outlineModelService.getOrCreate(this._textModel, src.token);43if (store.isDisposed) { return; }4445this._currentModel.set(model, undefined);46}));47}4849public getBreadcrumbItems(startRange: LineRange, reader: IReader): { name: string; kind: SymbolKind; startLineNumber: number }[] {50const m = this._currentModel.read(reader);51if (!m) { return []; }52const symbols = m.asListOfDocumentSymbols()53.filter(s => startRange.contains(s.range.startLineNumber) && !startRange.contains(s.range.endLineNumber));54symbols.sort(reverseOrder(compareBy(s => s.range.endLineNumber - s.range.startLineNumber, numberComparator)));55return symbols.map(s => ({ name: s.name, kind: s.kind, startLineNumber: s.range.startLineNumber }));56}57}5859HideUnchangedRegionsFeature.setBreadcrumbsSourceFactory((textModel, instantiationService) => {60return instantiationService.createInstance(DiffEditorBreadcrumbsSource, textModel);61});626364