From f782b7979719c9c4e3280f120670c0abc49dcb32 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Aug 2025 14:17:38 +0200 Subject: [PATCH] feat(graphql): add treesit support --- modules/lang/graphql/README.org | 4 +++ modules/lang/graphql/config.el | 43 ++++++++++++++++++++++---------- modules/lang/graphql/doctor.el | 5 ++++ modules/lang/graphql/packages.el | 2 ++ 4 files changed, 41 insertions(+), 13 deletions(-) create mode 100644 modules/lang/graphql/doctor.el diff --git a/modules/lang/graphql/README.org b/modules/lang/graphql/README.org index e09e32f00..9e0821542 100644 --- a/modules/lang/graphql/README.org +++ b/modules/lang/graphql/README.org @@ -26,10 +26,14 @@ It includes: - +lsp :: Enable LSP support for ~graphql-mode~. Requires [[doom-module::tools lsp]] and a langserver ([[https://github.com/graphql/graphiql/tree/main/packages/graphql-language-service-cli#readme][graphql-language-service-cli]]). +- +tree-sitter :: + Leverages tree-sitter for better syntax highlighting and structural text + editing. Requires [[doom-module::tools tree-sitter]]. ** Packages - [[doom-package:company-graphql]] unless [[doom-module:+lsp]] - [[doom-package:graphql-mode]] +- [[doom-package:graphql-ts-mode]] if [[doom-module:+tree-sitter]] - [[doom-package:graphql-doc]] ** Hacks diff --git a/modules/lang/graphql/config.el b/modules/lang/graphql/config.el index f03597df1..3687b0aaf 100644 --- a/modules/lang/graphql/config.el +++ b/modules/lang/graphql/config.el @@ -1,22 +1,18 @@ ;;; lang/graphql/config.el -*- lexical-binding: t; -*- -(after! graphql-mode - (defface nerd-icons-rhodamine - '((t (:foreground "#E10098"))) - "Face for GraphQL icon." - :group 'nerd-icons-faces) +;; +;;; Packages + +(defun +graphql-common-config (mode) (if (modulep! +lsp) - (add-hook 'graphql-mode-local-vars-hook #'lsp! 'append) - (set-company-backend! 'graphql-mode 'company-graphql)) + (add-hook (intern (format "%s-local-vars-hook" mode)) #'lsp! 'append) + (set-company-backend! mode 'company-graphql)) - (add-hook 'graphql-mode-hook #'rainbow-delimiters-mode) - (set-docsets! 'graphql-mode :add "GraphQL Specification") - - (set-electric! 'graphql-mode + (set-docsets! mode :add "GraphQL Specification") + (set-electric! mode :chars '(?\} ?\)) :words '("or" "and")) - - (set-ligatures! 'graphql-mode + (set-ligatures! mode :null "null" :true "true" :false "false" :int "Int" :str "String" @@ -26,5 +22,26 @@ :not "not" :and "and" :or "or")) + +(after! graphql-mode + (defface nerd-icons-rhodamine + '((t (:foreground "#E10098"))) + "Face for GraphQL icon." + :group 'nerd-icons-faces) + (add-hook 'graphql-mode-hook #'rainbow-delimiters-mode) + (+graphql-common-config 'graphql-mode)) + + +(use-package! graphql-ts-mode + :when (modulep! +tree-sitter) + :when (fboundp 'treesit-available-p) + :defer t + :init + (set-tree-sitter! 'graphql-mode 'graphql-ts-mode + '((graphql :url "https://github.com/bkegley/tree-sitter-graphql"))) + :config + (+graphql-common-config 'graphql-ts-mode)) + + (use-package! graphql-doc :after graphql-mode) diff --git a/modules/lang/graphql/doctor.el b/modules/lang/graphql/doctor.el new file mode 100644 index 000000000..94be43a97 --- /dev/null +++ b/modules/lang/graphql/doctor.el @@ -0,0 +1,5 @@ +;;; lang/graphql/doctor.el -*- lexical-binding: t; -*- + +(assert! (or (not (modulep! +tree-sitter)) + (modulep! :tools tree-sitter)) + "This module requires (:tools tree-sitter)") diff --git a/modules/lang/graphql/packages.el b/modules/lang/graphql/packages.el index 6f0b7c096..7b11285e2 100644 --- a/modules/lang/graphql/packages.el +++ b/modules/lang/graphql/packages.el @@ -7,3 +7,5 @@ (package! company-graphql :recipe (:host github :repo "thaenalpha/company-graphql") :pin "aed9f5109e877944a895d08fc08bad103f03096b")) +(when (modulep! +tree-sitter) + (package! graphql-ts-mode :pin "e933f235408ea195762700fd07c2d828e8f09aac"))