Differentiate md refs request on file path vs on fragment

This commit is contained in:
Matt Bierner
2022-04-20 10:56:26 -07:00
parent 1d2461bed6
commit 9fbd962973
2 changed files with 71 additions and 8 deletions

View File

@@ -136,11 +136,11 @@ export class MdReferencesProvider extends Disposable implements vscode.Reference
if (link.ref.range.contains(position)) {
return Array.from(this.getReferencesToLinkReference(docLinks, link.ref.text, { resource: document.uri, range: link.ref.range }));
} else if (link.source.hrefRange.contains(position)) {
return this.getReferencesToLink(link, token);
return this.getReferencesToLink(link, position, token);
}
} else {
if (link.source.hrefRange.contains(position)) {
return this.getReferencesToLink(link, token);
return this.getReferencesToLink(link, position, token);
}
}
}
@@ -148,7 +148,7 @@ export class MdReferencesProvider extends Disposable implements vscode.Reference
return [];
}
private async getReferencesToLink(sourceLink: MdLink, token: vscode.CancellationToken): Promise<MdReference[]> {
private async getReferencesToLink(sourceLink: MdLink, triggerPosition: vscode.Position, token: vscode.CancellationToken): Promise<MdReference[]> {
const allLinksInWorkspace = (await this._linkCache.getAll()).flat();
if (token.isCancellationRequested) {
return [];
@@ -191,7 +191,7 @@ export class MdReferencesProvider extends Disposable implements vscode.Reference
const references: MdReference[] = [];
if (sourceLink.href.fragment) {
if (sourceLink.href.fragment && sourceLink.source.fragmentRange?.contains(triggerPosition)) {
const toc = await TableOfContents.create(this.engine, targetDoc);
const entry = toc.lookup(sourceLink.href.fragment);
if (entry) {
@@ -250,12 +250,13 @@ export class MdReferencesProvider extends Disposable implements vscode.Reference
}
const isTriggerLocation = !!sourceLink && sourceLink.source.resource.fsPath === link.source.resource.fsPath && sourceLink.source.hrefRange.isEqual(link.source.hrefRange);
const pathRange = this.getPathRange(link);
yield {
kind: 'link',
isTriggerLocation,
isDefinition: false,
link,
location: new vscode.Location(link.source.resource, link.source.hrefRange),
location: new vscode.Location(link.source.resource, pathRange),
};
}
}
@@ -274,14 +275,25 @@ export class MdReferencesProvider extends Disposable implements vscode.Reference
if (ref === refToFind && link.source.resource.fsPath === from.resource.fsPath) {
const isTriggerLocation = from.resource.fsPath === link.source.resource.fsPath && (
(link.href.kind === 'reference' && from.range.isEqual(link.source.hrefRange)) || (link.kind === 'definition' && from.range.isEqual(link.ref.range)));
const pathRange = this.getPathRange(link);
yield {
kind: 'link',
isTriggerLocation,
isDefinition: link.kind === 'definition',
link,
location: new vscode.Location(from.resource, link.source.hrefRange),
location: new vscode.Location(from.resource, pathRange),
};
}
}
}
/**
* Get just the range of the file path, dropping the fragment
*/
private getPathRange(link: MdLink): vscode.Range {
return link.source.fragmentRange
? link.source.hrefRange.with(undefined, link.source.fragmentRange.start.translate(0, -1))
: link.source.hrefRange;
}
}