Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/src/extension/inlineEdits/vscode-node/utils/virtualTextDocumentProvider.ts
13405 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 { EventEmitter, Uri, commands, workspace } from 'vscode';
7
import { Disposable } from '../../../../util/vs/base/common/lifecycle';
8
9
export class VirtualTextDocumentProvider extends Disposable {
10
private static id = 0;
11
12
private readonly _documents = new Map<string, VirtualDocument>();
13
14
private readonly _didChangeEmitter = this._register(new EventEmitter<Uri>());
15
16
constructor(
17
public readonly scheme: string
18
) {
19
super();
20
21
this._register(workspace.registerTextDocumentContentProvider(scheme, {
22
provideTextDocumentContent: (uri, token) => {
23
const doc = this._documents.get(uri.toString());
24
if (!doc) { return '(document not found)'; }
25
return doc.content;
26
},
27
onDidChange: this._didChangeEmitter.event,
28
}));
29
}
30
31
clear(): void {
32
this._documents.clear();
33
}
34
35
createDocument(data: string = '', extension: string = 'txt'): VirtualDocument {
36
const uri = Uri.parse(`${this.scheme}:///virtual-text-document/${VirtualTextDocumentProvider.id++}.${extension}`);
37
const document = new VirtualDocument(uri, () => this._didChangeEmitter.fire(uri));
38
document.setContent(data);
39
this._documents.set(uri.toString(), document);
40
return document;
41
}
42
43
createUriForData(data: string, extension: string = 'txt'): Uri {
44
const d = this.createDocument(data, extension);
45
return d.uri;
46
}
47
48
createDocumentForUri(uri: Uri): VirtualDocument {
49
if (uri.scheme !== this.scheme) {
50
throw new Error(`Invalid scheme: ${uri.scheme}`);
51
}
52
const document = new VirtualDocument(uri, () => this._didChangeEmitter.fire(uri));
53
this._documents.set(uri.toString(), document);
54
return document;
55
}
56
57
openUri(uri: Uri): void {
58
commands.executeCommand('vscode.open', uri);
59
}
60
}
61
62
class VirtualDocument {
63
private _content: string = '';
64
65
public get content(): string {
66
return this._content;
67
}
68
69
constructor(
70
public readonly uri: Uri,
71
private readonly _handleChanged: () => void,
72
) { }
73
74
public setContent(content: string): void {
75
this._content = content;
76
this._handleChanged();
77
}
78
}
79
80