tek / splain

better implicit errors for scala
MIT License
370 stars 28 forks source link

Implicit resolution error in REPR #8

Open limansky opened 7 years ago

limansky commented 7 years ago

I've found that I got compilation error in REPR when the splain plugin is enabled:

scala> import shapeless._, me.limansky._, cats.instances.all._
import shapeless._
import me.limansky._
import cats.instances.all._

scala> case class Foo(n: Int); case class Bar(s: String, f: Foo)
defined class Foo
defined class Bar

scala> MapReader[Bar].read(Map("s" -> "b", "n" -> "6"))
<console>:25: error: implicit error;
!I ev: MapReader[Bar]
MapReader.genericReader invalid because
!I mapReader: MapReader[R]
Generic.materialize invalid because
type parameters weren't correctly instantiated outside of the implicit tree: inferred type arguments [shapeless.::[String,shapeless.::[Foo,shapeless.HNil]],Nothing] do not conform to method materializeCoproduct's type parameter bounds [V <: shapeless.Coproduct,R <: shapeless.Coproduct]
       MapReader[Bar].read(Map("s" -> "b", "n" -> "6"))

The same code without plugin works fine:

scala> import shapeless._, me.limansky._
import shapeless._
import me.limansky._

scala> import shapeless._, me.limansky._, cats.instances.all._
import shapeless._
import me.limansky._
import cats.instances.all._

scala> case class Foo(n: Int); case class Bar(s: String, f: Foo)
defined class Foo
defined class Bar

scala> MapReader[Bar].read(Map("s" -> "b", "n" -> "6"))
res0: Bar = Bar(b,Foo(6))

The code is available in this gist: https://gist.github.com/limansky/7c91a3deaa25fc0ec7339ea191d4a54a

It looks like the problem is reproducible only in REPR, at least the tests are compiled and passed successfully.

tek commented 7 years ago

does it happen as well if you deactivate the plugin features via -P:splain:all:false?

limansky commented 7 years ago

Yes it does. In this case it doesn't explain the error:

scala> MapReader[Bar].read(Map("s" -> "b", "n" -> "6"))
<console>:25: error: could not find implicit value for parameter ev: me.limansky.MapReader[Bar]
       MapReader[Bar].read(Map("s" -> "b", "n" -> "6"))
tek commented 7 years ago

then it's probably analogous to #4, due to the nature of the reflective hack used to hijack the compiler phases. it's likeley this isn't going to be fixed until I implement parts of the plugin in the compiler itself, which is hopefully soon.