Circe: Automatische Ableitung mit privaten Impliziten, "-Ywarn-unused" und Scala 2.12.4 erzeugt fehlerhafte Warnungen

Erstellt am 23. Okt. 2017  ·  3Kommentare  ·  Quelle: circe/circe

Hi!
Ich habe nach der Migration auf Scala 2.12.4 ein Problem entdeckt. Es ist möglicherweise ein Fehler in scalac, aber ich bin mir nicht sicher.
Hier ein Minimalbeispiel:
Von build.sbt :

scalaVersion := "2.12.4"
scalacOptions ++= Seq("-Ywarn-unused", "-Xfatal-warnings")
val circeVersion = "0.8.0"
libraryDependencies ++= Seq(
  "io.circe" %% "circe-core",
  "io.circe" %% "circe-generic",
  "io.circe" %% "circe-parser"
).map(_ % circeVersion)

Test.scala :

object Test extends App {
  import java.time.Instant
  import io.circe.generic.auto._
  import io.circe.syntax._

  private implicit val instantEncoder: io.circe.Encoder[Instant] =
    io.circe.Encoder.encodeLong.contramap(_.toEpochMilli)

  case class A(prop: Instant)

  println(A(Instant.now()).asJson)
}

So schlägt das Kompilieren fehl:

privater Wert instantEncoder im Objekt Test wird nie verwendet

Wenn Sie instantEncoder auskommentieren, schlägt dies ebenfalls fehl:

konnte keinen impliziten Wert für Parameter-Encoder finden: io.circe.Encoder[Test.A]

Und es lässt sich gut mit Scala 2.12.3 kompilieren.

Hilfreichster Kommentar

Irgendwelche Infos dazu oder einen Link zu irgendwo, wo es mehr Diskussionen gibt?

Edit: Habe gerade diese Probleme gefunden:
https://github.com/scala/bug/issues/10599
https://github.com/scala/bug/issues/10571

TL;DR: Verwenden Sie das Compiler-Flag -Ywarn-macros:after

Alle 3 Kommentare

Ich bin auch auf dieses Problem gestoßen.

Dies kann in der Zwischenzeit umgangen werden, indem man die beleidigende Deklaration mit silent annotiert oder ihre Sichtbarkeit von private auf private[NameOfEnclosingType] ändert.

Wir stoßen auch auf dieses Problem, würden gerne helfen, wissen aber nicht einmal, wo wir anfangen sollen zu suchen

Wir stoßen auf dieses Problem für einen impliziten Parameter, möchten nicht silent für dieses tbh einführen

  implicit def dataChangeEventEncoder[T](implicit enc: Encoder[T]) = semiauto.deriveEncoder[DataChangeEvent[T]]

Irgendwelche Infos dazu oder einen Link zu irgendwo, wo es mehr Diskussionen gibt?

Edit: Habe gerade diese Probleme gefunden:
https://github.com/scala/bug/issues/10599
https://github.com/scala/bug/issues/10571

TL;DR: Verwenden Sie das Compiler-Flag -Ywarn-macros:after

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen