From 098a7b8976266898bbf0b899f01bb0863b272cf3 Mon Sep 17 00:00:00 2001 From: Artem Pyanykh Date: Thu, 8 Sep 2022 22:24:25 +0100 Subject: [PATCH] diag: Do not emit cross-file diag for single-file folders --- Marksman/Diag.fs | 11 ++++++++++- Marksman/Workspace.fs | 5 +++++ Marksman/Workspace.fsi | 1 + Tests/DiagTest.fs | 17 +++++++++++++++++ 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/Marksman/Diag.fs b/Marksman/Diag.fs index 4511c38..71568b7 100644 --- a/Marksman/Diag.fs +++ b/Marksman/Diag.fs @@ -42,6 +42,13 @@ let checkNonBreakingWhitespace (doc: Doc) = [ NonBreakableWhitespace(whitespaceRange) ]) +let isCrossFileLink uref = + match uref with + | Uref.Doc _ -> true + | Uref.Heading(doc = Some _) -> true + | Uref.Heading(doc = None) -> false + | Uref.LinkDef _ -> false + let checkLink (folder: Folder) (doc: Doc) (link: Element) : seq = let uref = Uref.ofElement link @@ -50,7 +57,9 @@ let checkLink (folder: Folder) (doc: Doc) (link: Element) : seq = | Some uref -> let refs = Dest.tryResolveUref uref doc folder |> Array.ofSeq - if refs.Length = 1 then + if Folder.isSingleFile folder && isCrossFileLink uref then + [] + else if refs.Length = 1 then [] else if refs.Length = 0 then match link with diff --git a/Marksman/Workspace.fs b/Marksman/Workspace.fs index a21e215..91c739f 100644 --- a/Marksman/Workspace.fs +++ b/Marksman/Workspace.fs @@ -149,6 +149,11 @@ module Folder = let singleFile doc = SingleFile doc + let isSingleFile = + function + | SingleFile _ -> true + | MultiFile _ -> false + let multiFile name root docs = MultiFile(name, root, docs) let docs: Folder -> seq = diff --git a/Marksman/Workspace.fsi b/Marksman/Workspace.fsi index ee18b4b..1236b5f 100644 --- a/Marksman/Workspace.fsi +++ b/Marksman/Workspace.fsi @@ -56,6 +56,7 @@ module Folder = val singleFile: Doc -> Folder val multiFile: name: string -> root: RootPath -> docs: Map -> Folder + val isSingleFile: Folder -> bool val withDoc: Doc -> Folder -> Folder val withoutDoc: PathUri -> Folder -> option diff --git a/Tests/DiagTest.fs b/Tests/DiagTest.fs index a37bdcf..a1a9aa8 100644 --- a/Tests/DiagTest.fs +++ b/Tests/DiagTest.fs @@ -85,3 +85,20 @@ let noDiagOnNonMarkdownFiles () = "fake.md", "Link to non-existent document at 'another%20bad.md'" ], diag ) + +[] +let noCrossFileDiagOnSingleFileFolders () = + let doc = + FakeDoc.Mk( + [| "[](bad.md)" // + "[[another-bad]]" + "[bad-ref][bad-ref]" |] + ) + + let folder = Folder.singleFile doc + let diag = checkFolder folder |> diagToHuman + + Assert.Equal( + [ "fake.md", "Link to non-existent link definition with the label 'bad-ref'" ], + diag + )