diff options
author | Matthias Zenger <mzenger@gmail.com> | 2003-03-04 10:35:35 +0000 |
---|---|---|
committer | Matthias Zenger <mzenger@gmail.com> | 2003-03-04 10:35:35 +0000 |
commit | 9427388e5a5817cda5252d2e1edb13bb9dc60973 (patch) | |
tree | 9e10dc784e73557d677c0b9bc4e4f4cc13d2b228 /sources | |
parent | 9700a2088f806754bd8dd3d72b8d077f7b858079 (diff) | |
download | scala-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.java | 25 | ||||
-rw-r--r-- | sources/scalac/transformer/matching/PatternMatcher.java | 25 |
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): |