refined
refined copied to clipboard
Scalac crashes if a Validate.Plain requires an implicit TypeTag
import eu.timepit.refined.auto._
import eu.timepit.refined.api.Validate
import shapeless.tag.@@
final case class CrashOnTypeTag[A]()
object CrashOnTypeTag {
implicit def crashValidate[A: reflect.runtime.universe.TypeTag]: Validate.Plain[String, CrashOnTypeTag[A]] = {
Validate.fromPredicate({ tree =>
true
}, { tree =>
"check failed"
}, CrashOnTypeTag[A]())
}
def main(args: Array[String]): Unit = {
val crash: String @@ CrashOnTypeTag[Int => String] = "function"
}
}
CrashOnTypeTag.scala:19: exception during macro expansion:
java.lang.ClassNotFoundException: CrashOnTypeTag$
at scala.reflect.internal.util.AbstractFileClassLoader.findClass(AbstractFileClassLoader.scala:62)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at __wrapper$3$b49909639286418ab9615ff443755b07.__wrapper$3$b49909639286418ab9615ff443755b07$.wrapper(<no source file>:19)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$ToolBoxGlobal$$anonfun$compile$1.apply(ToolBoxFactory.scala:275)
at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl.eval(ToolBoxFactory.scala:444)
at scala.reflect.macros.contexts.Evals$class.eval(Evals.scala:20)
at scala.reflect.macros.contexts.Context.eval(Context.scala:6)
at eu.timepit.refined.macros.MacroUtils$$anonfun$eval$1.apply(MacroUtils.scala:20)
at scala.Option.getOrElse(Option.scala:121)
at eu.timepit.refined.macros.MacroUtils$class.tryN(MacroUtils.scala:24)
at eu.timepit.refined.macros.RefineMacro.tryN(RefineMacro.scala:9)
at eu.timepit.refined.macros.MacroUtils$class.eval(MacroUtils.scala:20)
at eu.timepit.refined.macros.RefineMacro.eval(RefineMacro.scala:9)
at eu.timepit.refined.macros.RefineMacro.impl(RefineMacro.scala:23)
val crash: String @@ CrashOnTypeTag[Int => String] = "function"
^
Interesting. :-) I guess it does not depend on the supplied type parameter to CrashOnTypeTag
? Do you have a specific use case in mind for a Validate
instance that takes a TypeTag
?
The type parameter matters. String @@ CrashOnTypeTag[Int => String]
crashes while String @@ CrashOnTypeTag[String]
does not crash.
That is strange. #266 shows that CrashOnTypeTag[String]
also crashes with Scala 2.12. I also tested with 2.11 locally and got the same result.