mirror of
https://github.com/microsoft/vscode.git
synced 2025-12-24 04:09:28 +00:00
Merge branch 'main' into joh/voluminous-lobster
This commit is contained in:
@@ -4,23 +4,29 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import * as vscode from 'vscode';
|
||||
import { tryInsertUriList } from './dropIntoEditor';
|
||||
import { tryGetUriListSnippet } from './dropIntoEditor';
|
||||
|
||||
export function registerPasteProvider(selector: vscode.DocumentSelector) {
|
||||
return vscode.languages.registerDocumentPasteEditProvider(selector, new class implements vscode.DocumentPasteEditProvider {
|
||||
|
||||
async provideDocumentPasteEdits(
|
||||
document: vscode.TextDocument,
|
||||
range: vscode.Range,
|
||||
_ranges: readonly vscode.Range[],
|
||||
dataTransfer: vscode.DataTransfer,
|
||||
token: vscode.CancellationToken,
|
||||
): Promise<vscode.SnippetTextEdit | undefined> {
|
||||
): Promise<vscode.DocumentPasteEdit | undefined> {
|
||||
const enabled = vscode.workspace.getConfiguration('markdown', document).get('experimental.editor.pasteLinks.enabled', false);
|
||||
if (!enabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
return tryInsertUriList(document, range, dataTransfer, token);
|
||||
const snippet = await tryGetUriListSnippet(document, dataTransfer, token);
|
||||
if (snippet) {
|
||||
return { insertText: snippet };
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
}, {
|
||||
pasteMimeTypes: ['text/uri-list']
|
||||
});
|
||||
}
|
||||
|
||||
@@ -25,19 +25,22 @@ const imageFileExtensions = new Set<string>([
|
||||
|
||||
export function registerDropIntoEditor(selector: vscode.DocumentSelector) {
|
||||
return vscode.languages.registerDocumentOnDropEditProvider(selector, new class implements vscode.DocumentOnDropEditProvider {
|
||||
async provideDocumentOnDropEdits(document: vscode.TextDocument, position: vscode.Position, dataTransfer: vscode.DataTransfer, token: vscode.CancellationToken): Promise<vscode.SnippetTextEdit | undefined> {
|
||||
async provideDocumentOnDropEdits(document: vscode.TextDocument, _position: vscode.Position, dataTransfer: vscode.DataTransfer, token: vscode.CancellationToken): Promise<vscode.DocumentDropEdit | undefined> {
|
||||
const enabled = vscode.workspace.getConfiguration('markdown', document).get('editor.drop.enabled', true);
|
||||
if (!enabled) {
|
||||
return;
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const replacementRange = new vscode.Range(position, position);
|
||||
return tryInsertUriList(document, replacementRange, dataTransfer, token);
|
||||
const snippet = await tryGetUriListSnippet(document, dataTransfer, token);
|
||||
if (snippet) {
|
||||
return { insertText: snippet };
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
export async function tryInsertUriList(document: vscode.TextDocument, replacementRange: vscode.Range, dataTransfer: vscode.DataTransfer, token: vscode.CancellationToken): Promise<vscode.SnippetTextEdit | undefined> {
|
||||
export async function tryGetUriListSnippet(document: vscode.TextDocument, dataTransfer: vscode.DataTransfer, token: vscode.CancellationToken): Promise<vscode.SnippetString | undefined> {
|
||||
const urlList = await dataTransfer.get('text/uri-list')?.asString();
|
||||
if (!urlList || token.isCancellationRequested) {
|
||||
return undefined;
|
||||
@@ -72,5 +75,5 @@ export async function tryInsertUriList(document: vscode.TextDocument, replacemen
|
||||
}
|
||||
});
|
||||
|
||||
return new vscode.SnippetTextEdit(replacementRange, snippet);
|
||||
return snippet;
|
||||
}
|
||||
|
||||
@@ -142,7 +142,7 @@ export class MdRenameProvider extends Disposable implements vscode.RenameProvide
|
||||
return this.renameExternalLink(allRefsInfo, newName);
|
||||
} else if (triggerRef.kind === 'header' || (triggerRef.kind === 'link' && triggerRef.link.source.fragmentRange?.contains(position) && (triggerRef.link.kind === 'definition' || triggerRef.link.kind === 'link' && triggerRef.link.href.kind === 'internal'))) {
|
||||
return this.renameFragment(allRefsInfo, newName);
|
||||
} else if (triggerRef.kind === 'link' && !triggerRef.link.source.fragmentRange?.contains(position) && triggerRef.link.kind === 'link' && triggerRef.link.href.kind === 'internal') {
|
||||
} else if (triggerRef.kind === 'link' && !triggerRef.link.source.fragmentRange?.contains(position) && (triggerRef.link.kind === 'link' || triggerRef.link.kind === 'definition') && triggerRef.link.href.kind === 'internal') {
|
||||
return this.renameFilePath(triggerRef.link.source.resource, triggerRef.link.href, allRefsInfo, newName);
|
||||
}
|
||||
|
||||
|
||||
@@ -614,4 +614,79 @@ suite('markdown: rename', () => {
|
||||
]
|
||||
});
|
||||
});
|
||||
|
||||
test('Rename on definition path should update all references to path', async () => {
|
||||
const uri = workspacePath('doc.md');
|
||||
const doc = new InMemoryDocument(uri, joinLines(
|
||||
`[ref text][ref]`,
|
||||
`[direct](/file)`,
|
||||
`[ref]: /file`, // rename here
|
||||
));
|
||||
|
||||
const workspace = new InMemoryWorkspaceMarkdownDocuments([doc]);
|
||||
|
||||
const preparedInfo = await prepareRename(doc, new vscode.Position(2, 10), workspace);
|
||||
assert.strictEqual(preparedInfo!.placeholder, '/file');
|
||||
assertRangeEqual(preparedInfo!.range, new vscode.Range(2, 7, 2, 12));
|
||||
|
||||
const edit = await getRenameEdits(doc, new vscode.Position(2, 10), "/newFile", workspace);
|
||||
assertEditsEqual(edit!, {
|
||||
uri, edits: [
|
||||
new vscode.TextEdit(new vscode.Range(1, 9, 1, 14), '/newFile'),
|
||||
new vscode.TextEdit(new vscode.Range(2, 7, 2, 12), '/newFile'),
|
||||
]
|
||||
});
|
||||
});
|
||||
|
||||
test('Rename on definition path where file exists should also update file', async () => {
|
||||
const uri1 = workspacePath('doc.md');
|
||||
const doc1 = new InMemoryDocument(uri1, joinLines(
|
||||
`[ref text][ref]`,
|
||||
`[direct](/doc2)`,
|
||||
`[ref]: /doc2`, // rename here
|
||||
));
|
||||
|
||||
const uri2 = workspacePath('doc2.md');
|
||||
const doc2 = new InMemoryDocument(uri2, joinLines());
|
||||
|
||||
const workspace = new InMemoryWorkspaceMarkdownDocuments([doc1, doc2]);
|
||||
|
||||
const preparedInfo = await prepareRename(doc1, new vscode.Position(2, 10), workspace);
|
||||
assert.strictEqual(preparedInfo!.placeholder, '/doc2');
|
||||
assertRangeEqual(preparedInfo!.range, new vscode.Range(2, 7, 2, 12));
|
||||
|
||||
const edit = await getRenameEdits(doc1, new vscode.Position(2, 10), "/new-doc", workspace);
|
||||
assertEditsEqual(edit!, {
|
||||
uri: uri1, edits: [
|
||||
new vscode.TextEdit(new vscode.Range(1, 9, 1, 14), '/new-doc'),
|
||||
new vscode.TextEdit(new vscode.Range(2, 7, 2, 12), '/new-doc'),
|
||||
]
|
||||
}, {
|
||||
originalUri: uri2,
|
||||
newUri: workspacePath('new-doc.md')
|
||||
});
|
||||
});
|
||||
|
||||
test('Rename on definition path header should update all references to header', async () => {
|
||||
const uri = workspacePath('doc.md');
|
||||
const doc = new InMemoryDocument(uri, joinLines(
|
||||
`[ref text][ref]`,
|
||||
`[direct](/file#header)`,
|
||||
`[ref]: /file#header`, // rename here
|
||||
));
|
||||
|
||||
const workspace = new InMemoryWorkspaceMarkdownDocuments([doc]);
|
||||
|
||||
const preparedInfo = await prepareRename(doc, new vscode.Position(2, 16), workspace);
|
||||
assert.strictEqual(preparedInfo!.placeholder, 'header');
|
||||
assertRangeEqual(preparedInfo!.range, new vscode.Range(2, 13, 2, 19));
|
||||
|
||||
const edit = await getRenameEdits(doc, new vscode.Position(2, 16), "New Header", workspace);
|
||||
assertEditsEqual(edit!, {
|
||||
uri, edits: [
|
||||
new vscode.TextEdit(new vscode.Range(1, 15, 1, 21), 'new-header'),
|
||||
new vscode.TextEdit(new vscode.Range(2, 13, 2, 19), 'new-header'),
|
||||
]
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user