Path: blob/main/src/vs/workbench/contrib/editTelemetry/browser/helpers/annotatedDocuments.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 { Disposable } from '../../../../../base/common/lifecycle.js';6import { IObservable, mapObservableArrayCached, derived, derivedObservableWithCache, observableFromEvent, observableSignalFromEvent } from '../../../../../base/common/observable.js';7import { isDefined } from '../../../../../base/common/types.js';8import { URI } from '../../../../../base/common/uri.js';9import { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';10import { EditorResourceAccessor } from '../../../../common/editor.js';11import { IEditorGroupsService } from '../../../../services/editor/common/editorGroupsService.js';12import { IDocumentWithAnnotatedEdits, EditSourceData, DocumentWithSourceAnnotatedEdits, CombineStreamedChanges, MinimizeEditsProcessor } from './documentWithAnnotatedEdits.js';13import { ObservableWorkspace, IObservableDocument } from './observableWorkspace.js';1415export class AnnotatedDocuments extends Disposable {16public readonly documents: IObservable<readonly AnnotatedDocument[]>;1718constructor(19private readonly _workspace: ObservableWorkspace,20@IEditorGroupsService private readonly _editorGroupsService: IEditorGroupsService,21@IInstantiationService private readonly _instantiationService: IInstantiationService22) {23super();2425const onDidAddGroupSignal = observableSignalFromEvent(this, this._editorGroupsService.onDidAddGroup);26const onDidRemoveGroupSignal = observableSignalFromEvent(this, this._editorGroupsService.onDidRemoveGroup);27const groups = derived(this, reader => {28onDidAddGroupSignal.read(reader);29onDidRemoveGroupSignal.read(reader);30return this._editorGroupsService.groups;31});32const visibleUris: IObservable<Map<string, URI>> = mapObservableArrayCached(this, groups, g => {33const editors = observableFromEvent(this, g.onDidModelChange, () => g.editors);34return editors.map(e => e.map(editor => EditorResourceAccessor.getCanonicalUri(editor)));35}).map((editors, reader) => {36const map = new Map<string, URI>();37for (const urisObs of editors) {38for (const uri of urisObs.read(reader)) {39if (isDefined(uri)) {40map.set(uri.toString(), uri);41}42}43}44return map;45});4647const states = mapObservableArrayCached(this, this._workspace.documents, (doc, store) => {48const docIsVisible = derived(reader => visibleUris.read(reader).has(doc.uri.toString()));49const wasEverVisible = derivedObservableWithCache<boolean>(this, (reader, lastVal) => lastVal || docIsVisible.read(reader));50return wasEverVisible.map(v => v ? store.add(this._instantiationService.createInstance(AnnotatedDocument, doc, docIsVisible)) : undefined);51});5253this.documents = states.map((vals, reader) => vals.map(v => v.read(reader)).filter(isDefined));5455this.documents.recomputeInitiallyAndOnChange(this._store);56}57}5859export class AnnotatedDocument extends Disposable {60public readonly documentWithAnnotations;6162constructor(63public readonly document: IObservableDocument,64public readonly isVisible: IObservable<boolean>,65@IInstantiationService private readonly _instantiationService: IInstantiationService66) {67super();6869let processedDoc: IDocumentWithAnnotatedEdits<EditSourceData> = this._store.add(new DocumentWithSourceAnnotatedEdits(document));70// Combine streaming edits into one and make edit smaller71processedDoc = this._store.add(this._instantiationService.createInstance((CombineStreamedChanges<EditSourceData>), processedDoc));72// Remove common suffix and prefix from edits73processedDoc = this._store.add(new MinimizeEditsProcessor(processedDoc));7475this.documentWithAnnotations = processedDoc;76}77}787980