summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/typechecker/Namers.scala
diff options
context:
space:
mode:
authorLex Spoon <lex@lexspoon.org>2007-11-28 05:17:14 +0000
committerLex Spoon <lex@lexspoon.org>2007-11-28 05:17:14 +0000
commitdfda38550a2d48662fde917d26dfb8e2d6c64eee (patch)
tree0a444d414e55ef39cbb184de63ef8505a070bce5 /src/compiler/scala/tools/nsc/typechecker/Namers.scala
parent8c9e9f7b7d1de79b104d954035613e51e0acaaf2 (diff)
downloadscala-dfda38550a2d48662fde917d26dfb8e2d6c64eee.tar.gz
scala-dfda38550a2d48662fde917d26dfb8e2d6c64eee.tar.bz2
scala-dfda38550a2d48662fde917d26dfb8e2d6c64eee.zip
Merge from the annots-normtrees branch.
now use compiler trees instead of reflect trees. In many cases, annotations on types can be rewritten instead of discarded as the types undergo various operations. Also, -Yself-in-annots has been added.
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/Namers.scala')
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Namers.scala22
1 files changed, 21 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala
index 8c5020c39a..b285113ee6 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala
@@ -543,6 +543,8 @@ trait Namers { self: Analyzer =>
methodArgumentNames(meth) = vparamss.map(_.map(_.symbol));
def convertToDeBruijn(vparams: List[Symbol], level: Int): TypeMap = new TypeMap {
+ def debruijnFor(param: Symbol) =
+ DeBruijnIndex(level, vparams indexOf param)
def apply(tp: Type) = {
tp match {
case SingleType(_, sym) =>
@@ -553,7 +555,7 @@ trait Namers { self: Analyzer =>
ErrorType
} else
*/
- DeBruijnIndex(level, vparams indexOf sym)
+ debruijnFor(sym)
} else tp
case MethodType(formals, restpe) =>
val formals1 = List.mapConserve(formals)(this)
@@ -564,6 +566,24 @@ trait Namers { self: Analyzer =>
mapOver(tp)
}
}
+
+ object treeTrans extends TypeMapTransformer {
+ override def transform(tree: Tree): Tree =
+ tree match {
+ case Ident(name) if (vparams contains tree.symbol) =>
+ val dtpe = debruijnFor(tree.symbol)
+ val dsym =
+ newLocalDummy(context.owner, tree.symbol.pos)
+ .newValue(tree.symbol.pos, name)
+
+ dsym.setFlag(PARAM)
+ dsym.setInfo(dtpe)
+ Ident(name).setSymbol(dsym).copyAttrs(tree).setType(dtpe)
+ case tree => super.transform(tree)
+ }
+ }
+
+ override def mapOver(arg: Tree) = Some(treeTrans.transform(arg))
}
val checkDependencies: TypeTraverser = new TypeTraverser {