summaryrefslogtreecommitdiff
path: root/sources/scalac/transformer
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2003-08-25 15:26:29 +0000
committerMartin Odersky <odersky@gmail.com>2003-08-25 15:26:29 +0000
commit1cfdffddd1d0d8d71426ef6c1b43aba3e9187561 (patch)
treedff7c39b217d268626af1014bb972d90036ec031 /sources/scalac/transformer
parent4f8b58c0aed01c7a2659963ab658e5dd4239d9c4 (diff)
downloadscala-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.java33
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(_, _):