summaryrefslogtreecommitdiff
path: root/sources/scalac/transformer/UnCurry.java
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2003-09-18 10:00:06 +0000
committerMartin Odersky <odersky@gmail.com>2003-09-18 10:00:06 +0000
commitc0de8fd882c937b7d05368ce0dd5548edea7f839 (patch)
tree5c744cef4bb771689c8e81c896b337bd43199fa9 /sources/scalac/transformer/UnCurry.java
parent5b9b5356411cbd5e4de94d6c84832f99cd10b5de (diff)
downloadscala-c0de8fd882c937b7d05368ce0dd5548edea7f839.tar.gz
scala-c0de8fd882c937b7d05368ce0dd5548edea7f839.tar.bz2
scala-c0de8fd882c937b7d05368ce0dd5548edea7f839.zip
*** empty log message ***
Diffstat (limited to 'sources/scalac/transformer/UnCurry.java')
-rw-r--r--sources/scalac/transformer/UnCurry.java72
1 files changed, 49 insertions, 23 deletions
diff --git a/sources/scalac/transformer/UnCurry.java b/sources/scalac/transformer/UnCurry.java
index eb2ae2c0ce..f7d8ec796f 100644
--- a/sources/scalac/transformer/UnCurry.java
+++ b/sources/scalac/transformer/UnCurry.java
@@ -25,12 +25,18 @@ public class UnCurry extends OwnerTransformer
implements Modifiers {
UnCurryPhase descr;
+ Unit unit;
public UnCurry(Global global, UnCurryPhase descr) {
super(global);
this.descr = descr;
}
+ public void apply(Unit unit) {
+ super.apply(unit);
+ this.unit = unit;
+ }
+
/** (ps_1) ... (ps_n) => (ps_1, ..., ps_n)
*/
ValDef[][] uncurry(ValDef[][] params) {
@@ -58,6 +64,28 @@ public class UnCurry extends OwnerTransformer
}
}
+ /** apply parameterless functions and def parameters
+ */
+ Tree applyDef(Tree tree1) {
+ assert tree1.symbol() != null : tree1;
+ switch (tree1.symbol().type()) {
+ case PolyType(Symbol[] tparams, Type restp):
+ if (tparams.length == 0 && !(restp instanceof Type.MethodType)) {
+ return gen.Apply(asMethod(tree1), new Tree[0]);
+ } else {
+ return tree1;
+ }
+ default:
+ if (tree1.symbol().isDefParameter()) {
+ tree1.type = global.definitions.functionType(
+ Type.EMPTY_ARRAY, tree1.type.widen());
+ return gen.Apply(gen.Select(tree1, global.definitions.FUNCTION_APPLY(0)));
+ } else {
+ return tree1;
+ }
+ }
+ }
+
/** - uncurry all symbol and tree types (@see UnCurryPhase)
* - for every curried parameter list: (ps_1) ... (ps_n) ==> (ps_1, ..., ps_n)
* - for every curried application: f(args_1)...(args_n) ==> f(args_1, ..., args_n)
@@ -132,26 +160,18 @@ public class UnCurry extends OwnerTransformer
}
case Select(_, _):
- case Ident(_):
- if( TreeInfo.isWildcardPattern( tree ) )
+ return applyDef(super.transform(tree));
+
+ case Ident(Name name):
+ if (name == TypeNames.WILDCARD_STAR) {
+ unit.error(tree.pos, " argument does not correspond to `*'-parameter");
return tree;
- Tree tree1 = super.transform(tree);
- switch (tree1.symbol().type()) {
- case PolyType(Symbol[] tparams, Type restp):
- if (tparams.length == 0 && !(restp instanceof Type.MethodType)) {
- return gen.Apply(asMethod(tree1), new Tree[0]);
- } else {
- return tree1;
- }
- default:
- if (tree1.symbol().isDefParameter()) {
- tree1.type = global.definitions.functionType(
- Type.EMPTY_ARRAY, tree1.type.widen());
- return gen.Apply(gen.Select(tree1, global.definitions.FUNCTION_APPLY(0)));
- } else {
- return tree1;
- }
+ } else if (TreeInfo.isWildcardPattern(tree)) {
+ return tree;
+ } else {
+ return applyDef(super.transform(tree));
}
+
default:
return super.transform(tree);
}
@@ -170,13 +190,9 @@ public class UnCurry extends OwnerTransformer
switch (methtype) {
case MethodType(Symbol[] params, _):
-
if (params.length == 1 && (params[0].flags & REPEATED) != 0) {
- assert (args.length != 1 || !(args[0] instanceof Tree.Sequence));
- args = new Tree[]{make.Sequence( pos, args ).setType(params[0].type())};
-
+ args = toSequence(pos, params, args);
}
-
Tree[] args1 = args;
for (int i = 0; i < args.length; i++) {
Tree arg = args[i];
@@ -195,6 +211,16 @@ public class UnCurry extends OwnerTransformer
else throw new ApplicationError(methtype);
}
}
+ private Tree[] toSequence(int pos, Symbol[] params, Tree[] args) {
+ assert (args.length != 1 || !(args[0] instanceof Tree.Sequence));
+ if (args.length == 1) {
+ switch (args[0]) {
+ case Typed(Tree arg, Ident(TypeNames.WILDCARD_STAR)):
+ return new Tree[]{arg};
+ }
+ }
+ return new Tree[]{make.Sequence( pos, args ).setType(params[0].type())};
+ }
/** for every argument to a def parameter `def x: T':
* if argument is not a reference to a def parameter: