diff options
author | Lex Spoon <lex@lexspoon.org> | 2007-11-28 05:17:14 +0000 |
---|---|---|
committer | Lex Spoon <lex@lexspoon.org> | 2007-11-28 05:17:14 +0000 |
commit | dfda38550a2d48662fde917d26dfb8e2d6c64eee (patch) | |
tree | 0a444d414e55ef39cbb184de63ef8505a070bce5 /src/compiler/scala/tools/nsc/typechecker/Namers.scala | |
parent | 8c9e9f7b7d1de79b104d954035613e51e0acaaf2 (diff) | |
download | scala-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.scala | 22 |
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 { |