From 04b8c37dd48db6a97f9693f22bf31a42778ba412 Mon Sep 17 00:00:00 2001 From: Jim Myhrberg Date: Wed, 8 Feb 2023 22:32:10 +0000 Subject: [PATCH] feat(language/dockerfile): use dockerfile-ts-mode if available Otherwise fall back to dockerfile-mode. This also acts as an experiment of how to go about using the new Emacs 29.x treesit backed modes if available. This is currently not that clean, but will do for now, and I'll keep experimenting with it. --- .gitignore | 1 + modules/languages/siren-dockerfile.el | 91 ++++++++++++++++----------- 2 files changed, 56 insertions(+), 36 deletions(-) diff --git a/.gitignore b/.gitignore index bdcc5c1..8b843f4 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,7 @@ sessions/* smex-items srecode-map.el tramp +tree-sitter/* url/* var/* diff --git a/modules/languages/siren-dockerfile.el b/modules/languages/siren-dockerfile.el index 9033fa6..02b0556 100644 --- a/modules/languages/siren-dockerfile.el +++ b/modules/languages/siren-dockerfile.el @@ -6,46 +6,65 @@ ;;; Code: -(use-package dockerfile-mode - :hook - (dockerfile-mode . siren-dockerfile-mode-setup) +(require 'siren-lsp) - :preface - (defun siren-dockerfile-mode-setup () - (with-eval-after-load 'flycheck - (flycheck-select-checker 'hadolint)) - (lsp-deferred) - (lsp-format-buffer-on-save-mode +1)) +(if (fboundp 'dockerfile-ts-mode) + ;; Use built-in treesit support if available. + (use-package dockerfile-ts-mode + :straight (:type built-in) + :mode + "[/\\]\\(?:Containerfile\\|Dockerfile\\)\\(?:\\.[^/\\]*\\)?\\'" + "\\.dockerfile\\'" + :hook + (dockerfile-ts-mode . siren-dockerfile-mode-setup) - :init - (with-eval-after-load 'flycheck - ;; Define fixed Hadolint checker, built-in checker expects lines to start - ;; with ":", but when input is provided via STDIN, the each line - ;; starts with "-:". - (flycheck-define-checker hadolint - "A Dockerfile syntax checker using the hadolint. + :init + (require 'siren-treesit) + (siren-treesit-prepare + 'dockerfile-ts-mode + '(dockerfile "https://github.com/camdencheek/tree-sitter-dockerfile"))) + + ;; Otherwise, fallback to regular dockerfile-mode. + (use-package dockerfile-mode + :hook + (dockerfile-mode . siren-dockerfile-mode-setup))) + +(defun siren-dockerfile-mode-setup () + "Shared setup for both `dockerfile-mode' and `dockerfile-ts-mode'." + (lsp) + (lsp-format-buffer-on-save-mode +1) + (when (fboundp 'flycheck-select-checker) + (flycheck-select-checker 'hadolint) + (flycheck-add-next-checker 'hadolint 'lsp))) + +;; Define fixed Hadolint checker, built-in checker expects lines to start +;; with ":", but when input is provided via STDIN, the each line +;; starts with "-:". +(with-eval-after-load 'flycheck + (flycheck-define-checker hadolint + "A Dockerfile syntax checker using the hadolint. See URL `http://github.com/hadolint/hadolint/'." - :command ("hadolint" "--no-color" "-") - :standard-input t - :error-patterns - ((error line-start - "-:" line " " (id (one-or-more alnum)) " error: " (message) - line-end) - (warning line-start - "-:" line " " (id (one-or-more alnum)) - " warning: " (message) line-end) - (info line-start - "-:" line " " (id (one-or-more alnum)) " info: " (message) - line-end) - (error line-start - "-:" line ":" column " " (message) - line-end)) - :error-filter - (lambda (errors) - (flycheck-sanitize-errors - (flycheck-remove-error-file-names "/dev/stdin" errors))) - :modes dockerfile-mode))) + :command ("hadolint" "--no-color" "-") + :standard-input t + :error-patterns + ((error line-start + "-:" line " " (id (one-or-more alnum)) " error: " (message) + line-end) + (warning line-start + "-:" line " " (id (one-or-more alnum)) + " warning: " (message) line-end) + (info line-start + "-:" line " " (id (one-or-more alnum)) " info: " (message) + line-end) + (error line-start + "-:" line ":" column " " (message) + line-end)) + :error-filter + (lambda (errors) + (flycheck-sanitize-errors + (flycheck-remove-error-file-names "/dev/stdin" errors))) + :modes (dockerfile-mode dockerfile-ts-mode))) (provide 'siren-dockerfile) ;;; siren-dockerfile.el ends here