mirror of
https://github.com/microsoft/vscode.git
synced 2025-12-23 19:59:37 +00:00
Move fragment range down into documentLinkProvider
This commit is contained in:
@@ -91,6 +91,7 @@ interface MdLinkSource {
|
||||
readonly text: string;
|
||||
readonly resource: vscode.Uri;
|
||||
readonly hrefRange: vscode.Range;
|
||||
readonly fragmentRange: vscode.Range | undefined;
|
||||
}
|
||||
|
||||
export interface MdInlineLink {
|
||||
@@ -131,7 +132,8 @@ function extractDocumentLink(
|
||||
source: {
|
||||
text: link,
|
||||
resource: document.uri,
|
||||
hrefRange: new vscode.Range(linkStart, linkEnd)
|
||||
hrefRange: new vscode.Range(linkStart, linkEnd),
|
||||
fragmentRange: getFragmentRange(link, linkStart, linkEnd),
|
||||
}
|
||||
};
|
||||
} catch {
|
||||
@@ -139,6 +141,14 @@ function extractDocumentLink(
|
||||
}
|
||||
}
|
||||
|
||||
function getFragmentRange(text: string, start: vscode.Position, end: vscode.Position): vscode.Range | undefined {
|
||||
const index = text.indexOf('#');
|
||||
if (index < 0) {
|
||||
return undefined;
|
||||
}
|
||||
return new vscode.Range(start.translate({ characterDelta: index + 1 }), end);
|
||||
}
|
||||
|
||||
const angleBracketLinkRe = /^<(.*)>$/;
|
||||
|
||||
/**
|
||||
@@ -291,8 +301,9 @@ export class MdLinkProvider implements vscode.DocumentLinkProvider {
|
||||
kind: 'link',
|
||||
source: {
|
||||
text: reference,
|
||||
hrefRange: new vscode.Range(linkStart, linkEnd),
|
||||
resource: document.uri,
|
||||
hrefRange: new vscode.Range(linkStart, linkEnd),
|
||||
fragmentRange: undefined,
|
||||
},
|
||||
href: {
|
||||
kind: 'reference',
|
||||
@@ -325,6 +336,7 @@ export class MdLinkProvider implements vscode.DocumentLinkProvider {
|
||||
text: link,
|
||||
resource: document.uri,
|
||||
hrefRange: new vscode.Range(linkStart, linkEnd),
|
||||
fragmentRange: getFragmentRange(link, linkStart, linkEnd),
|
||||
},
|
||||
ref: { text: reference, range: refRange },
|
||||
href: target,
|
||||
@@ -341,6 +353,7 @@ export class MdLinkProvider implements vscode.DocumentLinkProvider {
|
||||
text: link,
|
||||
resource: document.uri,
|
||||
hrefRange: new vscode.Range(linkStart, linkEnd),
|
||||
fragmentRange: getFragmentRange(link, linkStart, linkEnd)
|
||||
},
|
||||
ref: { text: reference, range: refRange },
|
||||
href: target,
|
||||
|
||||
@@ -23,8 +23,6 @@ export interface MdLinkReference {
|
||||
readonly location: vscode.Location;
|
||||
|
||||
readonly link: MdLink;
|
||||
|
||||
readonly fragmentLocation: vscode.Location | undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -60,17 +58,6 @@ export interface MdHeaderReference {
|
||||
|
||||
export type MdReference = MdLinkReference | MdHeaderReference;
|
||||
|
||||
|
||||
function getFragmentLocation(link: MdLink): vscode.Location | undefined {
|
||||
const index = link.source.text.indexOf('#');
|
||||
if (index < 0) {
|
||||
return undefined;
|
||||
}
|
||||
return new vscode.Location(link.source.resource, link.source.hrefRange.with({
|
||||
start: link.source.hrefRange.start.translate({ characterDelta: index + 1 }),
|
||||
}));
|
||||
}
|
||||
|
||||
export class MdReferencesProvider extends Disposable implements vscode.ReferenceProvider {
|
||||
|
||||
private readonly _linkCache: MdWorkspaceCache<MdLink[]>;
|
||||
@@ -133,7 +120,6 @@ export class MdReferencesProvider extends Disposable implements vscode.Reference
|
||||
isDefinition: false,
|
||||
link,
|
||||
location: new vscode.Location(link.source.resource, link.source.hrefRange),
|
||||
fragmentLocation: getFragmentLocation(link),
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -220,7 +206,6 @@ export class MdReferencesProvider extends Disposable implements vscode.Reference
|
||||
isDefinition: false,
|
||||
link,
|
||||
location: new vscode.Location(link.source.resource, link.source.hrefRange),
|
||||
fragmentLocation: getFragmentLocation(link),
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -259,7 +244,6 @@ export class MdReferencesProvider extends Disposable implements vscode.Reference
|
||||
isDefinition: false,
|
||||
link,
|
||||
location: new vscode.Location(link.source.resource, link.source.hrefRange),
|
||||
fragmentLocation: getFragmentLocation(link),
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -284,7 +268,6 @@ export class MdReferencesProvider extends Disposable implements vscode.Reference
|
||||
isDefinition: link.kind === 'definition',
|
||||
link,
|
||||
location: new vscode.Location(from.resource, link.source.hrefRange),
|
||||
fragmentLocation: getFragmentLocation(link),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,10 +41,10 @@ export class MdRenameProvider extends Disposable implements vscode.RenameProvide
|
||||
|
||||
const triggerRef = allRefsInfo.triggerRef;
|
||||
switch (triggerRef.kind) {
|
||||
case 'header':
|
||||
case 'header': {
|
||||
return { range: triggerRef.headerTextLocation.range, placeholder: triggerRef.headerText };
|
||||
|
||||
case 'link':
|
||||
}
|
||||
case 'link': {
|
||||
if (triggerRef.link.kind === 'definition') {
|
||||
// We may have been triggered on the ref or the definition itself
|
||||
if (triggerRef.link.ref.range.contains(position)) {
|
||||
@@ -52,15 +52,17 @@ export class MdRenameProvider extends Disposable implements vscode.RenameProvide
|
||||
}
|
||||
}
|
||||
|
||||
if (triggerRef.fragmentLocation) {
|
||||
const { fragmentRange } = triggerRef.link.source;
|
||||
if (fragmentRange) {
|
||||
const declaration = this.findHeaderDeclaration(allRefsInfo.references);
|
||||
if (declaration) {
|
||||
return { range: triggerRef.fragmentLocation.range, placeholder: declaration.headerText };
|
||||
return { range: fragmentRange, placeholder: declaration.headerText };
|
||||
}
|
||||
return { range: triggerRef.fragmentLocation.range, placeholder: document.getText(triggerRef.fragmentLocation.range) };
|
||||
return { range: fragmentRange, placeholder: document.getText(fragmentRange) };
|
||||
}
|
||||
|
||||
throw new Error(localize('renameNoFiles', "Renaming files is currently not supported"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -96,7 +98,7 @@ export class MdRenameProvider extends Disposable implements vscode.RenameProvide
|
||||
continue;
|
||||
}
|
||||
}
|
||||
edit.replace(ref.link.source.resource, ref.fragmentLocation?.range ?? ref.location.range, isRefRename && !ref.fragmentLocation ? newName : slug);
|
||||
edit.replace(ref.link.source.resource, ref.link.source.fragmentRange ?? ref.location.range, isRefRename && !ref.link.source.fragmentRange ? newName : slug);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user