prettier / prettier

Prettier is an opinionated code formatter.
https://prettier.io
MIT License
49.23k stars 4.32k forks source link

Undesirable line break in property accessors #6266

Open toshi-toma opened 5 years ago

toshi-toma commented 5 years ago

Prettier 1.18.2 Playground link

--parser babylon

Input:

let myApp = {
  /* deeply nested objects */
};

myApp.name.is.too.long.name.space.and.myApp.name.is.too.long.name.space.myApp.name.is.too.long.name.space  = "My First JavaScript App"; // Good

let newApp = myApp.name.is.too.long.name.space.and.myApp.name.is.too.long.name.space.myApp.name.is.too.long.name.space; // Untoward line break

consle.log(myApp.name.is.too.long.name.space.and.myApp.name.is.too.long.name.space.myApp.name.is.too.long.name.space /* Untoward line break*/, 1, 2, 3);

Output:

let myApp = {
  /* deeply nested objects */
};

myApp.name.is.too.long.name.space.and.myApp.name.is.too.long.name.space.myApp.name.is.too.long.name.space =
  "My First JavaScript App"; // Good

let newApp =
  myApp.name.is.too.long.name.space.and.myApp.name.is.too.long.name.space.myApp
    .name.is.too.long.name.space; // Untoward line break

consle.log(
  myApp.name.is.too.long.name.space.and.myApp.name.is.too.long.name.space.myApp
    .name.is.too.long.name.space /* Untoward line break*/,
  1,
  2,
  3
);

if have line break in property accessors, Searchability is degradation.

Expected behavior:

Preferably no line break in property accessors. :pray:


let myApp = {
  /* deeply nested objects */
};

myApp.name.is.too.long.name.space.and.myApp.name.is.too.long.name.space.myApp.name.is.too.long.name.space =
  "My First JavaScript App";

let newApp =
  myApp.name.is.too.long.name.space.and.myApp.name.is.too.long.name.space.myApp.name.is.too.long.name.space;

consle.log(
  myApp.name.is.too.long.name.space.and.myApp.name.is.too.long.name.space.myApp.name.is.too.long.name.space,
  1,
  2,
  3
);
luis-fors-cb commented 5 years ago

This is especially a problem when one long fully-qualified es6 class extends another long fully-qualified es6 class. I would prefer the line to break before or after the extends keyword, but it usually breaks inside one of the class names, harming searchability.

aaronadamsCA commented 3 years ago

Here's some code you should probably never write (Playground link):

  const { originalSrc, transformedSrc } = (await v.json()).data.product.images
    .edges[0].node;

Nonetheless, Prettier is probably making the "wrong" choice here too, in that it breaks within the property chain as opposed to literally anywhere else. OP makes a great point that this would thwart a codebase search for images.edges. It also just looks funny.

A lot of JavaScript line break scenarios were greatly improved in v2.3 but this was not one of them. It's easily worked around by writing better code, but the example does succinctly demonstrate the current limitation.