Path: blob/main/extensions/copilot/src/extension/inlineEdits/vscode-node/utils/virtualTextDocumentProvider.ts
13405 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 { EventEmitter, Uri, commands, workspace } from 'vscode';6import { Disposable } from '../../../../util/vs/base/common/lifecycle';78export class VirtualTextDocumentProvider extends Disposable {9private static id = 0;1011private readonly _documents = new Map<string, VirtualDocument>();1213private readonly _didChangeEmitter = this._register(new EventEmitter<Uri>());1415constructor(16public readonly scheme: string17) {18super();1920this._register(workspace.registerTextDocumentContentProvider(scheme, {21provideTextDocumentContent: (uri, token) => {22const doc = this._documents.get(uri.toString());23if (!doc) { return '(document not found)'; }24return doc.content;25},26onDidChange: this._didChangeEmitter.event,27}));28}2930clear(): void {31this._documents.clear();32}3334createDocument(data: string = '', extension: string = 'txt'): VirtualDocument {35const uri = Uri.parse(`${this.scheme}:///virtual-text-document/${VirtualTextDocumentProvider.id++}.${extension}`);36const document = new VirtualDocument(uri, () => this._didChangeEmitter.fire(uri));37document.setContent(data);38this._documents.set(uri.toString(), document);39return document;40}4142createUriForData(data: string, extension: string = 'txt'): Uri {43const d = this.createDocument(data, extension);44return d.uri;45}4647createDocumentForUri(uri: Uri): VirtualDocument {48if (uri.scheme !== this.scheme) {49throw new Error(`Invalid scheme: ${uri.scheme}`);50}51const document = new VirtualDocument(uri, () => this._didChangeEmitter.fire(uri));52this._documents.set(uri.toString(), document);53return document;54}5556openUri(uri: Uri): void {57commands.executeCommand('vscode.open', uri);58}59}6061class VirtualDocument {62private _content: string = '';6364public get content(): string {65return this._content;66}6768constructor(69public readonly uri: Uri,70private readonly _handleChanged: () => void,71) { }7273public setContent(content: string): void {74this._content = content;75this._handleChanged();76}77}787980