鈴木颯介のブログ

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についてわかってきたような気がします。