fsprojects / fantomas

FSharp source code formatter
https://fsprojects.github.io/fantomas
Other
758 stars 189 forks source link

Invalid F# code after formatting #3043

Open axelo opened 5 months ago

axelo commented 5 months ago

Issue created from fantomas-online

Code

type MyCustomTypeWithAPrettyLongDescribingName = MyCustomConstructor1

let private myFunction
    : string
          -> (MyCustomTypeWithAPrettyLongDescribingName -> MyCustomTypeWithAPrettyLongDescribingName -> MyCustomTypeWithAPrettyLongDescribingName)
          -> unit =
    fun a fn -> ()

Result

type MyCustomTypeWithAPrettyLongDescribingName = MyCustomConstructor1

let private myFunction
    : string
          -> (MyCustomTypeWithAPrettyLongDescribingName
              -> MyCustomTypeWithAPrettyLongDescribingName
              -> MyCustomTypeWithAPrettyLongDescribingName)
          -> unit =
    fun a fn -> ()

Gives compiler error

    (5,56) (6, 14) error 10 parse

    Incomplete structured construct at or before this point in binding. Expected ',' or other token.

Problem description

While upgrading from fantomas 4.7 to 6.2 we encountered this formatting issue. We worked around this by extracting the fn type to its own type (arguable making the code more readable :)).

type MyCustomTypeWithAPrettyLongDescribingName = MyCustomConstructor1

type Fn =
    MyCustomTypeWithAPrettyLongDescribingName
        -> MyCustomTypeWithAPrettyLongDescribingName
        -> MyCustomTypeWithAPrettyLongDescribingName

let private myFunction: string -> Fn -> unit = fun a fn -> ()

but the compiler error was unexpected.

Extra information

Options

Fantomas main branch at 1/1/1990

Default Fantomas configuration

Did you know that you can ignore files when formatting by using a .fantomasignore file? PS: It's unlikely that someone else will solve your specific issue, as it's something that you have a personal stake in.

nojaf commented 5 months ago

Hello, thanks for reporting this issue. It seems like some additional indentation is necessary for the function type wrapped in parenthesis. Are you interested in sending a PR for this?