Prettier にコントリビュートした(4)
Prettier にコントリビュートしました。
解決した Issue
https://github.com/prettier/prettier/issues/5725
TypeScript の Mapped Types を書いたときに、下の例のように改行が含まれていても、無視して一行にしてしまうというものです。(設定した桁数を超えている場合のみ改行します)
// Input
type T = {
readonly [P in keyof T]: string;
};
// Output
type T = { readonly [P in keyof T]: string };
Mapped Types に改行が含まれるときは、それに従ってフォーマット結果にも改行を含めるというのが期待する挙動です。
// Input
type T = {
readonly [P in keyof T]: string;
};
// Output (expected)
type T = {
readonly [P in keyof T]: string;
};
出したPR
https://github.com/prettier/prettier/pull/6146
パースしたASTを処理する中で、TSMappedTypeのノードが来たときに元のテキストを見て、改行が含まれていればそれを維持します。
hasNewlineInRange
関数に元のテキストとノードの位置を渡すと改行の有無を判定できます。
const shouldBreak = hasNewlineInRange(
options.originalText,
options.locStart(node),
options.locEnd(node)
);
次に改行を維持するための処理を書きます。Docを構成するためのgroup
という関数の第二引数にオプションとして、shouldBreak
をtrueとして渡すとよしなに改行が行われます。
group(..., { shoudBreak });
改行されたあとは(non-semiじゃなければ)セミコロンをつけたいのでよしなに書いてテスト書いておしまい。
type T = {
readonly [P in keyof T]: string; //<- このセミコロンがほしい
};
感想
ちょっとずつPrettierについてわかってきたような気がします。