summaryrefslogtreecommitdiff
path: root/sources/scalac/typechecker
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2003-11-28 18:28:10 +0000
committerMartin Odersky <odersky@gmail.com>2003-11-28 18:28:10 +0000
commitee3559b8bd67e39638dd93e1dc832a210c2ac374 (patch)
treef1b0e56d241894a873b3b8020feb02b093eb9bfc /sources/scalac/typechecker
parentdaea8b76a5f9dd35e54f4d524691187850202182 (diff)
downloadscala-ee3559b8bd67e39638dd93e1dc832a210c2ac374.tar.gz
scala-ee3559b8bd67e39638dd93e1dc832a210c2ac374.tar.bz2
scala-ee3559b8bd67e39638dd93e1dc832a210c2ac374.zip
*** empty log message ***
Diffstat (limited to 'sources/scalac/typechecker')
-rw-r--r--sources/scalac/typechecker/Analyzer.java14
-rw-r--r--sources/scalac/typechecker/Infer.java21
2 files changed, 24 insertions, 11 deletions
diff --git a/sources/scalac/typechecker/Analyzer.java b/sources/scalac/typechecker/Analyzer.java
index b11f3ac85a..3457499228 100644
--- a/sources/scalac/typechecker/Analyzer.java
+++ b/sources/scalac/typechecker/Analyzer.java
@@ -917,9 +917,9 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
enterSym(params[i]);
switch (params[i]) {
case ValDef(int mods, _, _, _):
- if ((mods & REPEATED) != 0 && params.length > 1)
+ if ((mods & REPEATED) != 0 && i != params.length - 1)
error(params[i].pos,
- "`*' parameter must be the only parameter of a `('...`)' section");
+ "`*' parameter must be the last parameter of a `('...`)' section");
}
}
return Tree.symbolOf(params);
@@ -1782,11 +1782,13 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
}
}
// desugarizing ident patterns
- if (params.length == 1 && (params[0].flags & REPEATED) != 0) {
+ if (params.length > 0 &&
+ (params[params.length - 1].flags & REPEATED) != 0) {
if (( mode & PATTERNmode ) != 0 ) {
desug_allIdentPatterns( args, context.owner );
} else {
- assert (args.length != 1 || !(args[0] instanceof Tree.Sequence));
+ assert (args.length != params.length ||
+ !(args[params.length-1] instanceof Tree.Sequence));
}
}
return argtypes;
@@ -2392,7 +2394,9 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
switch (alttp) {
case MethodType(Symbol[] params, _):
if (params.length == args.length ||
- params.length == 1 && (params[0].flags & REPEATED) != 0) {
+ params.length > 0 &&
+ args.length >= params.length - 1 &&
+ (params[params.length-1].flags & REPEATED) != 0) {
matching2 = matching1;
matching1 = i;
}
diff --git a/sources/scalac/typechecker/Infer.java b/sources/scalac/typechecker/Infer.java
index ea6cb4ddc4..b2b38ef2da 100644
--- a/sources/scalac/typechecker/Infer.java
+++ b/sources/scalac/typechecker/Infer.java
@@ -333,15 +333,24 @@ public class Infer implements Modifiers, Kinds {
* If `params' is a repeated parameter, a list of `length' copies
* of its type is returned.
*/
- public Type[] formalTypes(Symbol[] params, int length) {
+ public Type[] formalTypes(Symbol[] params, int nargs) {
Type[] result;
- if (params.length == 1 && (params[0].flags & REPEATED) != 0) {
- Type[] formals = new Type[length];
- Type[] args = params[0].type().typeArgs();
+ if (params.length > 0 &&
+ (params[params.length-1].flags & REPEATED) != 0) {
+ Type[] args = params[params.length-1].type().typeArgs();
if (args.length == 1) {
Type ft = args[0];
- // params[0] has type Seq[T], we need T here
- for (int i = 0; i < length; i++) formals[i] = ft;
+ // last param has type Seq[T], we need T here
+ Type[] formals = new Type[nargs];
+ int i = 0;
+ while (i < params.length-1) {
+ formals[i] = params[i].type();
+ i++;
+ }
+ while (i < nargs) {
+ formals[i] = ft;
+ i++;
+ }
return formals;
}
}