aboutsummaryrefslogblamecommitdiff
path: root/tests/neg/i1802.scala
blob: 56da672a80b81b1f2f327bfabca67b16a020a4d3 (plain) (tree)




















                                                                                                                               
import scala.collection.immutable.List
import scala.reflect.{ ClassTag, classTag }
import scala.language.implicitConversions

object Exception {
  type Catcher[+T] = PartialFunction[Throwable, T]

  def mkCatcher[Ex <: Throwable: ClassTag, T](isDef: Ex => Boolean, f: Ex => T) = new Catcher[T] {
    private def downcast(x: Throwable): Option[Ex] =
      if (classTag[Ex].runtimeClass.isAssignableFrom(x.getClass)) Some(x.asInstanceOf[Ex])
      else None

    def isDefinedAt(x: Throwable) = downcast(x) exists isDef
    def apply(x: Throwable): T = f(downcast(x).get)
  }

  def mkThrowableCatcher[T](isDef: Throwable => Boolean, f: Throwable => T) = mkCatcher(isDef, f)

  implicit def throwableSubtypeToCatcher[Ex <: Throwable: ClassTag, T](pf: PartialFunction[Ex, T]) = // error: cyclic reference
    mkCatcher(pf.isDefinedAt _, pf.apply _)
}