Skip to content

fix: electric-indent-mode caused too many treesit-ready-p calls #10

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 20, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 23 additions & 10 deletions svelte-ts-mode.el
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,19 @@ In the future, we may pin a version.")
(punctuation)
()))

(defvar-local svelte-ts-mode--treesit-buffer-ready
'((svelte . nil)
(javascript . nil)
(typescript . nil)
(css . nil))
"Memoized treesit-ready-p output for required modes in a buffer local alist.")

(defun svelte-ts-mode--treesit-buffer-ready (mode)
"Returns memoized value of treesit-ready-p."
(let ((cell (assoc mode svelte-ts-mode--treesit-buffer-ready)))
(if cell
(or (cdr cell) (setcdr cell (treesit-ready-p mode)))
(error "Unsupported treesit mode"))))

(defun svelte-ts-mode--indent-inside-container-nodes-p (_node parent _bol)
"Whether the ancestor node(also itself) of PARENT is of container node type.
Expand Down Expand Up @@ -315,9 +328,9 @@ If HOW is :prepend, just prepend NEW-RULES to the old rules; if HOW is
(defun svelte-ts-mode--treesit-language-at-point (pos)
(let* ((node (treesit-node-at pos 'svelte))
(parent (treesit-node-parent node))
(js-ready (treesit-ready-p 'javascript))
(ts-ready (treesit-ready-p 'typescript))
(css-ready (treesit-ready-p 'css)))
(js-ready (svelte-ts-mode--treesit-buffer-ready 'javascript))
(ts-ready (svelte-ts-mode--treesit-buffer-ready 'typescript))
(css-ready (svelte-ts-mode--treesit-buffer-ready 'css)))
(cond
((and node parent
(equal (treesit-node-type node) "raw_text")
Expand Down Expand Up @@ -399,7 +412,7 @@ ARGS: rest args for `comment-normalize-vars'."

(define-derived-mode svelte-ts-mode prog-mode "Svelte"
"A mode for editing Svelte templates."
(unless (treesit-ready-p 'svelte)
(unless (svelte-ts-mode--treesit-buffer-ready 'svelte)
(error "Tree-sitter for svelte isn't available"))

(setq treesit-primary-parser (treesit-parser-create 'svelte))
Expand All @@ -412,7 +425,7 @@ ARGS: rest args for `comment-normalize-vars'."
(setq-local treesit-simple-indent-rules svelte-ts-mode--indent-rules)


(when (treesit-ready-p 'javascript)
(when (svelte-ts-mode--treesit-buffer-ready 'javascript)
(require 'js)
(setq-local treesit-font-lock-settings
(append treesit-font-lock-settings
Expand All @@ -438,7 +451,7 @@ ARGS: rest args for `comment-normalize-vars'."
(bracket delimiter function operator property)))))
(treesit-parser-create 'javascript))

(when (treesit-ready-p 'typescript)
(when (svelte-ts-mode--treesit-buffer-ready 'typescript)
(require 'typescript-ts-mode)
(setq-local treesit-font-lock-settings
(append treesit-font-lock-settings
Expand All @@ -465,7 +478,7 @@ ARGS: rest args for `comment-normalize-vars'."
(operator function bracket delimiter)))))
(treesit-parser-create 'typescript))

(when (treesit-ready-p 'css)
(when (svelte-ts-mode--treesit-buffer-ready 'css)
(require 'css-mode)
(setq-local treesit-font-lock-settings
(append treesit-font-lock-settings
Expand Down Expand Up @@ -496,9 +509,9 @@ ARGS: rest args for `comment-normalize-vars'."
(advice-add #'comment-normalize-vars :around
#'svelte-ts-mode--adivce--comment-normalize-vars))

(let ((js-ready (treesit-ready-p 'javascript))
(ts-ready (treesit-ready-p 'typescript))
(css-ready (treesit-ready-p 'css)))
(let ((js-ready (svelte-ts-mode--treesit-buffer-ready 'javascript))
(ts-ready (svelte-ts-mode--treesit-buffer-ready 'typescript))
(css-ready (svelte-ts-mode--treesit-buffer-ready 'css)))
(setq-local treesit-range-settings
(nconc
treesit-range-settings
Expand Down