Update paste and drop proposals (#206496)

* Update paste and drop proposals

Reworks the document paste and drop API proposals. Main highlights:

- Align more with code action api
- Allow a single paste provider to return multiple edits
- Allow resolving applied edits lazily
- Switch from using ids to scoped kinds like used for code actions

* Adding paste context

* Add context

* Update test
This commit is contained in:
Matt Bierner
2024-03-07 16:04:36 -08:00
committed by GitHub
parent d6fb91c889
commit 091987d943
21 changed files with 585 additions and 278 deletions

View File

@@ -22,7 +22,7 @@ import { createInsertUriListEdit, createUriListSnippet, getSnippetLabel } from '
*/
class ResourcePasteOrDropProvider implements vscode.DocumentPasteEditProvider, vscode.DocumentDropEditProvider {
public static readonly id = 'insertResource';
public static readonly kind = vscode.DocumentPasteEditKind.Empty.append('markdown', 'link');
public static readonly mimeTypes = [
Mime.textUriList,
@@ -32,7 +32,7 @@ class ResourcePasteOrDropProvider implements vscode.DocumentPasteEditProvider, v
private readonly _yieldTo = [
{ mimeType: 'text/plain' },
{ extensionId: 'vscode.ipynb', providerId: 'insertAttachment' },
{ kind: vscode.DocumentPasteEditKind.Empty.append('markdown', 'image', 'attachment') },
];
public async provideDocumentDropEdits(
@@ -62,8 +62,9 @@ class ResourcePasteOrDropProvider implements vscode.DocumentPasteEditProvider, v
document: vscode.TextDocument,
ranges: readonly vscode.Range[],
dataTransfer: vscode.DataTransfer,
_context: vscode.DocumentPasteEditContext,
token: vscode.CancellationToken,
): Promise<vscode.DocumentPasteEdit | undefined> {
): Promise<vscode.DocumentPasteEdit[] | undefined> {
const enabled = vscode.workspace.getConfiguration('markdown', document).get('editor.filePaste.enabled', true);
if (!enabled) {
return;
@@ -71,14 +72,15 @@ class ResourcePasteOrDropProvider implements vscode.DocumentPasteEditProvider, v
const createEdit = await this._getMediaFilesPasteEdit(document, dataTransfer, token);
if (createEdit) {
return createEdit;
return [createEdit];
}
if (token.isCancellationRequested) {
return;
}
return this._createEditFromUriListData(document, ranges, dataTransfer, token);
const edit = await this._createEditFromUriListData(document, ranges, dataTransfer, token);
return edit ? [edit] : undefined;
}
private async _createEditFromUriListData(
@@ -97,7 +99,7 @@ class ResourcePasteOrDropProvider implements vscode.DocumentPasteEditProvider, v
return;
}
const uriEdit = new vscode.DocumentPasteEdit('', pasteEdit.label);
const uriEdit = new vscode.DocumentPasteEdit('', pasteEdit.label, ResourcePasteOrDropProvider.kind);
const edit = new vscode.WorkspaceEdit();
edit.set(document.uri, pasteEdit.edits);
uriEdit.additionalEdit = edit;
@@ -124,7 +126,7 @@ class ResourcePasteOrDropProvider implements vscode.DocumentPasteEditProvider, v
return;
}
const pasteEdit = new vscode.DocumentPasteEdit(edit.snippet, edit.label);
const pasteEdit = new vscode.DocumentPasteEdit(edit.snippet, edit.label, ResourcePasteOrDropProvider.kind);
pasteEdit.additionalEdit = edit.additionalEdits;
pasteEdit.yieldTo = this._yieldTo;
return pasteEdit;
@@ -150,7 +152,7 @@ class ResourcePasteOrDropProvider implements vscode.DocumentPasteEditProvider, v
}
const dropEdit = new vscode.DocumentDropEdit(edit.snippet);
dropEdit.label = edit.label;
dropEdit.title = edit.label;
dropEdit.additionalEdit = edit.additionalEdits;
dropEdit.yieldTo = this._yieldTo;
return dropEdit;
@@ -226,11 +228,11 @@ class ResourcePasteOrDropProvider implements vscode.DocumentPasteEditProvider, v
export function registerResourceDropOrPasteSupport(selector: vscode.DocumentSelector): vscode.Disposable {
return vscode.Disposable.from(
vscode.languages.registerDocumentPasteEditProvider(selector, new ResourcePasteOrDropProvider(), {
id: ResourcePasteOrDropProvider.id,
providedPasteEditKinds: [ResourcePasteOrDropProvider.kind],
pasteMimeTypes: ResourcePasteOrDropProvider.mimeTypes,
}),
vscode.languages.registerDocumentDropEditProvider(selector, new ResourcePasteOrDropProvider(), {
id: ResourcePasteOrDropProvider.id,
providedDropEditKinds: [ResourcePasteOrDropProvider.kind],
dropMimeTypes: ResourcePasteOrDropProvider.mimeTypes,
}),
);

View File

@@ -29,7 +29,7 @@ function getPasteUrlAsFormattedLinkSetting(document: vscode.TextDocument): Paste
*/
class PasteUrlEditProvider implements vscode.DocumentPasteEditProvider {
public static readonly id = 'insertMarkdownLink';
public static readonly kind = vscode.DocumentPasteEditKind.Empty.append('markdown', 'link');
public static readonly pasteMimeTypes = [Mime.textPlain];
@@ -41,8 +41,9 @@ class PasteUrlEditProvider implements vscode.DocumentPasteEditProvider {
document: vscode.TextDocument,
ranges: readonly vscode.Range[],
dataTransfer: vscode.DataTransfer,
_context: vscode.DocumentPasteEditContext,
token: vscode.CancellationToken,
): Promise<vscode.DocumentPasteEdit | undefined> {
): Promise<vscode.DocumentPasteEdit[] | undefined> {
const pasteUrlSetting = getPasteUrlAsFormattedLinkSetting(document);
if (pasteUrlSetting === PasteUrlAsMarkdownLink.Never) {
return;
@@ -64,7 +65,7 @@ class PasteUrlEditProvider implements vscode.DocumentPasteEditProvider {
return;
}
const pasteEdit = new vscode.DocumentPasteEdit('', edit.label);
const pasteEdit = new vscode.DocumentPasteEdit('', edit.label, PasteUrlEditProvider.kind);
const workspaceEdit = new vscode.WorkspaceEdit();
workspaceEdit.set(document.uri, edit.edits);
pasteEdit.additionalEdit = workspaceEdit;
@@ -73,13 +74,13 @@ class PasteUrlEditProvider implements vscode.DocumentPasteEditProvider {
pasteEdit.yieldTo = [{ mimeType: Mime.textPlain }];
}
return pasteEdit;
return [pasteEdit];
}
}
export function registerPasteUrlSupport(selector: vscode.DocumentSelector, parser: IMdParser) {
return vscode.languages.registerDocumentPasteEditProvider(selector, new PasteUrlEditProvider(parser), {
id: PasteUrlEditProvider.id,
providedPasteEditKinds: [PasteUrlEditProvider.kind],
pasteMimeTypes: PasteUrlEditProvider.pasteMimeTypes,
});
}