GNU bug report logs - #77901
tsx-ts-mode: ternary chains are indented as a tree

Previous Next

Package: emacs;

Reported by: Konstantin Kharlamov <Hi-Angel <at> yandex.ru>

Date: Fri, 18 Apr 2025 14:26:06 UTC

Severity: normal

Done: Yuan Fu <casouri <at> gmail.com>

Full log


View this message in rfc822 format

From: Yuan Fu <casouri <at> gmail.com>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 77901 <at> debbugs.gnu.org, Konstantin Kharlamov <Hi-Angel <at> yandex.ru>
Subject: bug#77901: tsx-ts-mode: ternary chains are indented as a tree
Date: Tue, 13 May 2025 12:45:17 -0700
Hey, sorry for the delay.

> On May 10, 2025, at 3:16 AM, Eli Zaretskii <eliz <at> gnu.org> wrote:
> 
>> From: Konstantin Kharlamov <Hi-Angel <at> yandex.ru>
>> Date: Thu, 01 May 2025 20:39:02 +0700
>> 
>> After poking around I wrote a patch (attached).

Thanks! LGTM. For some reason I can’t apply the patch on either emacs-30 or master. [1]

>> Worth noting though, for
>> some reason it doesn't work for ternary without starting colon, e.g.:
>> 
>>    const a = cond1 ? 1 :
>>      cond2 ? 2 :
>>      cond3 ? 3 : 4;
>> 
>> I'm unclear why, per my understanding the "standalone-parent" of the
>> whole ternary chain (disregarding where the point is) is the `const a
>> =` declaration.

The standalone rule just keeps going up the parse tree until it finds a node that starts on a new line. In this case, if you start form cond3, it’ll go up until reaching the teneray_expression node containing cond2. This node starts on a new line so standalone-parent stops here. So the cond3 line uses the cond2 line as the anchor, instead of the “const a” line. If you add a cond4 line, it’ll use the cond3 line as anchor.

There’re several ways to fix it. The best way is to add a new anchor to the presets that does what standalone-parent does, but additionally excludes some nodes. Something like (standalone-parent-excluding “regexp”). Then this can be used for both typescript and c/c++ (and java, etc).

>> 
>> Such bug also persists in c++-ts-mode (as opposed to non-ts plain c++-
>> mode). I'm not sure if it's me misunderstanding something or not…
> 
> Yuan, any comments?

Yeah we should fix this in c/c++-ts-mode too. In c/c++, the baseline-indent-rule can handle

  int a = cond1 ? 1
	: cond2 ? 2
	: cond3 ? 3
	: 4;

Which is nice, but the other case needs special case override:

  int a = cond1 ? 1 :
    cond2 ? 2 :
      cond3 ? 3 :
        cond 4: 5;

Yuan

[1] I got this error:

128 git … am --3way -- /Users/yuan/downloads/1-3.patch
Applying: typescript-ts: align ternary-chain branches (bug#78187)
error: sha1 information is lacking or useless (test/lisp/progmodes/typescript-ts-mode-resources/indent.erts).
error: could not build fake ancestor
Patch failed at 0001 typescript-ts: align ternary-chain branches (bug#78187)
hint: Use 'git am --show-current-patch=diff' to see the failed patch
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".





This bug report was last modified 11 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.