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