diffplug / diffplug/spotless

Scalafmt config file error results in very unhelpful error message

Offen
#523 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
enhancement
Vorherrschende Sprache
Java
Sterne
5.6k
Forks
559
Ø Merge
1 T. 14 Std.
Gemergte PRs (30 T.)
43

Beschreibung

### Summary

If you have any errors in the Scalafmt configuration file, e.g. a mistype in an option name, the Scalafmt step will fail with a very unhelpful error message:

```
Caused by: java.lang.reflect.InvocationTargetException
at com.diffplug.spotless.scala.ScalaFmtStep.invokeNoArg(ScalaFmtStep.java:142)
at com.diffplug.spotless.scala.ScalaFmtStep.access$100(ScalaFmtStep.java:38)
at com.diffplug.spotless.scala.ScalaFmtStep$State.createFormat(ScalaFmtStep.java:130)
at com.diffplug.spotless.FormatterStepImpl$Standard.format(FormatterStepImpl.java:76)
at com.diffplug.spotless.FormatterStep$Strict.format(FormatterStep.java:76)
at com.diffplug.spotless.Formatter.compute(Formatter.java:230)
... 90 more
Caused by: java.util.NoSuchElementException: Either.right.value on Left
at scala.util.Either$RightProjection.get(Either.scala:453)
... 96 more
```

### Spotless configuration

`build.gradle.kts`:
```kotlin
spotless {
scala {
scalafmt("2.3.2").configFile(rootProject.layout.projectDirectory.file(".scalafmt.conf"))
}
}
```

`.scalafmt.conf`:
```
// does not matter, as long as there is some error
unknownProperty = 123
```

### Thoughts

The reason why this happens is an unconditional call to `either.right.get`:

https://github.com/diffplug/spotless/blob/c007dbac060d5dd413b252a6fcf98ab2784f71de/lib/src/main/java/com/diffplug/spotless/scala/ScalaFmtStep.java#L130

This is not a right way to do it: in Scala, proper handling would've looked like this:

```scala
config = either match {
case Left(e) => // e is an error (maybe even a `Throwable`), log it somehow or wrap it into an exception and throw it
case Right(r) => r // successful result
}
```

In Java, I guess something like this should work (without reflection):

```java
if (either.isLeft()) {
$ErrorType$ e = either.left().get()
// handle error
} else {
config = either.right().get()
}
```

### Gradle version

6.1.1, but probably not relevant

### Spotless version

3.26.1

### OS

macOS 10.14.6

Beitragsleitfaden

Beitragsleitfaden öffnen

Rechercherichtung

Start in lib/src/main/java/com/diffplug/spotless/scala/ScalaFmtStep.java, especially createFormat and the linked line around the unconditional Either access. Reproduce the failure with the shown build.gradle.kts and invalid .scalafmt.conf, then verify that configuration errors produce a useful reported exception instead of InvocationTargetException and NoSuchElementException.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
java, scala
Bereich
build-system, tooling
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
45/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.