Fix ranges and validation setting for MD own path + header links (#152270)

* Fix ranges and validation setting for MD own path + header links

Previously for a `file.md`, links to headers in that file that use paths, such as `[link](./file.md#some-header)` were validated using `markdown.experimental.validate.fragmentLinks.enabled`

This is confusing as that setting was only meant to be used for links such as`[link](#some-header`). It also resulted in the diagnostic having the incorrect range

This change instead makes these links be validated by `markdown.experimental.validate.fileLinks.markdownFragmentLinks`

* Fix compile
This commit is contained in:
Matt Bierner
2022-06-15 20:02:41 -07:00
committed by GitHub
parent 16c2a3ab3b
commit 4fc5d76213
2 changed files with 49 additions and 8 deletions

View File

@@ -394,7 +394,7 @@ export class DiagnosticComputer {
return {
links,
diagnostics: (await Promise.all([
this.validateFileLinks(doc, options, links, token),
this.validateFileLinks(options, links, token),
Array.from(this.validateReferenceLinks(options, links)),
this.validateFragmentLinks(doc, options, links, token),
])).flat()
@@ -415,6 +415,7 @@ export class DiagnosticComputer {
const diagnostics: vscode.Diagnostic[] = [];
for (const link of links) {
if (link.href.kind === 'internal'
&& link.source.text.startsWith('#')
&& link.href.path.toString() === doc.uri.toString()
&& link.href.fragment
&& !toc.lookup(link.href.fragment)
@@ -449,14 +450,15 @@ export class DiagnosticComputer {
}
}
private async validateFileLinks(doc: SkinnyTextDocument, options: DiagnosticOptions, links: readonly MdLink[], token: vscode.CancellationToken): Promise<vscode.Diagnostic[]> {
private async validateFileLinks(options: DiagnosticOptions, links: readonly MdLink[], token: vscode.CancellationToken): Promise<vscode.Diagnostic[]> {
const pathErrorSeverity = toSeverity(options.validateFileLinks);
if (typeof pathErrorSeverity === 'undefined') {
return [];
}
const fragmentErrorSeverity = toSeverity(typeof options.validateMarkdownFileLinkFragments === 'undefined' ? options.validateFragmentLinks : options.validateMarkdownFileLinkFragments);
const linkSet = new FileLinkMap(links);
// We've already validated our own fragment links in `validateOwnHeaderLinks`
const linkSet = new FileLinkMap(links.filter(link => !link.source.text.startsWith('#')));
if (linkSet.size === 0) {
return [];
}
@@ -472,11 +474,6 @@ export class DiagnosticComputer {
}
const hrefDoc = await tryFindMdDocumentForLink({ kind: 'internal', path: path, fragment: '' }, this.workspaceContents);
if (hrefDoc && hrefDoc.uri.toString() === doc.uri.toString()) {
// We've already validated our own links in `validateOwnHeaderLinks`
return;
}
if (!hrefDoc && !await this.workspaceContents.pathExists(path)) {
const msg = localize('invalidPathLink', 'File does not exist at path: {0}', path.fsPath);
for (const link of links) {