summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBurak Emir <emir@epfl.ch>2006-07-12 10:52:31 +0000
committerBurak Emir <emir@epfl.ch>2006-07-12 10:52:31 +0000
commite0c336f21b47973c7f99f5ccdfde0dc04077dd70 (patch)
treefa7978a37130c4fc79228891562efc62c948f23f /src
parentac87e36fddc684ce42e574063e0ead2ee029edb6 (diff)
downloadscala-e0c336f21b47973c7f99f5ccdfde0dc04077dd70.tar.gz
scala-e0c336f21b47973c7f99f5ccdfde0dc04077dd70.tar.bz2
scala-e0c336f21b47973c7f99f5ccdfde0dc04077dd70.zip
fixed bug #647 / right ignoring patterns, added...
fixed bug #647 / right ignoring patterns, added test cases
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/matching/CodeFactory.scala2
-rw-r--r--src/compiler/scala/tools/nsc/matching/PatternMatchers.scala52
2 files changed, 30 insertions, 24 deletions
diff --git a/src/compiler/scala/tools/nsc/matching/CodeFactory.scala b/src/compiler/scala/tools/nsc/matching/CodeFactory.scala
index d879b9be47..943df9571e 100644
--- a/src/compiler/scala/tools/nsc/matching/CodeFactory.scala
+++ b/src/compiler/scala/tools/nsc/matching/CodeFactory.scala
@@ -186,7 +186,7 @@ trait CodeFactory requires TransMatcher {
*/
def Equals(left: Tree , right: Tree ): Tree = Apply(Select(left, nme.EQEQ), List(right));
- def GreaterThan(left: Tree , right: Tree ): Tree = Apply(Select(left, nme.GT), List(right));
+ def GreaterThanOrEquals(left: Tree , right: Tree ): Tree = Apply(Select(left, nme.GE), List(right));
def ThrowMatchError(pos: Int, obj: Tree ) =
atPos(pos) {
diff --git a/src/compiler/scala/tools/nsc/matching/PatternMatchers.scala b/src/compiler/scala/tools/nsc/matching/PatternMatchers.scala
index 1ff21e60eb..68c591b2e7 100644
--- a/src/compiler/scala/tools/nsc/matching/PatternMatchers.scala
+++ b/src/compiler/scala/tools/nsc/matching/PatternMatchers.scala
@@ -1037,33 +1037,39 @@ trait PatternMatchers requires (TransMatcher with PatternNodes) extends AnyRef w
case RightIgnoringSequencePat(casted, castedRest, minlen) =>
Or(
- And(
- And(gen.mkIsInstanceOf(selector.duplicate, node.getTpe()),
- GreaterThan(
- typed(
- Apply(
- Select(
- gen.mkAsInstanceOf(selector.duplicate,
- node.getTpe(),
- true),
- node.getTpe().member(nme.length) /*defs.Seq_length*/),
- List())
- ),
- typed(
- Literal(Constant(minlen))
- ))),
+ And({
+ var cond:Tree = gen.mkIsInstanceOf(selector.duplicate, node.getTpe()); // test for sequence
+
+ if(minlen > 0) { // test for minimum length if necessary
+ cond = And(cond,
+ GreaterThanOrEquals(
+ typed(
+ Apply(
+ Select(
+ gen.mkAsInstanceOf(selector.duplicate,
+ node.getTpe(),
+ true),
+ node.getTpe().member(nme.length) /*defs.Seq_length*/),
+ List())
+ ),
+ typed(
+ Literal(Constant(minlen))
+ )));
+ }
+ cond
+ },
Block(
List(
ValDef(casted,
gen.mkAsInstanceOf(selector.duplicate, node.getTpe(), true)),
- ValDef(castedRest,
- Apply(
- Select(
- Select(
- gen.mkAsInstanceOf(selector.duplicate, node.getTpe(), true),
- "toList"),
- "drop"),
- List(Literal(Constant(minlen)))))),
+ ValDef(castedRest, {
+ var res:Tree = gen.mkAsInstanceOf(selector.duplicate, node.getTpe(), true);
+ if(minlen != 0) {
+ res = Apply(Select(Select(res, "toList"), "drop"),List(Literal(Constant(minlen))))
+
+ }
+ res
+ })),
toTree(node.and))),
toTree(node.or, selector.duplicate));