diff options
author | Martin Odersky <odersky@gmail.com> | 2003-08-25 15:26:29 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2003-08-25 15:26:29 +0000 |
commit | 1cfdffddd1d0d8d71426ef6c1b43aba3e9187561 (patch) | |
tree | dff7c39b217d268626af1014bb972d90036ec031 /sources/scalac/transformer | |
parent | 4f8b58c0aed01c7a2659963ab658e5dd4239d9c4 (diff) | |
download | scala-1cfdffddd1d0d8d71426ef6c1b43aba3e9187561.tar.gz scala-1cfdffddd1d0d8d71426ef6c1b43aba3e9187561.tar.bz2 scala-1cfdffddd1d0d8d71426ef6c1b43aba3e9187561.zip |
*** empty log message ***
Diffstat (limited to 'sources/scalac/transformer')
-rw-r--r-- | sources/scalac/transformer/UnCurry.java | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/sources/scalac/transformer/UnCurry.java b/sources/scalac/transformer/UnCurry.java index 3d9d46c9cf..3cae85252a 100644 --- a/sources/scalac/transformer/UnCurry.java +++ b/sources/scalac/transformer/UnCurry.java @@ -16,7 +16,10 @@ import scalac.ast.*; import scalac.symtab.*; import Tree.*; import scalac.typechecker.DeSugarize ; -/** Make all functions into one-argument functions + +/** (1) Make all functions into one-argument functions + * (2) Convert `def' parameters to closures + * (3) Convert matches with non-visitor arguments to postfix applications */ public class UnCurry extends OwnerTransformer implements Modifiers { @@ -105,14 +108,26 @@ public class UnCurry extends OwnerTransformer Type ftype = fn.type; Tree fn1 = transform(fn); Tree[] args1 = transformArgs(tree.pos, args, ftype); - switch (fn1) { - case Apply(Tree fn2, Tree[] args2): - Tree[] newargs = new Tree[args1.length + args2.length]; - System.arraycopy(args2, 0, newargs, 0, args2.length); - System.arraycopy(args1, 0, newargs, args2.length, args1.length); - return copy.Apply(tree, fn2, newargs); - default: - return copy.Apply(tree, fn1, args1); + if (TreeInfo.methSymbol(fn1) == global.definitions.MATCH && + !(args1[0] instanceof Tree.Visitor)) { + switch (TreeInfo.methPart(fn1)) { + case Select(Tree qual, Name name): + assert name == Names.match; + return gen.postfixApply(qual, args1[0], currentOwner); + default: + throw new ApplicationError("illegal prefix for match: " + tree); + } + + } else { + switch (fn1) { + case Apply(Tree fn2, Tree[] args2): + Tree[] newargs = new Tree[args1.length + args2.length]; + System.arraycopy(args2, 0, newargs, 0, args2.length); + System.arraycopy(args1, 0, newargs, args2.length, args1.length); + return copy.Apply(tree, fn2, newargs); + default: + return copy.Apply(tree, fn1, args1); + } } case Select(_, _): |