From baaa4f30d4f8b87a44fcc752eba0c917dd42225e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laurent=20P=2E=20Ren=C3=A9=20de=20Cotret?= Date: Tue, 11 Nov 2025 09:19:40 -0500 Subject: [PATCH] Support for Literate Haskell (#14659) --- book/src/generated/lang-support.md | 1 + languages.toml | 16 ++++++++++++++++ runtime/queries/haskell-literate/highlights.scm | 16 ++++++++++++++++ runtime/queries/haskell-literate/injections.scm | 14 ++++++++++++++ 4 files changed, 47 insertions(+) create mode 100644 runtime/queries/haskell-literate/highlights.scm create mode 100644 runtime/queries/haskell-literate/injections.scm diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md index 9c085b0a..6805a062 100644 --- a/book/src/generated/lang-support.md +++ b/book/src/generated/lang-support.md @@ -107,6 +107,7 @@ | gts | ✓ | ✓ | ✓ | ✓ | | `typescript-language-server`, `vscode-eslint-language-server`, `ember-language-server` | | hare | ✓ | | | | | | | haskell | ✓ | ✓ | | | | `haskell-language-server-wrapper` | +| haskell-literate | ✓ | | | | | `haskell-language-server-wrapper` | | haskell-persistent | ✓ | | | | | | | hcl | ✓ | ✓ | ✓ | | | `terraform-ls` | | hdl | ✓ | | | | | `hdls` | diff --git a/languages.toml b/languages.toml index 963fb3b7..9486892a 100644 --- a/languages.toml +++ b/languages.toml @@ -1599,6 +1599,22 @@ indent = { tab-width = 2, unit = " " } name = "haskell-persistent" source = { git = "https://github.com/MercuryTechnologies/tree-sitter-haskell-persistent", rev = "58a6ccfd56d9f1de8fb9f77e6c42151f8f0d0f3d" } +[[language]] +name = "haskell-literate" +scope = "source.haskell-literate" +injection-regex = "lhs" +file-types = ["lhs"] +roots = ["Setup.hs", "stack.yaml", "cabal.project", "hie.yaml"] +shebangs = ["runhaskell", "stack"] +comment-token = "--" +block-comment-tokens = { start = "{-", end = "-}" } +language-servers = [ "haskell-language-server" ] +indent = { tab-width = 2, unit = " " } + +[[grammar]] +name = "haskell-literate" +source = { git = "https://github.com/LaurentRDC/tree-sitter-haskell-literate", rev = "8ad7bd1b1595f4cc1a4ccc775d4a3c460f43a596" } + [[language]] name = "purescript" scope = "source.purescript" diff --git a/runtime/queries/haskell-literate/highlights.scm b/runtime/queries/haskell-literate/highlights.scm new file mode 100644 index 00000000..bfeb4e96 --- /dev/null +++ b/runtime/queries/haskell-literate/highlights.scm @@ -0,0 +1,16 @@ +; Bird track marker +(bird_line ">" @punctuation.special) + +; LaTeX delimiters +(latex_begin) @keyword.directive +(latex_end) @keyword.directive + +; Highlight LaTeX comments like comments +(latex_comment) @comment + +; Markdown delimiters +(markdown_begin) @keyword.directive +(markdown_end) @keyword.directive + +; Normal prose is not highlighted. Haskell code will be +; highlighted by the injected Haskell grammar diff --git a/runtime/queries/haskell-literate/injections.scm b/runtime/queries/haskell-literate/injections.scm new file mode 100644 index 00000000..fe9d96a6 --- /dev/null +++ b/runtime/queries/haskell-literate/injections.scm @@ -0,0 +1,14 @@ +; Inject Haskell parser into bird-style code lines +((bird_line + (haskell_code) @injection.content) + (#set! injection.language "haskell")) + +; Inject Haskell parser into LaTeX code blocks +((latex_code_line + (haskell_code) @injection.content) + (#set! injection.language "haskell")) + +; Inject Haskell parser into Markdown code blocks +((markdown_code_line + (haskell_code) @injection.content) + (#set! injection.language "haskell")) -- 2.51.2