summaryrefslogblamecommitdiff
path: root/src/partest/scala/tools/partest/ReplTest.scala
blob: 2f6bcea78b056e8f17c01cc68695ba2fe547c4d6 (plain) (tree)
1
2
3
4
5
6
7
8
9







                                        
                                                               










                                                            

               


                                             
   































                                                                                                    
 
/* NSC -- new Scala compiler
 * Copyright 2005-2011 LAMP/EPFL
 * @author Paul Phillips
 */

package scala.tools.partest

import scala.tools.nsc.interpreter.ILoop
import java.lang.reflect.{ Method => JMethod, Field => JField }

/** A trait for testing repl code.  It drops the first line
 *  of output because the real repl prints a version number.
 */
abstract class ReplTest extends App {
  def code: String
  def eval() = (ILoop run code).lines drop 1
  def show() = eval() foreach println

  show()
}

trait SigTest {
  def mstr(m: JMethod) = "  (m) %s%s".format(
    m.toGenericString,
    if (m.isBridge) " (bridge)" else ""
  )
  def fstr(f: JField) = "  (f) %s".format(f.toGenericString)

  def isObjectMethodName(name: String) = classOf[Object].getMethods exists (_.getName == name)

  def fields[T: ClassManifest](p: JField => Boolean) = {
    val cl = classManifest[T].erasure
    val fs = (cl.getFields ++ cl.getDeclaredFields).distinct sortBy (_.getName)

    fs filter p
  }
  def methods[T: ClassManifest](p: JMethod => Boolean) = {
    val cl = classManifest[T].erasure
    val ms = (cl.getMethods ++ cl.getDeclaredMethods).distinct sortBy (x => (x.getName, x.isBridge))

    ms filter p
  }
  def allFields[T: ClassManifest]()                = fields[T](_ => true)
  def allMethods[T: ClassManifest]()               = methods[T](m => !isObjectMethodName(m.getName))
  def fieldsNamed[T: ClassManifest](name: String)  = fields[T](_.getName == name)
  def methodsNamed[T: ClassManifest](name: String) = methods[T](_.getName == name)

  def allGenericStrings[T: ClassManifest]() =
    (allMethods[T]() map mstr) ++ (allFields[T]() map fstr)

  def genericStrings[T: ClassManifest](name: String) =
    (methodsNamed[T](name) map mstr) ++ (fieldsNamed[T](name) map fstr)

  def show[T: ClassManifest](name: String = "") = {
    println(classManifest[T].erasure.getName)
    if (name == "") allGenericStrings[T]() foreach println
    else genericStrings[T](name) foreach println
  }
}