summaryrefslogblamecommitdiff
path: root/test/files/run/existentials3-new.scala
blob: 649fac832736da1d8628a0f530bf08181e8ba038 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

                                       












                                                                                  
 


                                                                                     
 













                                                                                     
 


                                                                                                       
   

                                                                       
 
                             









                                         
           










          
           












                                                                                                                                
 
import scala.reflect.runtime.universe._

object Test {
  trait ToS { final override def toString = getClass.getName }

  def f1 = { case class Bar() extends ToS; Bar }
  def f2 = { case class Bar() extends ToS; Bar() }
  def f3 = { class Bar() extends ToS; object Bar extends ToS; Bar }
  def f4 = { class Bar() extends ToS; new Bar() }
  def f5 = { object Bar extends ToS; Bar }
  def f6 = { () => { object Bar extends ToS ; Bar } }
  def f7 = { val f = { () => { object Bar extends ToS ; Bar } } ; f }

  def f8 = { trait A ; trait B extends A ; class C extends B with ToS; new C { } }
  def f9 = { trait A ; trait B ; class C extends B with A with ToS; new C { } }

  def f10 = { class A { type T1 } ; List[A#T1]() }
  def f11 = { abstract class A extends Seq[Int] ; List[A]() }
  def f12 = { abstract class A extends Seq[U forSome { type U <: Int }] ; List[A]() }

  val g1 = { case class Bar() extends ToS; Bar }
  val g2 = { case class Bar() extends ToS; Bar() }
  val g3 = { class Bar() extends ToS; object Bar extends ToS; Bar }
  val g4 = { class Bar() extends ToS; new Bar() }
  val g5 = { object Bar extends ToS; Bar }
  val g6 = { () => { object Bar extends ToS ; Bar } }
  val g7 = { val f = { () => { object Bar extends ToS ; Bar } } ; f }

  val g8 = { trait A ; trait B extends A ; class C extends B with ToS; new C { } }
  val g9 = { trait A ; trait B ; class C extends B with A with ToS; new C { } }

  val g10 = { class A { type T1 } ; List[A#T1]() }
  val g11 = { abstract class A extends Seq[Int] ; List[A]() }
  val g12 = { abstract class A extends Seq[U forSome { type U <: Int }] ; List[A]() }

  def printTpe(t: Type) = {
    val s = if (t.typeSymbol.isFreeType) t.typeSymbol.typeSignature.toString else t.typeSymbol.toString
    println("%s, t=%s, s=%s".format(t, t.kind, s))
  }
  def m[T: TypeTag](x: T) = printTpe(typeOf[T])
  def m2[T: AbsTypeTag](x: T) = printTpe(implicitly[AbsTypeTag[T]].tpe)

  // tags do work for f10/g10
  def main(args: Array[String]): Unit = {
    m(f1)
    m(f2)
    m(f3)
    m(f4)
    m(f5)
    m(f6)
    m(f7)
    m(f8)
    m(f9)
    m2(f10)
    m(f11)
    m(f12)
    m(g1)
    m(g2)
    m(g3)
    m(g4)
    m(g5)
    m(g6)
    m(g7)
    m(g8)
    m(g9)
    m2(g10)
    m(g11)
    m(g12)
  }
}

object Misc {
  trait Bippy { def bippy = "I'm Bippy!" }
  object o1 {
    def f1 = { trait A extends Seq[U forSome { type U <: Bippy }] ; abstract class B extends A ; trait C extends B ; (null: C) }
    def f2 = f1.head.bippy
  }
  def g1 = o1.f1 _
  def g2 = o1.f2 _
}