diff options
author | Martin Odersky <odersky@gmail.com> | 2006-09-08 13:47:27 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2006-09-08 13:47:27 +0000 |
commit | 3d449d9f663913369ae0a0345d85cd755000f029 (patch) | |
tree | e1b82ddf14d0af1c5c212f16df363d27c8083fb6 | |
parent | 97980ef3220ba1c32159e907586705b613e1ff60 (diff) | |
download | scala-3d449d9f663913369ae0a0345d85cd755000f029.tar.gz scala-3d449d9f663913369ae0a0345d85cd755000f029.tar.bz2 scala-3d449d9f663913369ae0a0345d85cd755000f029.zip |
rebuild checkers (not there yet)
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 = |