Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/editTelemetry/browser/helpers/annotatedDocuments.ts
5250 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 { Disposable } from '../../../../../base/common/lifecycle.js';
7
import { IObservable, mapObservableArrayCached, derived, derivedObservableWithCache, observableFromEvent, observableSignalFromEvent, IReader } from '../../../../../base/common/observable.js';
8
import { isDefined } from '../../../../../base/common/types.js';
9
import { URI } from '../../../../../base/common/uri.js';
10
import { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';
11
import { EditorResourceAccessor } from '../../../../common/editor.js';
12
import { IEditorGroupsService } from '../../../../services/editor/common/editorGroupsService.js';
13
import { IDocumentWithAnnotatedEdits, EditSourceData, DocumentWithSourceAnnotatedEdits, CombineStreamedChanges, MinimizeEditsProcessor } from './documentWithAnnotatedEdits.js';
14
import { ObservableWorkspace, IObservableDocument } from './observableWorkspace.js';
15
16
export interface IAnnotatedDocuments {
17
readonly documents: IObservable<readonly AnnotatedDocument[]>;
18
}
19
20
export class AnnotatedDocuments extends Disposable implements IAnnotatedDocuments {
21
public readonly documents: IObservable<readonly AnnotatedDocument[]>;
22
private readonly _states;
23
24
constructor(
25
private readonly _workspace: ObservableWorkspace,
26
@IInstantiationService private readonly _instantiationService: IInstantiationService
27
) {
28
super();
29
30
const uriVisibilityProvider = this._instantiationService.createInstance(UriVisibilityProvider);
31
32
this._states = mapObservableArrayCached(this, this._workspace.documents, (doc, store) => {
33
const docIsVisible = derived(reader => uriVisibilityProvider.isVisible(doc.uri, reader));
34
const wasEverVisible = derivedObservableWithCache<boolean>(this, (reader, lastVal) => lastVal || docIsVisible.read(reader));
35
return wasEverVisible.map(v => v ? store.add(this._instantiationService.createInstance(AnnotatedDocument, doc, docIsVisible)) : undefined);
36
});
37
38
this.documents = this._states.map((vals, reader) => vals.map(v => v.read(reader)).filter(isDefined));
39
40
this.documents.recomputeInitiallyAndOnChange(this._store);
41
}
42
}
43
44
export class UriVisibilityProvider {
45
private readonly visibleUris: IObservable<Map<string, URI>>;
46
47
constructor(
48
@IEditorGroupsService private readonly _editorGroupsService: IEditorGroupsService
49
) {
50
const onDidAddGroupSignal = observableSignalFromEvent(this, this._editorGroupsService.onDidAddGroup);
51
const onDidRemoveGroupSignal = observableSignalFromEvent(this, this._editorGroupsService.onDidRemoveGroup);
52
const groups = derived(this, reader => {
53
onDidAddGroupSignal.read(reader);
54
onDidRemoveGroupSignal.read(reader);
55
return this._editorGroupsService.groups;
56
});
57
58
this.visibleUris = mapObservableArrayCached(this, groups, g => {
59
const editors = observableFromEvent(this, g.onDidModelChange, () => g.editors);
60
return editors.map(e => e.map(editor => EditorResourceAccessor.getCanonicalUri(editor)));
61
}).map((editors, reader) => {
62
const map = new Map<string, URI>();
63
for (const urisObs of editors) {
64
for (const uri of urisObs.read(reader)) {
65
if (isDefined(uri)) {
66
map.set(uri.toString(), uri);
67
}
68
}
69
}
70
return map;
71
});
72
}
73
74
public isVisible(uri: URI, reader: IReader): boolean {
75
return this.visibleUris.read(reader).has(uri.toString());
76
}
77
}
78
79
export class AnnotatedDocument extends Disposable {
80
public readonly documentWithAnnotations;
81
82
constructor(
83
public readonly document: IObservableDocument,
84
public readonly isVisible: IObservable<boolean>,
85
@IInstantiationService private readonly _instantiationService: IInstantiationService
86
) {
87
super();
88
89
let processedDoc: IDocumentWithAnnotatedEdits<EditSourceData> = this._store.add(new DocumentWithSourceAnnotatedEdits(document));
90
// Combine streaming edits into one and make edit smaller
91
processedDoc = this._store.add(this._instantiationService.createInstance((CombineStreamedChanges<EditSourceData>), processedDoc));
92
// Remove common suffix and prefix from edits
93
processedDoc = this._store.add(new MinimizeEditsProcessor(processedDoc));
94
95
this.documentWithAnnotations = processedDoc;
96
}
97
}
98
99