鈴木颯介のブログ

Prettier にコントリビュートした(12)

解決した Issue

https://github.com/prettier/prettier/issues/6294

かなりエッジケースなんですが、関数の引数にアロー関数を渡していて、そのアロー関数の後ろにブロックステートメントが存在し、そしてそのアロー関数の引数に分割されたオブジェクトが含まれていて、そして受け取るプロパティの数が 2 つ以上で、それぞれの間に空白の行が存在する場合に、変に折りたたまれてしまうやつです。

// Input
foo(
  ({
    a,

    b
  }) => {}
);

// Output
foo(({ a,
  b }) => {});

このアウトプットを再度フォーマットすると、

foo(({ a, b }) => {});

のようになってしまうので、冪等性もこわれていますね。

出した PR

https://github.com/prettier/prettier/pull/6301

関数の引数のリストの中に空白の行があるかどうかを調べる箇所があったので、そこに上記の条件を満たすものもひっかかるようにしました。力技感がすごい。

function hasEmptyLineInObjectArgInArrowFunction(arg) {
    return (
      arg &&
      arg.type === "ArrowFunctionExpression" &&
      arg.params &&
      arg.params.some(
        param =>
          param.type &&
          param.type === "ObjectPattern" &&
          param.properties &&
          param.properties.some(
            (property, i, properties) =>
              i < properties.length - 1 &&
              isNextLineEmpty(options.originalText, property, options)
          )
      )
    );
  }