summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2006-09-08 13:47:27 +0000
committerMartin Odersky <odersky@gmail.com>2006-09-08 13:47:27 +0000
commit3d449d9f663913369ae0a0345d85cd755000f029 (patch)
treee1b82ddf14d0af1c5c212f16df363d27c8083fb6
parent97980ef3220ba1c32159e907586705b613e1ff60 (diff)
downloadscala-3d449d9f663913369ae0a0345d85cd755000f029.tar.gz
scala-3d449d9f663913369ae0a0345d85cd755000f029.tar.bz2
scala-3d449d9f663913369ae0a0345d85cd755000f029.zip
rebuild checkers (not there yet)
-rw-r--r--src/compiler/scala/tools/nsc/ast/Trees.scala11
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Symbols.scala26
-rw-r--r--src/compiler/scala/tools/nsc/transform/Mixin.scala5
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/TreeCheckers.scala15
4 files changed, 41 insertions, 16 deletions
diff --git a/src/compiler/scala/tools/nsc/ast/Trees.scala b/src/compiler/scala/tools/nsc/ast/Trees.scala
index 276150d7a5..4a4e5dffbe 100644
--- a/src/compiler/scala/tools/nsc/ast/Trees.scala
+++ b/src/compiler/scala/tools/nsc/ast/Trees.scala
@@ -941,6 +941,9 @@ trait Trees requires Global {
abstract class Transformer {
val copy: TreeCopier = new LazyTreeCopier;
protected var currentOwner: Symbol = definitions.RootClass;
+ protected def currentMethod = currentOwner.enclMethod
+ protected def currentClass = currentOwner.enclClass
+ protected def currentPackage = currentOwner.toplevelClass.owner
def transform(tree: Tree): Tree = tree match {
case EmptyTree =>
tree
@@ -999,7 +1002,9 @@ trait Trees requires Global {
case ArrayValue(elemtpt, trees) =>
copy.ArrayValue(tree, transform(elemtpt), transformTrees(trees))
case Function(vparams, body) =>
- copy.Function(tree, transformValDefs(vparams), transform(body))
+ atOwner(tree.symbol) {
+ copy.Function(tree, transformValDefs(vparams), transform(body))
+ }
case Assign(lhs, rhs) =>
copy.Assign(tree, transform(lhs), transform(rhs))
case If(cond, thenp, elsep) =>
@@ -1129,7 +1134,9 @@ trait Trees requires Global {
case ArrayValue(elemtpt, trees) =>
traverse(elemtpt); traverseTrees(trees)
case Function(vparams, body) =>
- traverseTrees(vparams); traverse(body)
+ atOwner(tree.symbol) {
+ traverseTrees(vparams); traverse(body)
+ }
case Assign(lhs, rhs) =>
traverse(lhs); traverse(rhs)
case If(cond, thenp, elsep) =>
diff --git a/src/compiler/scala/tools/nsc/symtab/Symbols.scala b/src/compiler/scala/tools/nsc/symtab/Symbols.scala
index 6f7dd3eece..7784bd24b8 100644
--- a/src/compiler/scala/tools/nsc/symtab/Symbols.scala
+++ b/src/compiler/scala/tools/nsc/symtab/Symbols.scala
@@ -306,7 +306,11 @@ trait Symbols requires SymbolTable {
// Flags, owner, and name attributes --------------------------------------------------------------
- def owner: Symbol = rawowner
+ def owner: Symbol = {
+ val r = rawowner
+ if ((r.rawflags & IMPLCLASS) != 0 && !phase.next.erasedTypes) r.toInterface
+ else r
+ }
final def owner_=(owner: Symbol): unit = { rawowner = owner }
def ownerChain: List[Symbol] = this :: owner.ownerChain
@@ -616,6 +620,18 @@ trait Symbols requires SymbolTable {
* is an alias, NoSymbol for all others */
def alias: Symbol = NoSymbol
+ /** The superclass of this class */
+ def superClass: Symbol = if (info.parents.isEmpty) NoSymbol else info.parents.head.symbol
+
+ /** The directly or indirectly inherited mixins of this class
+ * except for mixin classes inherited by the superclass. Mixin classes appear
+ * in linearlization order.
+ */
+ def mixinClasses: List[Symbol] = {
+ val sc = superClass
+ info.baseClasses.tail.takeWhile(sc ne)
+ }
+
/** The top-level class containing this symbol */
def toplevelClass: Symbol =
if (isClass && owner.isPackageClass) this else owner.toplevelClass
@@ -762,6 +778,8 @@ trait Symbols requires SymbolTable {
if (isType) name = name.toTypeName
}
+ /** The expanded name of `name' relative to this class as base
+ */
def expandedName(name: Name): Name =
newTermName(fullNameString('$') + nme.EXPAND_SEPARATOR_STRING + name)
@@ -914,12 +932,6 @@ trait Symbols requires SymbolTable {
privateWithin = NoSymbol
- override def owner: Symbol = {
- if (name == nme.MIXIN_CONSTRUCTOR && !phase.erasedTypes && super.owner.isImplClass)
- super.owner.toInterface
- else rawowner
- }
-
protected var referenced: Symbol = NoSymbol
def cloneSymbolImpl(owner: Symbol): Symbol = {
diff --git a/src/compiler/scala/tools/nsc/transform/Mixin.scala b/src/compiler/scala/tools/nsc/transform/Mixin.scala
index 1c3f81aed1..167f4959e3 100644
--- a/src/compiler/scala/tools/nsc/transform/Mixin.scala
+++ b/src/compiler/scala/tools/nsc/transform/Mixin.scala
@@ -171,13 +171,12 @@ abstract class Mixin extends InfoTransform {
assert(phase == currentRun.mixinPhase)
// first complete the superclass with mixed in members
- val superclazz = clazz.info.parents.head.symbol
- addMixedinMembers(superclazz)
+ addMixedinMembers(clazz.superClass)
//System.out.println("adding members of " + clazz.info.baseClasses.tail.takeWhile(superclazz !=) + " to " + clazz);//DEBUG
// Mix in all traits that are not inherited by the superclass
- val mixins = clazz.info.baseClasses.tail.takeWhile(superclazz !=)
+ val mixins = clazz.mixinClasses
/** Mix in members of class mixinClass into class clazz */
def mixinMembers(mixinClass: Symbol): unit = {
diff --git a/src/compiler/scala/tools/nsc/typechecker/TreeCheckers.scala b/src/compiler/scala/tools/nsc/typechecker/TreeCheckers.scala
index 2d00a9d5ea..f198881d7e 100644
--- a/src/compiler/scala/tools/nsc/typechecker/TreeCheckers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/TreeCheckers.scala
@@ -22,9 +22,10 @@ abstract class TreeCheckers extends Analyzer {
}
def check(unit: CompilationUnit): unit = {
- val areporter =
- if (reporter.isInstanceOf[AbstractReporter]) reporter.asInstanceOf[AbstractReporter]
- else null
+ val areporter = reporter match {
+ case ar: AbstractReporter => ar
+ case _ => null
+ }
val curPrompt = if (areporter != null) {
val ret = areporter.prompt
@@ -36,9 +37,16 @@ abstract class TreeCheckers extends Analyzer {
context.checking = true
tpeOfTree.clear
val checker = new TreeChecker(context)
+
+ val unit0 = currentRun.currentUnit
+ currentRun.currentUnit = unit
checker.precheck.traverse(unit.body)
checker.typed(unit.body)
checker.postcheck.traverse(unit.body)
+ currentRun.advanceUnit
+ assert(currentRun.currentUnit == unit)
+ currentRun.currentUnit = unit0
+
if (areporter != null)
areporter.prompt = curPrompt
}
@@ -65,7 +73,6 @@ abstract class TreeCheckers extends Analyzer {
}
tree
}
- override def typed(tree: Tree) = super.typed(tree) // TODO: remove for new compiler
object precheck extends Traverser {
override def traverse(tree: Tree): unit =