Skip to content

Commit 8ebfd48

Browse files
committed
Testing compiler asSeenFrom directly.
It's more of a "dump what it says to a file so we'll know if any of this ever changes" than a "test" per se. It could use some wheat/chaff/nonsense/sense sorting. Still, it would be great to have more stuff like this.
1 parent b27a31b commit 8ebfd48

File tree

7 files changed

+498
-18
lines changed

7 files changed

+498
-18
lines changed

src/compiler/scala/reflect/internal/Definitions.scala

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -904,13 +904,28 @@ trait Definitions extends reflect.api.StandardDefinitions {
904904
def termMember(owner: Symbol, name: String): Symbol = owner.info.member(newTermName(name))
905905
def typeMember(owner: Symbol, name: String): Symbol = owner.info.member(newTypeName(name))
906906

907+
def findMemberFromRoot(fullName: Name): Symbol = {
908+
val segs = nme.segments(fullName.toString, fullName.isTermName)
909+
if (segs.isEmpty) NoSymbol
910+
else findNamedMember(segs.tail, definitions.RootClass.info member segs.head)
911+
}
912+
def findNamedMember(fullName: Name, root: Symbol): Symbol = {
913+
val segs = nme.segments(fullName.toString, fullName.isTermName)
914+
if (segs.isEmpty || segs.head != root.simpleName) NoSymbol
915+
else findNamedMember(segs.tail, root)
916+
}
917+
def findNamedMember(segs: List[Name], root: Symbol): Symbol =
918+
if (segs.isEmpty) root
919+
else findNamedMember(segs.tail, root.info member segs.head)
920+
907921
def getMember(owner: Symbol, name: Name): Symbol = {
908922
if (owner == NoSymbol) NoSymbol
909923
else owner.info.nonPrivateMember(name) match {
910924
case NoSymbol => throw new FatalError(owner + " does not have a member " + name)
911925
case result => result
912926
}
913927
}
928+
914929
def packageExists(packageName: String): Boolean =
915930
getModuleIfDefined(packageName).isPackage
916931

src/compiler/scala/tools/nsc/Global.scala

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ class Global(var currentSettings: Settings, var reporter: Reporter) extends Symb
4444
with symtab.Positions {
4545

4646
override def settings = currentSettings
47+
48+
import definitions.{ findNamedMember, findMemberFromRoot }
4749

4850
// alternate constructors ------------------------------------------
4951

@@ -1494,21 +1496,6 @@ class Global(var currentSettings: Settings, var reporter: Reporter) extends Symb
14941496
afterPhase(phase) { currentRun.units foreach (treePrinter.print(_)) }
14951497
}
14961498

1497-
private def findMemberFromRoot(fullName: Name): Symbol = {
1498-
val segs = nme.segments(fullName.toString, fullName.isTermName)
1499-
if (segs.isEmpty) NoSymbol
1500-
else findNamedMember(segs.tail, definitions.RootClass.info member segs.head)
1501-
}
1502-
1503-
private def findNamedMember(fullName: Name, root: Symbol): Symbol = {
1504-
val segs = nme.segments(fullName.toString, fullName.isTermName)
1505-
if (segs.isEmpty || segs.head != root.simpleName) NoSymbol
1506-
else findNamedMember(segs.tail, root)
1507-
}
1508-
private def findNamedMember(segs: List[Name], root: Symbol): Symbol =
1509-
if (segs.isEmpty) root
1510-
else findNamedMember(segs.tail, root.info member segs.head)
1511-
15121499
/** We resolve the class/object ambiguity by passing a type/term name.
15131500
*/
15141501
def showDef(fullName: Name, declsOnly: Boolean, ph: Phase) = {

src/partest/scala/tools/partest/CompilerTest.scala

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,42 @@ abstract class CompilerTest extends DirectTest {
1919

2020
lazy val global: Global = newCompiler()
2121
lazy val units = compilationUnits(global)(sources: _ *)
22+
import global._
23+
import definitions._
2224

2325
override def extraSettings = "-usejavacp -d " + testOutput.path
2426

25-
def sources: List[String] = List(code)
2627
def show() = (sources, units).zipped foreach check
28+
29+
// Override at least one of these...
30+
def code = ""
31+
def sources: List[String] = List(code)
32+
33+
// Utility functions
34+
35+
class MkType(sym: Symbol) {
36+
def apply[M](implicit m1: Manifest[M]): Type =
37+
if (sym eq NoSymbol) NoType
38+
else appliedType(sym.typeConstructor, List(m1) map (x => manifestToType(x)))
39+
}
40+
implicit def mkMkType(sym: Symbol) = new MkType(sym)
41+
42+
def allMembers(root: Symbol): List[Symbol] = {
43+
def loop(seen: Set[Symbol], roots: List[Symbol]): List[Symbol] = {
44+
val latest = roots flatMap (_.info.members) filterNot (seen contains _)
45+
if (latest.isEmpty) seen.toList.sortWith(_ isLess _)
46+
else loop(seen ++ latest, latest)
47+
}
48+
loop(Set(), List(root))
49+
}
50+
51+
class SymsInPackage(pkgName: String) {
52+
def pkg = getRequiredModule(pkgName)
53+
def classes = allMembers(pkg) filter (_.isClass)
54+
def modules = allMembers(pkg) filter (_.isModule)
55+
def symbols = classes ++ terms filterNot (_ eq NoSymbol)
56+
def terms = allMembers(pkg) filter (s => s.isTerm && !s.isConstructor)
57+
def tparams = classes flatMap (_.info.typeParams)
58+
def tpes = symbols map (_.tpe) distinct
59+
}
2760
}

src/partest/scala/tools/partest/DirectTest.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ abstract class DirectTest extends App {
6969

7070
/** Constructor/main body **/
7171
try show()
72-
catch { case t => println(t) ; sys.exit(1) }
72+
catch { case t => println(t) ; t.printStackTrace ; sys.exit(1) }
7373

7474
/** Debugger interest only below this line **/
7575
protected def isDebug = (sys.props contains "partest.debug") || (sys.env contains "PARTEST_DEBUG")

0 commit comments

Comments
 (0)