diff options
Diffstat (limited to 'test/files/run/compiler-asSeenFrom.scala')
-rw-r--r-- | test/files/run/compiler-asSeenFrom.scala | 50 |
1 files changed, 48 insertions, 2 deletions
diff --git a/test/files/run/compiler-asSeenFrom.scala b/test/files/run/compiler-asSeenFrom.scala index 7020469bb2..ea96c6fba7 100644 --- a/test/files/run/compiler-asSeenFrom.scala +++ b/test/files/run/compiler-asSeenFrom.scala @@ -2,9 +2,55 @@ * filter: inliner warning\(s\); re-run with -Yinline-warnings for details */ import scala.tools.nsc._ -import scala.tools.partest.CompilerTest +import scala.tools.partest.DirectTest import scala.collection.{ mutable, immutable, generic } -import scala.language.postfixOps +import scala.language.{postfixOps, implicitConversions} +import scala.reflect.runtime.{universe => ru} + +// necessary to avoid bincompat with scala-partest compiled against the old compiler +abstract class CompilerTest extends DirectTest { + def check(source: String, unit: global.CompilationUnit): Unit + + lazy val global: Global = newCompiler() + lazy val units: List[global.CompilationUnit] = compilationUnits(global)(sources: _ *) + import global._ + import definitions.{ compilerTypeFromTag } + + override def extraSettings = "-feature -usejavacp -d " + testOutput.path + + def show() = (sources, units).zipped foreach check + + // Override at least one of these... + def code = "" + def sources: List[String] = List(code) + + // Utility functions + class MkType(sym: Symbol) { + def apply[M](implicit t: ru.TypeTag[M]): Type = + if (sym eq NoSymbol) NoType + else appliedType(sym, compilerTypeFromTag(t)) + } + implicit def mkMkType(sym: Symbol) = new MkType(sym) + + def allMembers(root: Symbol): List[Symbol] = { + def loop(seen: Set[Symbol], roots: List[Symbol]): List[Symbol] = { + val latest = roots flatMap (_.info.members) filterNot (seen contains _) + if (latest.isEmpty) seen.toList.sortWith(_ isLess _) + else loop(seen ++ latest, latest) + } + loop(Set(), List(root)) + } + + class SymsInPackage(pkgName: String) { + def pkg = rootMirror.getPackage(TermName(pkgName)) + def classes = allMembers(pkg) filter (_.isClass) + def modules = allMembers(pkg) filter (_.isModule) + def symbols = classes ++ terms filterNot (_ eq NoSymbol) + def terms = allMembers(pkg) filter (s => s.isTerm && !s.isConstructor) + def tparams = classes flatMap (_.info.typeParams) + def tpes = symbols map (_.tpe) distinct + } +} /** It's too messy but it's better than not having it. */ |