Move fragment range down into documentLinkProvider

This commit is contained in:
Matt Bierner
2022-04-05 14:22:12 -07:00
parent 9b141e1959
commit 55627db338
3 changed files with 24 additions and 26 deletions

View File

@@ -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,

View File

@@ -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),
};
}
}

View File

@@ -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;
}
}