summaryrefslogtreecommitdiff
path: root/sources
diff options
context:
space:
mode:
authorMatthias Zenger <mzenger@gmail.com>2003-03-04 10:35:35 +0000
committerMatthias Zenger <mzenger@gmail.com>2003-03-04 10:35:35 +0000
commit9427388e5a5817cda5252d2e1edb13bb9dc60973 (patch)
tree9e10dc784e73557d677c0b9bc4e4f4cc13d2b228 /sources
parent9700a2088f806754bd8dd3d72b8d077f7b858079 (diff)
downloadscala-9427388e5a5817cda5252d2e1edb13bb9dc60973.tar.gz
scala-9427388e5a5817cda5252d2e1edb13bb9dc60973.tar.bz2
scala-9427388e5a5817cda5252d2e1edb13bb9dc60973.zip
* fixed a bug with sequence patterns of differe...
* fixed a bug with sequence patterns of different lengths
Diffstat (limited to 'sources')
-rw-r--r--sources/scalac/transformer/PatternMatcher.java25
-rw-r--r--sources/scalac/transformer/matching/PatternMatcher.java25
2 files changed, 20 insertions, 30 deletions
diff --git a/sources/scalac/transformer/PatternMatcher.java b/sources/scalac/transformer/PatternMatcher.java
index 4dfe5f3de6..44304292ed 100644
--- a/sources/scalac/transformer/PatternMatcher.java
+++ b/sources/scalac/transformer/PatternMatcher.java
@@ -692,11 +692,7 @@ public class PatternMatcher {
toTree(node.or, selector)).setType(defs.BOOLEAN_TYPE);
case SequencePat(Symbol casted, int len):
Symbol lenSym = casted.type().lookup(LENGTH_N);
- Tree t = make.Select(selector.pos,
- make.Ident(selector.pos, casted.name)
- .setSymbol(casted)
- .setType(node.type),
- LENGTH_N);
+ Tree t = make.Select(selector.pos, mkAs(selector, node.type), LENGTH_N);
switch (typeOf(lenSym)) {
case OverloadedType(Symbol[] alts, Type[] alttypes):
infer.methodAlternative(t, alts, alttypes, new Type[0], defs.INT_TYPE);
@@ -707,7 +703,14 @@ public class PatternMatcher {
}
return make.If(
selector.pos,
- mkIs(selector, node.type),
+ mkAnd(
+ mkIs(selector, node.type),
+ mkEquals(
+ make.Apply(
+ selector.pos, t,
+ Tree.EMPTY_ARRAY).setType(defs.INT_TYPE),
+ make.Literal(selector.pos, new Integer(len))
+ .setType(defs.INT_TYPE))),
mkBlock(selector.pos,
new Tree[]{
make.ValDef(selector.pos,
@@ -716,15 +719,7 @@ public class PatternMatcher {
gen.mkType(selector.pos, node.type),
mkAs(selector, node.type))
.setType(defs.UNIT_TYPE).setSymbol(casted),
- mkAnd(
- mkEquals(
- make.Apply(
- selector.pos, t,
- Tree.EMPTY_ARRAY)
- .setType(defs.INT_TYPE),
- make.Literal(selector.pos, new Integer(len))
- .setType(defs.INT_TYPE)),
- toTree(node.and))}, defs.BOOLEAN_TYPE),
+ toTree(node.and)}, defs.BOOLEAN_TYPE),
toTree(node.or, selector))
.setType(defs.BOOLEAN_TYPE);
case ConstantPat(Object value):
diff --git a/sources/scalac/transformer/matching/PatternMatcher.java b/sources/scalac/transformer/matching/PatternMatcher.java
index 4dfe5f3de6..44304292ed 100644
--- a/sources/scalac/transformer/matching/PatternMatcher.java
+++ b/sources/scalac/transformer/matching/PatternMatcher.java
@@ -692,11 +692,7 @@ public class PatternMatcher {
toTree(node.or, selector)).setType(defs.BOOLEAN_TYPE);
case SequencePat(Symbol casted, int len):
Symbol lenSym = casted.type().lookup(LENGTH_N);
- Tree t = make.Select(selector.pos,
- make.Ident(selector.pos, casted.name)
- .setSymbol(casted)
- .setType(node.type),
- LENGTH_N);
+ Tree t = make.Select(selector.pos, mkAs(selector, node.type), LENGTH_N);
switch (typeOf(lenSym)) {
case OverloadedType(Symbol[] alts, Type[] alttypes):
infer.methodAlternative(t, alts, alttypes, new Type[0], defs.INT_TYPE);
@@ -707,7 +703,14 @@ public class PatternMatcher {
}
return make.If(
selector.pos,
- mkIs(selector, node.type),
+ mkAnd(
+ mkIs(selector, node.type),
+ mkEquals(
+ make.Apply(
+ selector.pos, t,
+ Tree.EMPTY_ARRAY).setType(defs.INT_TYPE),
+ make.Literal(selector.pos, new Integer(len))
+ .setType(defs.INT_TYPE))),
mkBlock(selector.pos,
new Tree[]{
make.ValDef(selector.pos,
@@ -716,15 +719,7 @@ public class PatternMatcher {
gen.mkType(selector.pos, node.type),
mkAs(selector, node.type))
.setType(defs.UNIT_TYPE).setSymbol(casted),
- mkAnd(
- mkEquals(
- make.Apply(
- selector.pos, t,
- Tree.EMPTY_ARRAY)
- .setType(defs.INT_TYPE),
- make.Literal(selector.pos, new Integer(len))
- .setType(defs.INT_TYPE)),
- toTree(node.and))}, defs.BOOLEAN_TYPE),
+ toTree(node.and)}, defs.BOOLEAN_TYPE),
toTree(node.or, selector))
.setType(defs.BOOLEAN_TYPE);
case ConstantPat(Object value):