all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: "Jostein Kjønigsen" <jostein@secure.kjonigsen.net>
To: Eli Zaretskii <eliz@gnu.org>
Cc: Dmitry Gutov <dmitry@gutov.dev>, Yuan Fu <casouri@gmail.com>,
	acorallo@gnu.org, Theodor Thornhill <theo@thornhill.no>,
	72184@debbugs.gnu.org
Subject: bug#72184: 31.0.50; typescript-ts-mode does not bind RET to newline-and-indent
Date: Wed, 31 Jul 2024 10:55:00 +0200	[thread overview]
Message-ID: <5088180E-50DC-4374-B7F3-78DA6244291C@secure.kjonigsen.net> (raw)
In-Reply-To: <8634nv2tcq.fsf@gnu.org>

[-- Attachment #1: Type: text/plain, Size: 2730 bytes --]



> On 27 Jul 2024, at 09:21, Eli Zaretskii <eliz@gnu.org> wrote:
> 
>> Cc: 72184@debbugs.gnu.org
>> Date: Sat, 20 Jul 2024 03:22:47 +0300
>> From: Dmitry Gutov <dmitry@gutov.dev>
>> 
>> Right, we normally handle automatic indentation using 
>> electric-indent-mode (which is on by default).
>> 
>> If RET behaves incorrectly in typescript-ts-mode somehow, more details 
>> should be provided.
> 
> Jostein, could you please respond, so that we could make progress
> here?
> 
> Thanks.


PREFACE

I've now looked further into this issue, and what we're actually seeing here is not indentation code "not working", but indentation rules not taking into account incomplete parse-trees while code is being written.

So as the original bug-submitter, I will have to just declare that the original bug-description is clearly inaccurate. Sorry about that!

Below is my attempt to better express what is actually failing and why.

My hypothesis is that this could be an issue for other tree-sitter based major-modes as well, and maintainers of those modes are encouraged to check for similar issues.

If more major-modes than typescript-ts-mode is affected, the optimum solution may best be decided together, rather than individually per mode.

AS FOR THE BUG - DETAILS

Consider the following pre-existing typescript/javascript function:

function stuff() {
  // TODO implement
}

Using the typescript tree-sitter grammer, it gets the following nodes in its tree-sitter AST:

 (function_declaration function name: (identifier)
  parameters: (formal_parameters ( ))
  body: (statement_block { (comment) }))
 
This matches the rules for indentation in typescript-ts-mode and indents correctly regardless.

But in a bare config with only electric-indent-mode enabled (and not electric-pair-mode), trying to enter a new function will produce a incomplete syntax tree, due to the missing final brace.

The code will look like this:

function gnu2() {  // NOTE: no closing brace!


And the tree-sitter AST will then look like this until completed:

 (expression_statement
  (function function name: (identifier)
   parameters: (formal_parameters ( ))
   body: (statement_block { (comment) }))))

And typescript-ts-mode has no indentation rules for this AST. Thus pressing enter wont cause indentation, despite electric-indent-mode being enabled.

I suspect this sort of issue could possibly affect other treesitter based modes which has been developed mostly in existing configs with "all the bells and whistles" (like electric-pair-mode) enabled.

I'll hold off any fixes or suggestions for such until we have some reports from other maintainers, if that is ok?

--
Jostein

[-- Attachment #2: Type: text/html, Size: 4183 bytes --]

  parent reply	other threads:[~2024-07-31  8:55 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-18 21:05 bug#72184: 31.0.50; typescript-ts-mode does not bind RET to newline-and-indent Jostein Kjønigsen
2024-07-18 21:30 ` Andrea Corallo
2024-07-20  0:22   ` Dmitry Gutov
2024-07-27  7:21     ` Eli Zaretskii
2024-07-27 11:50       ` Jostein Kjønigsen
2024-07-27 12:20         ` Eli Zaretskii
2024-07-31  8:55       ` Jostein Kjønigsen [this message]
2024-08-01  0:42         ` Dmitry Gutov
2024-08-15 10:03           ` Jostein Kjønigsen
2024-08-17 10:11             ` Eli Zaretskii

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5088180E-50DC-4374-B7F3-78DA6244291C@secure.kjonigsen.net \
    --to=jostein@secure.kjonigsen.net \
    --cc=72184@debbugs.gnu.org \
    --cc=acorallo@gnu.org \
    --cc=casouri@gmail.com \
    --cc=dmitry@gutov.dev \
    --cc=eliz@gnu.org \
    --cc=theo@thornhill.no \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.