summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/ast/TreeGen.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2008-05-30 18:00:25 +0000
committerMartin Odersky <odersky@gmail.com>2008-05-30 18:00:25 +0000
commit562647a37a6675fbf328f72e081a7f88913dd004 (patch)
tree36a8f00923e6991bf483af901f34ec31763111e0 /src/compiler/scala/tools/nsc/ast/TreeGen.scala
parentb6281cd5a72fa31356020fab3929c6e0f4ad578f (diff)
downloadscala-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.scala19
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);