diff options
author | Burak Emir <emir@epfl.ch> | 2006-07-12 10:52:31 +0000 |
---|---|---|
committer | Burak Emir <emir@epfl.ch> | 2006-07-12 10:52:31 +0000 |
commit | e0c336f21b47973c7f99f5ccdfde0dc04077dd70 (patch) | |
tree | fa7978a37130c4fc79228891562efc62c948f23f /src | |
parent | ac87e36fddc684ce42e574063e0ead2ee029edb6 (diff) | |
download | scala-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.scala | 2 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/matching/PatternMatchers.scala | 52 |
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)); |