patch 9.0.1399: highlight test script has a few problems

Problem:    Highlight test script has a few problems.
Solution:   Rewrite the script in Vim9 syntax. (closes #10379)
diff --git a/runtime/import/dist/vimhighlight.vim b/runtime/import/dist/vimhighlight.vim
new file mode 100644
index 0000000..4664961
--- /dev/null
+++ b/runtime/import/dist/vimhighlight.vim
@@ -0,0 +1,119 @@
+vim9script
+
+# Maintainer:	github user lacygoill
+# Last Change:	2023 Mar 08
+
+# Init {{{1
+
+const LINK: string = '->'
+
+# Interface {{{1
+export def HighlightTest() # {{{2
+    # Open a new window if the current one isn't empty
+    if line('$') != 1 || getline(1) != ''
+        new
+    endif
+
+    edit Highlight\ test
+
+    # `:help scratch-buffer`
+    &l:bufhidden = 'hide'
+    &l:buftype = 'nofile'
+    &l:swapfile = false
+
+    var report: list<string> =<< trim END
+        Highlighting groups for various occasions
+        -----------------------------------------
+    END
+
+    var various_groups: list<string> = GetVariousGroups()
+        ->filter((_, group: string): bool => group->hlexists() && !group->IsCleared())
+        ->sort()
+        ->uniq()
+
+    report->extend(various_groups->FollowChains())
+
+    var language_section: list<string> =<< trim END
+
+        Highlighting groups for language syntaxes
+        -----------------------------------------
+    END
+    report->extend(language_section)
+
+    var syntax_groups: list<string> = getcompletion('', 'highlight')
+        ->filter((_, group: string): bool =>
+            various_groups->index(group) == -1
+            && !group->IsCleared()
+            && group !~ '^HighlightTest')
+
+    # put the report
+    report
+        ->extend(syntax_groups->FollowChains())
+        ->setline(1)
+
+    # highlight the group names
+    execute $'silent! global /^\w\+\%(\%(\s*{LINK}\s*\)\w\+\)*$/ Highlight({bufnr('%')})'
+
+    cursor(1, 1)
+enddef
+# }}}1
+# Core {{{1
+def Highlight(buf: number) # {{{2
+    var lnum: number = line('.')
+    for group: string in getline('.')->split($'\s*{LINK}\s*')
+        silent! prop_type_add($'highlight-test-{group}', {
+            bufnr: buf,
+            highlight: group,
+            combine: false,
+        })
+        prop_add(lnum, col('.'), {
+            length: group->strlen(),
+            type: $'highlight-test-{group}'
+        })
+        search('\<\w\+\>', '', lnum)
+    endfor
+enddef
+# }}}1
+# Util {{{1
+def IsCleared(name: string): bool # {{{2
+    return name
+        ->hlget()
+        ->get(0, {})
+        ->get('cleared')
+enddef
+
+def FollowChains(groups: list<string>): list<string> # {{{2
+    # A group might be linked to another, which itself might be linked...
+    # We want the whole chain, for every group.
+    var chains: list<string>
+    for group: string in groups
+        var target: string = group->LinksTo()
+        var chain: string = group
+        while !target->empty()
+            chain ..= $' {LINK} {target}'
+            target = target->LinksTo()
+        endwhile
+        var a_link_is_cleared: bool = chain
+            ->split($'\s*{LINK}\s*')
+            ->indexof((_, g: string): bool => g->IsCleared()) >= 0
+        if a_link_is_cleared
+            continue
+        endif
+        chains->add(chain)
+    endfor
+    return chains
+enddef
+
+def LinksTo(group: string): string # {{{2
+    return group
+        ->hlget()
+        ->get(0, {})
+        ->get('linksto', '')
+enddef
+
+def GetVariousGroups(): list<string> # {{{2
+    return getcompletion('hl-', 'help')
+        ->filter((_, helptag: string): bool => helptag =~ '^hl-\w\+$')
+        ->map((_, helptag: string) => helptag->substitute('^hl-', '', ''))
+        ->extend(range(1, 9)->map((_, n: number) => $'User{n}'))
+enddef