Skip to content

Slow new-line's when electic-indent-mode is enabled #9

@shfx

Description

@shfx

I can live without electric-indent-mode but it would be nice if we could figure out what causing this slowdown.

Here's CPU profile:

        6215  94% - command-execute
        5276  80%  - funcall-interactively
        5274  80%   - newline
        5265  80%    - electric-indent-post-self-insert-function
        5255  80%     - indent-according-to-mode
        5255  80%      - treesit-indent
        5237  80%       - treesit--indent-1
        2624  40%        - treesit-language-at
        2624  40%         - svelte-ts-mode--treesit-language-at-point
        2619  40%          - treesit-ready-p
        2619  40%             treesit-language-available-p
           3   0%          + treesit-node-at
        1303  19%        - treesit-simple-indent
        1302  19%         - treesit--simple-indent-eval
        1301  19%          - svelte-ts-mode--script-style-tag-bol
        1301  19%           - treesit-language-at
        1301  19%            - svelte-ts-mode--treesit-language-at-point
        1299  19%             - treesit-ready-p
        1299  19%                treesit-language-available-p
           2   0%             + treesit-node-at
           1   0%          + #<byte-code-function 744>
           1   0%           alist-get
        1299  19%        - treesit-node-on
        1297  19%         - treesit-language-at
        1297  19%          - svelte-ts-mode--treesit-language-at-point
        1296  19%           - treesit-ready-p
        1296  19%              treesit-language-available-p
           1   0%           treesit-buffer-root-node
           8   0%        + treesit-node-at
          10   0%       - treesit-update-ranges
           9   0%          treesit-query-range
           8   0%       + indent-line-to
          10   0%     + delete-horizontal-space
           3   0%    + lsp-on-change
           1   0%    + electric-pair-post-self-insert-function
           1   0%    + #:newline-postproc
           1   0%    + #:newline-postproc
           2   0%   + execute-extended-command
         939  14%  + byte-code
         259   3% + redisplay_internal (C function)
          29   0% + timer-event-handler
          21   0% + ...
          10   0% + #<byte-code-function BCF>
           5   0% + flycheck-perform-deferred-syntax-check
           2   0% + goggles--post-command
           1   0% + keyfreq-pre-command-hook
           1   0% + corfu--auto-post-command
           1   0% + winner-save-old-configurations
           1   0%   pulsar--post-command-pulse

I did couple of new lines and it seems like treesit-language-available-p is slow? Also do we need to call treesit-ready-p that often? I made a change here:

(defvar-local svelte-ts-mode-ready-javascript nil "Saved value for treesit-ready-p for javascript lang")
(defvar-local svelte-ts-mode-ready-typescript "Saved value for treesit-ready-p for typescript lang")
(defvar-local svelte-ts-mode-ready-css nil "Saved value for treesit-ready-p for css lang")

(defun svelte-ts-mode--treesit-language-at-point (pos)
  (let* ((node (treesit-node-at pos 'svelte))
         (parent (treesit-node-parent node))
         (js-ready (or svelte-ts-mode-ready-javascript (treesit-ready-p 'javascript)))
         (ts-ready (or svelte-ts-mode-ready-typescript (treesit-ready-p 'typescript)))
         (css-ready (or svelte-ts-mode-ready-css (treesit-ready-p 'css))))
    (cond
     ((and node parent
           (equal (treesit-node-type node) "raw_text")
           (equal (treesit-node-type parent) "script_element"))
      (if (and js-ready ts-ready)
          (if (null (treesit-query-capture
                     parent svelte-ts-mode--query-get-script-element-attrs))
              'javascript
            'typescript)
        (if ts-ready
            'typescrpt
          (if js-ready
              'javscript
            'svelte))))
     ((and node parent
           (equal (treesit-node-type node) "raw_text")
           (equal (treesit-node-type parent) "style_element"))
      (if css-ready
          'css
        'svelte))
     (t 'svelte))))

And it seems to be faster but I'm that great at elisp. We could probably have a hashmap here instead so nils won't allow treesit-ready-p to be called again. Also not sure if we can set it once and forget about it, can tree sitter become unavailable suddenly?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions