Prettierにコントリビュートした(3)
Prettierにコントリビュートしました。
解決したIssue
https://github.com/prettier/prettier/issues/6076
任意の関数にnon-null assertionをつけて実行した結果をnewに食わせるとカッコが不自然にはずれて意味が変わってしまうというものです。
このようなコードをフォーマットしたときに、
new (a()!)();
カッコが外れて意味が変わってしまうということです。
new a()!();
ちなみに、Issueではnewに限定されるような書き方がされていましたが、通常の関数でも同様にカッコが外れてフォーマット前とフォーマット後で意味が変わってしまいます。
// Input
(a()!)();
// Output
a()!();
(追記:実際はIssueが正しくて、そのあと修正していただきました https://github.com/prettier/prettier/pull/6140 )
出したPR
https://github.com/prettier/prettier/pull/6136
前の記事で言ったように、ESTreeの各ノードに対してカッコをつけるかどうかの判断はneeds-parens.jsに書かれています。しかし、そのneeds-parensにはトップレベルのnon-null assertionに対しての処理が書かれておらず、デフォルトでfalseを返すようになっていました。
なのでTSNonNullExpressionがきたときに、「ノンヌルにする対象がIdentifierである」かつ「その親ノードが関数もしくはnewである」を満たすときにtrueを返すように変更しました。
そのあとはスナップショットテストのコードを書いてチェンジログを書いておしまい。
感想
楽しい。今回で3回目のコントリビューションですが、やっと https://github.com/prettier/prettier/graphs/contributors にsosukesuzukiが載りましたね、嬉しいです。
