Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

scalafmt breaks for/yield blocks using significant indentation #4219

Open
zainab-ali opened this issue Sep 9, 2024 · 1 comment
Open

scalafmt breaks for/yield blocks using significant indentation #4219

zainab-ali opened this issue Sep 9, 2024 · 1 comment

Comments

@zainab-ali
Copy link

Formatted for/yield blocks with long variable names fail to compile. scalafmt inserts a newline, which breaks code using significant indentation.

Configuration

version = 3.8.3
runner.dialect = scala3

Command-line parameters

When I run scalafmt via CLI like this: scalafmt reproduction.scala

Steps

Given code like this:

val loremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididu
    : Option[Int] = Some(1)

val expression = for (
  x <- loremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididu;
  y <- loremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididu
) yield x + y

Problem

Scalafmt formats code like this:

val loremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididu
    : Option[Int] = Some(1)

val expression = for (
  x <-
    loremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididu;
  y <- loremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididu
) yield x + y

This fails to compile with:

λ> scala-cli compile reproduction.scala
Compiling project (Scala 3.2.2, JVM)
[error] ./reproduction.scala:7:5
[error] expression expected but <- found
[error]   y <- loremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididu
[error]     ^^
[error] ./reproduction.scala:6:5
[error] value y is not a member of Option[Int].
[error] Note that `y` is treated as an infix operator in Scala 3.
[error] If you do not want that, insert a `;` or empty line in front
[error] or drop any spaces behind the operator.

Expectation

I would like the formatted output to compile.

val loremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididu
    : Option[Int] = Some(1)

val expression = for (
  x <- loremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididu;
  y <- loremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididu
) yield x + y

Workaround

The indentation is not introduced if maxColumns is increased, e.g. maxColumns=100. It is not introduced if the variable name is shorter in length.

@zainab-ali zainab-ali changed the title for/yield blocks with newlines fail to compile due to significant indentation scalafmt breaks for/yield blocks using significant indentation Sep 9, 2024
@kitbellew
Copy link
Collaborator

my guess is, if you're using scala3 (with optional braces), another workaround is:

val expression = for
  x <-
    loremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididu
  y <-
    loremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididu
yield x + y

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants