diff options
author | Burak Emir <emir@epfl.ch> | 2006-07-12 12:23:42 +0000 |
---|---|---|
committer | Burak Emir <emir@epfl.ch> | 2006-07-12 12:23:42 +0000 |
commit | b53dced1215bffa82ae3f4aa38f614e4a0f48a7d (patch) | |
tree | 088a69bfcb55988b9bd980cef71f660566d9eba2 | |
parent | e4fc9bd2fc3f14e603ff9000fde78fef021c1090 (diff) | |
download | scala-b53dced1215bffa82ae3f4aa38f614e4a0f48a7d.tar.gz scala-b53dced1215bffa82ae3f4aa38f614e4a0f48a7d.tar.bz2 scala-b53dced1215bffa82ae3f4aa38f614e4a0f48a7d.zip |
fixed bug #654 and removed generation of an unn...
fixed bug #654 and removed generation of an unnecessary duplicate cast
-rw-r--r-- | src/compiler/scala/tools/nsc/matching/PatternMatchers.scala | 2 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/matching/TransMatcher.scala | 7 | ||||
-rw-r--r-- | test/files/run/regularpatmatnew.scala | 33 |
3 files changed, 35 insertions, 7 deletions
diff --git a/src/compiler/scala/tools/nsc/matching/PatternMatchers.scala b/src/compiler/scala/tools/nsc/matching/PatternMatchers.scala index 68c591b2e7..cee49c7df5 100644 --- a/src/compiler/scala/tools/nsc/matching/PatternMatchers.scala +++ b/src/compiler/scala/tools/nsc/matching/PatternMatchers.scala @@ -1063,7 +1063,7 @@ trait PatternMatchers requires (TransMatcher with PatternNodes) extends AnyRef w ValDef(casted, gen.mkAsInstanceOf(selector.duplicate, node.getTpe(), true)), ValDef(castedRest, { - var res:Tree = gen.mkAsInstanceOf(selector.duplicate, node.getTpe(), true); + var res:Tree = Ident(casted) // gen.mkAsInstanceOf(selector.duplicate, node.getTpe(), true); if(minlen != 0) { res = Apply(Select(Select(res, "toList"), "drop"),List(Literal(Constant(minlen)))) diff --git a/src/compiler/scala/tools/nsc/matching/TransMatcher.scala b/src/compiler/scala/tools/nsc/matching/TransMatcher.scala index 0ad9b4ff80..4d85f50772 100644 --- a/src/compiler/scala/tools/nsc/matching/TransMatcher.scala +++ b/src/compiler/scala/tools/nsc/matching/TransMatcher.scala @@ -219,11 +219,14 @@ with RightTracers { //case ArrayValue( tt, List(b @ Bind(id, Star(wc @ Ident(nme.WILDCARD))))) => - case Apply(fn, List(pat2, ArrayValue( tt, List(b @ Bind(id, Star(wc @ Ident(nme.WILDCARD))))))) => + case Apply(fn, List(pat2@ ArrayValue( tt, List(b @ Bind(id, Star(wc @ Ident(nme.WILDCARD))))))) => //Console.println("OPTIMIZING") //Console.println(pat) //Console.println(pat.tpe) - //Console.println(b.tpe) + //Console.println(tt.tpe) + //Console.println("b.tpe "+b.tpe+" widened"+b.tpe.widen) + //Console.println("b.symbol.tpe "+b.symbol.tpe+" widened"+b.symbol.tpe.widen) + //Console.println("pat2.tpe "+pat2.tpe+" widened"+pat2.tpe.widen) val tpe1:Type = pat2.tpe.widen.baseType( definitions.SeqClass ).typeArgs(0) val tpe = appliedType(definitions.SeqClass.typeConstructor, List(tpe1)) diff --git a/test/files/run/regularpatmatnew.scala b/test/files/run/regularpatmatnew.scala index af2dd65d2e..444b36e32f 100644 --- a/test/files/run/regularpatmatnew.scala +++ b/test/files/run/regularpatmatnew.scala @@ -7,7 +7,8 @@ object Test { new Test01, new Test02, - new Test03 + new Test03, + new Test04 ).run(tr) @@ -15,7 +16,7 @@ object Test { Console println f } - class Test01 extends TestCase("numero uno (all ignoring patterns on List)") { + class Test01 extends TestCase("uno (all ignoring patterns on List)") { def doMatch(l:List[String]):String = l match { case List(_*) => "ok" } @@ -40,7 +41,7 @@ object Test { } */ - class Test02 extends TestCase("numero due (all ignoring patterns on Seq)") { + class Test02 extends TestCase("due (all ignoring patterns on Seq)") { def doMatch(l:Seq[String]):String = l match { case Seq(_*) => "ok" } @@ -56,7 +57,7 @@ object Test { } } - class Test03 extends TestCase("numero tre (right-ignoring patterns on List, defaults)") { + class Test03 extends TestCase("tre (right-ignoring patterns on List, defaults)") { def doMatch(l:List[String]):String = l match { case List(_,_,_,_*) => "ok" case _ => "not ok" @@ -71,4 +72,28 @@ object Test { } } + + class Test04 extends TestCase("quattro (all- and right-ignoring pattern on case class w/ seq param)") { + case class Foo(i: Int, chars: Char*) + + override def runTest() = { + val a = Foo(0, 'a') match { + case Foo(i, c, chars @ _*) => + c + case _ => + null + } + assertEquals(a,'a') + + val b = Foo(0, 'a') match { + case Foo(i, chars @ _*) => + 'b' + case _ => + null + } + assertEquals(b,'b') + } + } + + } |