Skip to content

Commit

Permalink
Spaces: add before{Apply,Infix}ArgInParens
Browse files Browse the repository at this point in the history
  • Loading branch information
kitbellew committed Aug 13, 2023
1 parent f79d970 commit d67bc88
Show file tree
Hide file tree
Showing 4 changed files with 262 additions and 0 deletions.
62 changes: 62 additions & 0 deletions docs/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -4298,6 +4298,68 @@ spaces.afterSymbolicDefs=true
def +++(a: A): F[A]
```

### `spaces.beforeXxxArgInParens`

> Since v3.7.13.
These parameters control whether a space should be added before an argument of
a function call or infix expression, if the argument is enclosed in parentheses.

They take the following values:

- `Never`: no space is added
- `Always`: space is added
- `AfterSymbolic`: space is added if the infix operator or function name is
symbolic
- doesn't start with a letter or underscore
- for function name only (not for infix): not an
[unary operator](https://docs.scala-lang.org/scala3/reference/changed-features/operators.html#unary-operators):
`+`, `-`, `!`, `~`

```scala mdoc:defaults
spaces.beforeApplyArgInParens
spaces.beforeInfixArgInParens
```

```scala mdoc:scalafmt
spaces.beforeApplyArgInParens = Always
spaces.beforeInfixArgInParens = Always
---
+(baz)
===(baz)
bar(baz)

foo +(baz)
foo ===(baz)
foo bar(baz)
```

```scala mdoc:scalafmt
spaces.beforeApplyArgInParens = Never
spaces.beforeInfixArgInParens = Never
---
+ (baz)
=== (baz)
bar (baz)

foo + (baz)
foo === (baz)
foo bar (baz)
```

```scala mdoc:scalafmt
spaces.beforeApplyArgInParens = AfterSymbolic
spaces.beforeInfixArgInParens = AfterSymbolic
---
+ (baz)
===(baz)
bar (baz)

foo +(baz)
foo ===(baz)
foo bar (baz)
```

## Literals

> Since v2.5.0.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package org.scalafmt.config
import scala.meta.tokens.Token

import metaconfig._
import org.scalafmt.util.TokenOps

/** @param beforeContextBoundColon
* formats [A: T] as [A : T]
Expand Down Expand Up @@ -47,6 +48,10 @@ import metaconfig._
case class Spaces(
beforeContextBoundColon: Spaces.BeforeContextBound =
Spaces.BeforeContextBound.Never,
beforeApplyArgInParens: Spaces.BeforeArgInParens =
Spaces.BeforeArgInParens.Never,
beforeInfixArgInParens: Spaces.BeforeArgInParens =
Spaces.BeforeArgInParens.Always,
afterTripleEquals: Boolean = false,
inImportCurlyBraces: Boolean = false,
inInterpolatedStringCurlyBraces: Boolean = false,
Expand Down Expand Up @@ -78,4 +83,25 @@ object Spaces {
case object IfMultipleBounds extends BeforeContextBound
}

sealed abstract class BeforeArgInParens {
def apply(name: => String): Boolean
}
private object BeforeArgInParens {
implicit val codec: ConfCodecEx[BeforeArgInParens] = ReaderUtil
.oneOfCustom[BeforeArgInParens](Never, Always, AfterSymbolic) {
case Conf.Bool(true) => Configured.ok(Always)
case Conf.Bool(false) => Configured.ok(Never)
}

case object Never extends BeforeArgInParens {
def apply(name: => String): Boolean = false
}
case object Always extends BeforeArgInParens {
def apply(name: => String): Boolean = true
}
case object AfterSymbolic extends BeforeArgInParens {
def apply(name: => String): Boolean = TokenOps.isSymbolicName(name)
}
}

}
78 changes: 78 additions & 0 deletions scalafmt-tests/src/test/resources/unit/Apply.stat
Original file line number Diff line number Diff line change
Expand Up @@ -62,3 +62,81 @@ test("foo " +
case baz =>
case qux =>
}
<<< #3607 beforeApplyArgInParens=always
spaces.beforeApplyArgInParens = always
===
object a {
+ ()
=== ()
bar ()
+ (baz)
=== (baz)
bar (baz)
+ (baz, qux)
=== (baz, qux)
bar (baz, qux)
}
>>>
object a {
+()
===()
bar()
+(baz)
===(baz)
bar(baz)
+(baz, qux)
===(baz, qux)
bar(baz, qux)
}
<<< #3607 beforeApplyArgInParens=never
spaces.beforeApplyArgInParens = never
===
object a {
+ ()
=== ()
bar ()
+ (baz)
=== (baz)
bar (baz)
+ (baz, qux)
=== (baz, qux)
bar (baz, qux)
}
>>>
object a {
+()
===()
bar()
+(baz)
===(baz)
bar(baz)
+(baz, qux)
===(baz, qux)
bar(baz, qux)
}
<<< #3607 beforeApplyArgInParens=aftersymbolic
spaces.beforeApplyArgInParens = aftersymbolic
===
object a {
+ ()
=== ()
bar ()
+ (baz)
=== (baz)
bar (baz)
+ (baz, qux)
=== (baz, qux)
bar (baz, qux)
}
>>>
object a {
+()
===()
bar()
+(baz)
===(baz)
bar(baz)
+(baz, qux)
===(baz, qux)
bar(baz, qux)
}
96 changes: 96 additions & 0 deletions scalafmt-tests/src/test/resources/unit/ApplyInfix.stat
Original file line number Diff line number Diff line change
Expand Up @@ -181,3 +181,99 @@ type x = (X
type x = (X
:: Y
:: Z)
<<< #3607 beforeInfixArgInParens=always
spaces.beforeInfixArgInParens = always
===
object a {
foo + baz
foo === baz
foo bar baz
foo + ()
foo === ()
foo bar ()
foo + (baz)
foo === (baz)
foo bar (baz)
foo + (baz, qux)
foo === (baz, qux)
foo bar (baz, qux)
}
>>>
object a {
foo + baz
foo === baz
foo bar baz
foo + ()
foo === ()
foo bar ()
foo + (baz)
foo === (baz)
foo bar (baz)
foo + (baz, qux)
foo === (baz, qux)
foo bar (baz, qux)
}
<<< #3607 beforeInfixArgInParens=never
spaces.beforeInfixArgInParens = never
===
object a {
foo + baz
foo === baz
foo bar baz
foo + ()
foo === ()
foo bar ()
foo + (baz)
foo === (baz)
foo bar (baz)
foo + (baz, qux)
foo === (baz, qux)
foo bar (baz, qux)
}
>>>
object a {
foo + baz
foo === baz
foo bar baz
foo + ()
foo === ()
foo bar ()
foo + (baz)
foo === (baz)
foo bar (baz)
foo + (baz, qux)
foo === (baz, qux)
foo bar (baz, qux)
}
<<< #3607 beforeInfixArgInParens=aftersymbolic
spaces.beforeInfixArgInParens = aftersymbolic
===
object a {
foo + baz
foo === baz
foo bar baz
foo + ()
foo === ()
foo bar ()
foo + (baz)
foo === (baz)
foo bar (baz)
foo + (baz, qux)
foo === (baz, qux)
foo bar (baz, qux)
}
>>>
object a {
foo + baz
foo === baz
foo bar baz
foo + ()
foo === ()
foo bar ()
foo + (baz)
foo === (baz)
foo bar (baz)
foo + (baz, qux)
foo === (baz, qux)
foo bar (baz, qux)
}

0 comments on commit d67bc88

Please sign in to comment.