diff options
author | Martin Odersky <odersky@gmail.com> | 2008-05-30 18:00:25 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2008-05-30 18:00:25 +0000 |
commit | 562647a37a6675fbf328f72e081a7f88913dd004 (patch) | |
tree | 36a8f00923e6991bf483af901f34ec31763111e0 /src/compiler/scala/tools/nsc/ast/TreeGen.scala | |
parent | b6281cd5a72fa31356020fab3929c6e0f4ad578f (diff) | |
download | scala-562647a37a6675fbf328f72e081a7f88913dd004.tar.gz scala-562647a37a6675fbf328f72e081a7f88913dd004.tar.bz2 scala-562647a37a6675fbf328f72e081a7f88913dd004.zip |
fixed #807. More stuff for virtual classes.
Diffstat (limited to 'src/compiler/scala/tools/nsc/ast/TreeGen.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/ast/TreeGen.scala | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/compiler/scala/tools/nsc/ast/TreeGen.scala b/src/compiler/scala/tools/nsc/ast/TreeGen.scala index 7a335a6c93..734921eac6 100644 --- a/src/compiler/scala/tools/nsc/ast/TreeGen.scala +++ b/src/compiler/scala/tools/nsc/ast/TreeGen.scala @@ -282,6 +282,25 @@ abstract class TreeGen { def mkSynchronized(monitor: Tree, body: Tree): Tree = Apply(Select(monitor, definitions.Object_synchronized), List(body)) + def wildcardStar(tree: Tree) = + atPos(tree.pos) { Typed(tree, Ident(nme.WILDCARD_STAR.toTypeName)) } + + def paramToArg(vparam: Symbol) = { + val arg = Ident(vparam) + if (vparam.tpe.typeSymbol == RepeatedParamClass) wildcardStar(arg) + else arg + } + + def paramToArg(vparam: ValDef) = { + val arg = Ident(vparam.name) + if (treeInfo.isRepeatedParamType(vparam.tpt)) wildcardStar(arg) + else arg + } + + /** Make forwarder to method `target', passing all parameters in `params' */ + def mkForwarder(target: Tree, vparamss: List[List[Symbol]]) = + (target /: vparamss)((fn, vparams) => Apply(fn, vparams map paramToArg)) + def evalOnce(expr: Tree, owner: Symbol, unit: CompilationUnit)(within: (() => Tree) => Tree): Tree = if (treeInfo.isPureExpr(expr)) { within(() => expr); |