Skip to content

inconsistent and unstable formatting of nested arrow functions #755

@adrian-gierakowski

Description

@adrian-gierakowski

Describe the bug

dprint-plugin-typescript version: 0.95.12

using following config:

  "typescript": {
    "lineWidth": 80,
    "memberExpression.linePerExpression": true,
    "semiColons": "asi"
  }

I will start by showing 2 examples of code which is formatted correctly (at least according to my preference):

Example 1:

const func =
  (arg1: { a: number; b: number }) =>
  (arg2: { c: number }) =>
  (arg3: undefined): undefined => arg3

Example 2:

const func =
  (arg1: { a: number; b: number }): (a: any) => (a: any) => undefined =>
  (arg2: { c: number }) =>
  (arg3: undefined): undefined => arg3

Now if I change example 1 by splitting the arg1's type into multiple lines, the entire block gets reformatted in a wired way:

Input Code

const func =
  (arg1: {
    a: number; b: number}) =>
  (arg2: { c: number }) =>
  (arg3: undefined): undefined => arg3

Expected Output

const func =
  (arg1: { 
    a: number; 
    b: number 
  }) =>
  (arg2: { c: number }) =>
  (arg3: undefined): undefined => arg3

Actual Output

const func = (arg1: {
  a: number
  b: number
}) =>
(arg2: { c: number }) =>
(arg3: undefined): undefined => arg3

Example 2 shows unstable formatting which needs a couple of passes to arrive at a stable formatting. I first modify the first line to be longer than line character limit (by adding return time to the first arrow function):

const func =
  (arg1: { a: number; b: number }): (a: { c: number }) => (a: undefined) => undefined =>
  (arg2: { c: number }) =>
  (arg3: undefined): undefined => arg3

which on first pass generates the following (which is fine):

Input Code

const func =
  (
    arg1: { a: number; b: number },
  ): (a: { c: number }) => (a: undefined) => undefined =>
  (arg2: { c: number }) =>
  (arg3: undefined): undefined => arg3

Expected Output

const func =
  (
    arg1: { a: number; b: number },
  ): (a: { c: number }) => (a: undefined) => undefined =>
  (arg2: { c: number }) =>
  (arg3: undefined): undefined => arg3

Actual Output

const func = (
  arg1: { a: number; b: number },
): (a: { c: number }) => (a: undefined) => undefined =>
(arg2: { c: number }) =>
(arg3: undefined): undefined => arg3

The Actual Output is a result of two passes of formatting.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions