diff options
author | Martin Odersky <odersky@gmail.com> | 2003-09-18 10:00:06 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2003-09-18 10:00:06 +0000 |
commit | c0de8fd882c937b7d05368ce0dd5548edea7f839 (patch) | |
tree | 5c744cef4bb771689c8e81c896b337bd43199fa9 /sources/scalac/transformer/UnCurry.java | |
parent | 5b9b5356411cbd5e4de94d6c84832f99cd10b5de (diff) | |
download | scala-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.java | 72 |
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: |