Scalafmt config file error results in very unhelpful error message

Abierto
#523 1 comentario 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
3/5
Tiempo estimado
1-2 días
Aptitud para principiantes
45/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Estancado
Stack tecnológico
java, scala

Línea de trabajo

Comienza en lib/src/main/java/com/diffplug/spotless/scala/ScalaFmtStep.java, especialmente en createFormat y en la línea relacionada con el acceso incondicional a Either. Reproduce el fallo con el build.gradle.kts mostrado y el .scalafmt.conf no válido; después, verifica que los errores de configuración produzcan una excepción reportada útil en lugar de InvocationTargetException y NoSuchElementException.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

enhancement
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:

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:

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):

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

Lenguaje dominante
Java
Estrellas
5.7k
Forks
560
Merge medio
1 d 13 h
PR fusionados (30 d)
43

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de diffplug/spotless

Todos los issues de diffplug/spotless

Issues similares

Más issues de Java

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.