summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2010-10-05 02:59:06 +0000
committerPaul Phillips <paulp@improving.org>2010-10-05 02:59:06 +0000
commit4afd17d6d309ba1d64979ee9078edebc5d8e035e (patch)
tree1eeeb455d8a54c95c5821649a2fec7ef321a9943 /src
parent74a0c96db07a3bef246bcc197cbe545b2a1eeee7 (diff)
downloadscala-4afd17d6d309ba1d64979ee9078edebc5d8e035e.tar.gz
scala-4afd17d6d309ba1d64979ee9078edebc5d8e035e.tar.bz2
scala-4afd17d6d309ba1d64979ee9078edebc5d8e035e.zip
Massively simplified the exhaustiveness checker...
Massively simplified the exhaustiveness checker with no measurable loss of fidelity. I might be the only one who can be unsurprised by such a bloody diff: anyone else would rightly say "how on earth..." No review.
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/matching/MatrixAdditions.scala27
1 files changed, 3 insertions, 24 deletions
diff --git a/src/compiler/scala/tools/nsc/matching/MatrixAdditions.scala b/src/compiler/scala/tools/nsc/matching/MatrixAdditions.scala
index fbfe00d2c1..e2d26abf1f 100644
--- a/src/compiler/scala/tools/nsc/matching/MatrixAdditions.scala
+++ b/src/compiler/scala/tools/nsc/matching/MatrixAdditions.scala
@@ -155,32 +155,11 @@ trait MatrixAdditions extends ast.TreeDSL
import Flags.{ MUTABLE, ABSTRACT, SEALED, TRANS_FLAG }
private case class Combo(index: Int, sym: Symbol) {
+ val isBaseClass = sym.tpe.baseClasses.toSet
+
// is this combination covered by the given pattern?
def isCovered(p: Pattern) = {
- def cmpSymbols(t1: Type, t2: Type) = t1.typeSymbol eq t2.typeSymbol
- def coversSym = {
- val tpe = decodedEqualsType(p.tpe)
- lazy val lmoc = sym.companionModule
- val symtpe =
- if ((sym hasFlag Flags.MODULE) && (lmoc ne NoSymbol))
- singleType(sym.tpe.prefix, lmoc) // e.g. None, Nil
- else sym.tpe
-
- /** Note to Martin should you come through this way: this
- * logic looks way overcomplicated for the intention, but a little
- * experimentation showed that at least most of it is serving
- * some necessary purpose. It doesn't seem like much more than
- * "sym.tpe matchesPattern tpe" ought to be necessary though.
- *
- * For the time being I tacked the matchesPattern test onto the
- * end to address #3097.
- */
- (tpe.typeSymbol == sym) ||
- (symtpe <:< tpe) ||
- (symtpe.parents exists (x => cmpSymbols(x, tpe))) || // e.g. Some[Int] <: Option[&b]
- ((tpe.prefix memberType sym) <:< tpe) || // outer, see combinator.lexical.Scanner
- (symtpe matchesPattern tpe)
- }
+ def coversSym = isBaseClass(decodedEqualsType(p.tpe).typeSymbol)
cond(p.tree) {
case _: UnApply | _: ArrayValue => true